Kubeadm安装K8s集群指南
需求
最近给公司的一批测试环境的服务器升级k8s集群,下面是一些要求:
- k8s从v1.16.x版本升级到v1.27.4版本
- 运行时使用containerd:v1.6.20版本
- 网络插件停止以前的flannel,使用calico: v3.24.6版本
- 这批服务器机器不能连接外国网络
下面记录了主要的操作步骤,以备不时之需
[所有节点]关停旧版本节点的kubelet及其相关服务
- 关停服务
1 | # 关停kubelet |
- 检查是否成功
看到 Active: inactive (dead)
表示成功关停
1 | systemctl status kubelet |
[所有节点]下载安装新版本Kubernetes
kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站 (aliyun.com)
使用阿里云镜像安装kubeadm
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
可能有时还要更新libseccomp
1 | yum install libseccomp |
[所有节点]下载安装新版本containerd
K8s在1.24.x版本之后就不依赖docker运行时了,直接使用containerd运行时,所以我们要同时升级contained
docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 (aliyun.com)
使用阿里云镜像中docker-ce镜像库,其中有contained的镜像文件,所以yum添加docker-ce的软件源信息后,可以直接安装指定版本containerd
1 | # step 1: 安装必要的一些系统工具 |
删除除config.toml
文件并重启containerd
1 | rm -f /etc/containerd/config.toml |
开启containerd开机自启
1 | systemctl enable containerd |
[所有节点]containerd指定pause镜像下载地址
1 | mkdir /etc/containerd |
[master节点]Kubedam init
初始化时指定阿里云镜像库
1 | kubeadm init --image-repository=registry.aliyuncs.com/google_containers |
可能会出现端口占用或者文件已存在以及swap的问题,此时自行关闭相应端口程序,移除文件就可以了
1 | #查看一下端口占用 |
成功会出现
1 | Your Kubernetes control-plane has initialized successfully! |
然后执行
1 | export KUBECONFIG=/etc/kubernetes/admin.conf |
[master节点]安装calico
先关闭旧版本的flannel网络插件服务
1 | systemctl stop flanneld |
安装3.24版本的calico,先下载calico.yaml
Quickstart for Calico on Kubernetes | Calico Documentation (tigera.io)
1 | curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.6/manifests/calico.yaml -O |
利用下载下来的calico.yaml
安装calico
1 | kubectl apply -f calico.yaml |
[node节点]加入节点
1 | kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash> |
[master节点]校验是否成功
跑一下下面的指令,如果看到所有节点状态都Ready,说明成功了
1 | kubectl get nodes |
[所有节点]配置harbor私人仓库
先生成默认配置
1 | containerd config default > /etc/containerd/config.toml |
再在相应位置添加harbor仓库和其它私人仓库地址映射,并设置跳过安全校验
1 | [plugins."io.containerd.grpc.v1.cri".registry] |
重启containerd
1 | systemctl restart containerd |
[master节点]启动服务
批量启动指定文件夹下的服务
1 | kubectl apply -f <资源清单文件> |
查看pods状态
1 | kubectl get pods --all-namespaces |
[master节点]修改时区
1 | mkdir -p $HOME/.kube |
修改apiserver、controller-manager、scheduler的容器时区
如果不修改会导致k8s的定时任务执行时间异常
1 | cd /etc/kubernetes/manifests |
依次编辑这三个文件,加上下图所示的环境变量,编辑完不需要使用kubectl
重启yaml,k8s会自动重启这3个组件
注意:挨个编辑,直到新的pod启动成功后再编辑下一个(kubectl get pod -n kube-system
)
替换docker的指令
当使用 containerd 作为 Kubernetes 的容器运行时时,与 Docker 相关的一些命令需要替换为与 containerd 兼容的命令。下面是一些常见的 Docker 命令以及它们在 containerd 下的替代方式:
替代
docker pull
命令:1
2docker pull <image> # Docker 命令
ctr -n k8s.io images pull <image> # containerd 替代命令替代
docker run
命令:1
2docker run <options> <image> # Docker 命令
ctr -n k8s.io run --snapshotter=overlayfs --runtime=io.containerd.runtime.v1.linux <options> docker.io/<image> # containerd 替代命令替代
docker ps
命令:1
2docker ps <options> # Docker 命令
ctr -n k8s.io container ls <options> # containerd 替代命令替代
docker images
命令:1
2docker images <options> # Docker 命令
ctr -n k8s.io images list # containerd 替代命令替代
docker exec
命令:1
2docker exec <options> <container> <command> # Docker 命令
ctr -n k8s.io tasks exec --exec-id <exec-id> # containerd 替代命令(需通过 ctr tasks list 获取 exec-id)