用kubeadm+cvm+clb搭建3个master的集群

前言首先需要购买3个cvm和1个clb,示例如下:代码语言:bash复制CLBVIP=10.0.1.10NODE1=10.0.1.11NODE2=10.0.1.12NODE3=10.0.1.13机器初始化hostname建议用host

用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

相关推荐

  • 用kubeadm+cvm+clb搭建3个master的集群

    前言首先需要购买3个cvm和1个clb,示例如下:代码语言:bash复制CLBVIP=10.0.1.10NODE1=10.0.1.11NODE2=10.0.1.12NODE3=10.0.1.13机器初始化hostname建议用host

    3小时前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信