需求

最近给公司的一批测试环境的服务器升级k8s集群,下面是一些要求:

  • k8s从v1.16.x版本升级到v1.27.4版本
  • 运行时使用containerd:v1.6.20版本
  • 网络插件停止以前的flannel,使用calico: v3.24.6版本
  • 这批服务器机器不能连接外国网络

下面记录了主要的操作步骤,以备不时之需

[所有节点]关停旧版本节点的kubelet及其相关服务

  1. 关停服务
1
2
3
4
5
6
7
8
9
10
11
12
# 关停kubelet
systemctl stop kubelet
systemctl disable kubelet
systemctl stop kube-proxy
systemctl disable kube-proxy
# 关停相关服务,下面的只有master节点需要关停,node节点没有这些服务进程
systemctl stop kube-apiserver
systemctl disable kube-apiserver
systemctl stop kube-controller-manager
systemctl disable kube-controller-manager
systemctl stop kube-scheduler
systemctl disable kube-scheduler
  1. 检查是否成功

看到 Active: inactive (dead)表示成功关停

1
2
3
4
5
systemctl status kubelet
systemctl status kube-apiserver
systemctl status kube-controller-manager
systemctl status kube-proxy
systemctl status kube-scheduler

[所有节点]下载安装新版本Kubernetes

kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站 (aliyun.com)

使用阿里云镜像安装kubeadm

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

[所有节点]下载安装新版本containerd

K8s在1.24.x版本之后就不依赖docker运行时了,直接使用containerd运行时,所以我们要同时升级contained

docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 (aliyun.com)

使用阿里云镜像中docker-ce镜像库,其中有contained的镜像文件,所以yum添加docker-ce的软件源信息后,可以直接安装指定版本containerd

1
2
3
4
5
6
7
8
9
10
# step 1: 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 查找containerd的版本
yum list containerd.io --showduplicates | sort -r
# Step 4: 安装指定版本containerd
yum -y install containerd.io-[VERSION]

删除除config.toml文件并重启containerd

1
2
rm -f /etc/containerd/config.toml
systemctl restart containerd

开启containerd开机自启

1
systemctl enable containerd

[所有节点]containerd添加镜像文件registry.k8s.io

下载registry.k8s.io镜像并导入容器,这里是我利用一个可以联外网的服务器下载好registry.k8s.io镜像然后打包成pause.tar传到目标服务器的

1
ctr -n k8s.io i import pause.tar

[master节点]Kubedam init

初始化时指定阿里云镜像库

1
kubeadm init --image-repository=registry.aliyuncs.com/google_containers

成功会出现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

然后执行

1
export KUBECONFIG=/etc/kubernetes/admin.conf

[master节点]安装calico

先关闭旧版本的flannel网络插件服务

1
2
systemctl stop flanneld
systemctl disable 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
2
3
4
5
6
7
8
9
10
11
12
 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:5000"]
endpoint = ["http://harbor:5000"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor:5000".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry:5000"]
endpoint = ["http://registry:5000"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."registry:5000".tls]
insecure_skip_verify = true

[master节点]启动服务

批量启动指定文件夹下的服务

1
kubectl apply -f <资源清单文件>

查看pods状态

1
kubectl get pods --all-namespaces

替换docker的指令

当使用 containerd 作为 Kubernetes 的容器运行时时,与 Docker 相关的一些命令需要替换为与 containerd 兼容的命令。下面是一些常见的 Docker 命令以及它们在 containerd 下的替代方式:

  1. 替代 docker pull 命令:

    1
    2
    docker pull <image>   # Docker 命令
    ctr -n k8s.io images pull <image> # containerd 替代命令
  2. 替代 docker run 命令:

    1
    2
    docker run <options> <image>   # Docker 命令
    ctr -n k8s.io run --snapshotter=overlayfs --runtime=io.containerd.runtime.v1.linux <options> docker.io/<image> # containerd 替代命令
  3. 替代 docker ps 命令:

    1
    2
    docker ps <options>   # Docker 命令
    ctr -n k8s.io container ls <options> # containerd 替代命令
  4. 替代 docker images 命令:

    1
    2
    docker images <options>   # Docker 命令
    ctr -n k8s.io images list # containerd 替代命令
  5. 替代 docker exec 命令:

    1
    2
    docker exec <options> <container> <command>   # Docker 命令
    ctr -n k8s.io tasks exec --exec-id <exec-id> # containerd 替代命令(需通过 ctr tasks list 获取 exec-id)