需求

最近给公司的一批测试环境的服务器升级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
13
# 关停kubelet
systemctl stop kubelet
systemctl stop kube-proxy && systemctl disable kube-proxy
# 关闭swap
swapoff -a
# 编辑注释掉swap开机启动
vim /etc/fstab

# 关停相关服务,下面的只有master节点需要关停
systemctl stop etcd && systemctl disable etcd
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
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

可能有时还要更新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
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指定pause镜像下载地址

1
2
3
4
5
6
7
8
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#打开文件
vim /etc/containerd/config.toml
#修改
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
#wq保存后重启containerd服务
systemctl restart containerd.service

[master节点]Kubedam init

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

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

可能会出现端口占用或者文件已存在以及swap的问题,此时自行关闭相应端口程序,移除文件就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#查看一下端口占用
netstat -tulpn |grep xxxx
#杀死进程
kill 进程ID
#给旧文件重命名
mv /var/lib/etcd /var/lib/etcdOld


#重置kubeadm
kubeadm reset
#重新导入镜像
ctr -n k8s.io i import pause.tar
#重新执行一次
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
13
14
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[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.mirrors."registry:5000"]
endpoint = ["http://registry: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.configs."registry:5000".tls]
insecure_skip_verify = true

重启containerd

1
systemctl restart containerd

[master节点]启动服务

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

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

查看pods状态

1
kubectl get pods --all-namespaces

[master节点]修改时区

1
2
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

修改apiserver、controller-manager、scheduler的容器时区

如果不修改会导致k8s的定时任务执行时间异常

1
2
3
4
cd /etc/kubernetes/manifests
vim kube-apiserver.yaml
vim kube-controller-manager.yaml
vim kube-scheduler.yaml

依次编辑这三个文件,加上下图所示的环境变量,编辑完不需要使用kubectl重启yaml,k8s会自动重启这3个组件

注意:挨个编辑,直到新的pod启动成功后再编辑下一个(kubectl get pod -n kube-system

img

替换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)