扩容节点 扩容 Worker 节点
kubeadm init 后会输出在终端上, 有效期 2 小时, 超时后可以重新生成
生成添加命令:
1 kubeadm token create --print-join-command
扩容 Master 节点 生成加入命令 1 2 3 4 5 6 7 8 kubeadm init phase upload-certs --upload-certs kubeadm token create --print-join-command echo "$(kubeadm token create --print-join-command) --control-plane --certificate-key $(kubeadm init phase upload-certs --upload-certs | tail -1) "
修改负载均衡配置 扩容完 master 节点不要忘了将新的节点增加到 Apiserver 的负载均衡上。
证书位置 1 2 3 4 5 kubectl get secret -n kube-system kubeadm-certs -o yaml kubectl get secret -n kube-system bootstrap-token-277b0n -o yaml
移除节点 移除 worker 节点 1 2 kubectl drain worker2 --ignore-daemonsets kubectl delete node worker2
移除 etcd member 如果要移除 master 节点,并且 master 节点上部署了 etcd ,那除了上一步操作,还需要从 etcd 集群中移除这个节点。
1 2 3 4 5 6 7 kubectl exec -it -n kube-system etcd-master1 -- /bin/sh etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove 12637f5ec2bd02b8
升级集群 kubeadm 搭建的集群升级比较方便,总体步骤如下:
升级第一个 master 节点
升级其余的 master 节点
升级 worker 节点 如果集群运行着服务,升级节点前需要先腾空节点 kubectl drain --ignore-daemonsets <节点名称>
升级完成后,再恢复调度 kubectl uncordon <节点名称>
官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
升级第一个 master 节点 上面安装的 kubelet
kubeadm
kubectl
这 3 个是机器上使用 yum 安装的,所以需要通过 yum 来升级。先升级 kubeadm
组件, 新版本每个大版本一个 yum 仓库,需要先修改仓库配置文件,参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/change-package-repository/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sudo yum list --showduplicates kubeadm --disableexcludes=kubernetes sudo yum update kubeadm-1.29.6 --disableexcludes=kubernetes kubeadm version kubeadm upgrade plan kubeadm upgrade apply v1.29.6 sudo yum update kubelet-1.29.6 kubectl-1.29.6 cri-tools kubernetes-cni --disableexcludes=kubernetes sudo systemctl daemon-reload sudo systemctl restart kubelet
升级其他 master 节点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo yum update kubeadm-1.29.6 --disableexcludes=kubernetes kubeadm version kubeadm upgrade node sudo yum update kubelet-1.29.6 kubectl-1.29.6 cri-tools kubernetes-cni --disableexcludes=kubernetes sudo systemctl daemon-reload sudo systemctl restart kubelet
升级 worker 节点 1 2 3 4 5 sudo yum update kubeadm-1.29.6 kubelet-1.29.6 kubectl-1.29.6 cri-tools kubernetes-cni --disableexcludes=kubernetes sudo systemctl daemon-reload sudo systemctl restart kubelet
测试集群是否正常 创建一个 nginx 的 pod 资源
1 2 3 kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type =NodePort kubectl get deploy,svc,pod
访问 nodeport,检查能否访问到 nginx 服务
查看 ETCD 状态 1 kubectl exec -n kube-system etcd-master1 -- etcdctl --endpoints="10.0.0.13:2379,10.0.0.12:2379,10.0.0.11:2379" --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key endpoint status --write-out=table
pause 镜像版本问题 使用 kubeadm image pull
事先把镜像拉取下来,但是后面 kubeadm init
还是报错:
1 2 3 > journalctl -xeu kubelet -f Jul 22 08:35:49 master1 kubelet[2079]: E0722 08:35:49.169395 2079 pod_workers.go:190] "Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"etcd-master1_kube-system(642dcd53ce8660a2287cd7eaabcd5fdc)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"etcd-master1_kube-system(642dcd53ce8660a2287cd7eaabcd5fdc)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull and unpack image \\\"k8s.gcr.io/pause:3.6\\\": failed to resolve reference \\\"k8s.gcr.io/pause:3.6\\\": failed to do request: Head \\\"https://k8s.gcr.io/v2/pause/manifests/3.6\\\": dial tcp 142.250.157.82:443: connect: connection refused\"" pod="kube-system/etcd-master1" podUID=642dcd53ce8660a2287cd7eaabcd5fdc
这里我们已经提前拉取了镜像在本地了, 但是 init 的时候还是会从 k8s.gcr.io
拉取镜像,造成 init 失败,如果你的网络可以访问 k8s.gcr.io
的情况下则可以完成初始化, 你会发现这里拉取失败的镜像 tag 和 kubeadm config images pull
拉下来的版本不一致。
问题原因:containerd 的配置文件里面指定了 pause 的镜像,这里会拉取这个版本的镜像,和 kubeadm
不一致。所以两个镜像都需要,或者修改下 containerd 的配置。
修改 NodePort 端口范围 在 master 节点上修改:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 apiVersion: v1 kind: Pod metadata: annotations: kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0 .0 .22 :6443 creationTimestamp: null labels: component: kube-apiserver tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --advertise-address=10.0.0.22 - --allow-privileged=true ... - --service-node-port-range=1-65535 image: registry.k8s.io/kube-apiserver:v1.27.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 8 httpGet: host: 10.0 .0 .22 path: /livez
修改完成后保存, apiserver 会自动重启.
master 节点允许调度 1 2 3 4 5 kubectl taint nodes --all node-role.kubernetes.io/control-plane-
手动证书更新 使用kubeadm部署的集群证书过期后处理
修改 kube-proxy 代理模式 相比 iptables,使用 ipvs 可以提供更好的性能
1 kubectl -n kube-system edit configmap kube-proxy
mode 参数修改成 ipvs
1 kubectl -n kube-system rollout restart daemonset kube-proxy
查看 kube-proxy 日志,出现 Using ipvs Proxier 说明修改成功。
自动补全功能 CentOS Ubuntu
1 yum -y install bash-completion
1 apt install -y bash-completion
1 2 3 4 5 cat >> ~/.bashrc <<'EOF' source /usr/share/bash-completion/bash_completionsource <(kubectl completion bash)EOF