用kubeadm+cvm+clb搭建3个master的集群
前言
首先需要购买3个cvm和1个clb,示例如下:
代码语言:bash复制CLBVIP=10.0.1.10
NODE1=10.0.1.11
NODE2=10.0.1.12
NODE3=10.0.1.13
机器初始化
hostname
建议用hostnamectl设置一下机器名以便查看(默认是vm-xx-xx),以其中一个为例
代码语言:bash复制hostnamectl set-hostname k8s-node1
echo "127.0.0.1 k8s-node1" >> /etc/hosts
ip_forward
forward是容器网络必须的
代码语言:bash复制echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
安装组件
用腾讯云的镜像源,安装k8s组件,注意此时不要启动kubelet
代码语言:bash复制cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repository
baseurl=/
enable=1
gpgcheck=0
EOF
yum install -y kubelet kubeadm kubectl iproute-tc
systemctl enable kubelet
安装运行时,并配置pause镜像地址(默认是registry.k8s.io)和docker.io代理地址
代码语言:bash复制yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
sed -i 's#registry.k8s.io/pause:3.6#ccrs.tencentyun/library/pause:latest#' /etc/containerd/config.toml
sed -i 's#\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors\]#[plugins."io.containerd.grpc.v1.cri".registry.mirrors]\n [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n endpoint = [";]#g' /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd
cat << EOF > /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
EOF
crictl version # 确认containerd启动成功
部署集群
确认信息
示例预期如下:
集群版本:v1.28.1
镜像仓库:ccrs.tencentyun/k8s-qc
pod网段:172.21.0.0/16
service网段:172.22.0.0/16
apiserver负载均衡:10.0.1.10
准备镜像
查看和拉取镜像,事先放到ccr镜像仓库是为了提升拉取速率
代码语言:bash复制kubeadm config images list --image-repository="ccrs.tencentyun/k8s-qc" --kubernetes-version=v1.28.1
kubeadm config images pull --image-repository="ccrs.tencentyun/k8s-qc" --kubernetes-version=v1.28.1
crictl images # 确认镜像拉取成功
可用另一台安装了docker的cvm按如下步骤推送至ccr仓库,以其中一个为例:
代码语言:bash复制docker pull registry.k8s.io/kube-proxy:v1.28.1
docker tag registry.k8s.io/kube-proxy:v1.28.1 ccrs.tencentyun/k8s-qc/kube-proxy:v1.28.1
docker push ccrs.tencentyun/k8s-qc/kube-proxy:v1.28.1
其中coredns有点特殊,原始镜像多一层,但转至ccr时不需要多一层:
代码语言:bash复制docker pull registry.k8s.io/coredns/coredns
docker tag registry.k8s.io/coredns/coredns ccrs.tencentyun/k8s-qc/coredns:v1.10.1
docker push ccrs.tencentyun/k8s-qc/coredns:v1.10.1
部署首个master
由于clb透传源ip,在源目同ip场景下存在回环问题,因此首个master通过iptables规则来绕过
代码语言:bash复制iptables -t nat -I OUTPUT -p tcp -m tcp -d 10.0.1.10 --dport 6443 -j DNAT --to-destination `hostname -I | awk '{print $1}'`:6443
在3个master节点都完成后,可以用如下命令删除:
代码语言:bash复制iptables -t nat -D OUTPUT -p tcp -m tcp -d 10.0.1.10 --dport 6443 -j DNAT --to-destination `hostname -I | awk '{print $1}'`:6443
用kubeadm命令初始化,需要较长时间,耐心等待完成即可。
注:若不确定参数是否OK,可以用--dry-run参数,直到参数没问题。
代码语言:bash复制kubeadm init --kubernetes-version=v1.28.1 --image-repository="ccrs.tencentyun/k8s-qc" --pod-network-cidr=172.21.0.0/16 --service-cidr=172.22.0.0/16 --control-plane-endpoint=10.0.1.10:6443 --upload-certs
完成后拷贝一份kubeconfig用于kubectl命令使用,并确认node和pod都有了
代码语言:bash复制mkdir ~/.kube && cp /etc/kubernetes/admin.conf ~/.kube/config
kubectl get node
kubectl get pod -A
加入其他master
在部署首个master后,会提供一个kubeadm join命令,如果没记下来,可用如下命令再次获取,默认24h内有用。此命令可直接用于worker节点注册到集群中。
代码语言:bash复制kubeadm token create --print-join-command
此外,也可分别获取kubeadm join所需的 --token 和 --discovery-token-ca-cert-hash 参数值,从而拼凑出一个添加worker节点的命令:
代码语言:bash复制kubeadm token list # 得到--token,记为$TOKEN
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # 得到--discovery-token-ca-cert-hash,记为$DISCOVERY-HASH
kubeadm join 10.0.1.10:6443 --token $TOKEN --discovery-token-ca-cert-hash sha256:$DISCOVERY-HASH
而对于添加master节点,还需要在添加worker节点命令的基础上,增加 --control-plane 和 --certificate-key 这两个参数:
代码语言:bash复制kubeadm init phase upload-certs --upload-certs # 得到--certificate-key,记为$CERTIFICATE-KEY
kubeadm join 10.0.1.10:6443 --token $TOKEN --discovery-token-ca-cert-hash sha256:$DISCOVERY-HASH --control-plane --certificate-key $CERTIFICATE-KEY
完成后拷贝一份kubeconfig用于kubectl命令使用,并确认node和pod都有了
代码语言:bash复制mkdir ~/.kube && cp /etc/kubernetes/admin.conf ~/.kube/config
kubectl get node
kubectl get pod -A
关于etcd
etcd用启动参数--initial-cluster控制初始化,但在初始化完成后可以不管,如果一定要改,可以改成这样:
代码语言:bash复制--initial-cluster=k8s-node1=:2380,k8s-node2=:2380,k8s-node3=:2380
当修改首个启动的etcd时可能由于主从切换导致抖动。可通过etcdctl命令查看主,“IS LEADER”列为“true”:
代码语言:bash复制etcdctl -w table --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints https://127.0.0.1:2379 endpoint status --cluster
部署服务
安装容器网络插件
在部署master后,还需要安装容器网络插件(CNI),这里以flannel为例,要修改pod cidr,默认是10.244.0.0/16,换成自定义的
代码语言:bash复制wget .yml
sed -i 's#10.244.0.0/16#172.21.0.0/16#g' kube-flannel.yml
kubectl apply -f kube-flannel.yml
部署nginx
用kubectl创建一个deployment
代码语言:bash复制kubectl create deployment nginx --image="nginx"
若只有master,则会因为master有污点而调度失败,一直pending,可以添加对应容忍使得pod可以调度到master节点上:
代码语言:bash复制kubectl patch deployment nginx -p '{"spec":{"template":{"spec":{"tolerations":[{"operator":"Exists","effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane"}]}}}}'
再创建nodeport类型service,可用node_ip:nodeport 从集群外访问,比如10.0.1.11:30080
代码语言:bash复制kubectl create svc nodeport nginx --tcp="80:80" --node-port=30080
完
至此就实现了一个多master容灾的k8s集群,用到的功能比较少,更多特性可以看k8s官方文档。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1748216532a4749322.html
评论列表(0条)