0%

使用 containerd 作为 K8s 运行时

使用 Ansible 部署 K8s 集群 部署完成后,重新阅读了 K8s 的文档,发现使用 containerd 需要先修改配置文件,之前配置失败的主要原因是没有配置 SystemdCgroup。
参考:
containerd 安装手册
配置 systemd cgroup 驱动

安装 containerd

首先是安装 containerd 并修改配置文件,可以从 apt 源或者 GitHub Releases 安装。

从 apt 源安装

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
28
29
30
31
32
33
34
35
---
- hosts: all
become: true

tasks:
- name: 安装 containerd
apt:
name: containerd
update_cache: true
register: result

- name: 配置 containerd
when: result.changed
block:
- name: 生成 containerd 默认配置文件
shell: "containerd config default > /etc/containerd/config.toml"

- name: 启用 SystemdCgroup
replace:
path: /etc/containerd/config.toml
regexp: "SystemdCgroup = false"
replace: "SystemdCgroup = true"

- name: 更新 pause 镜像版本
replace:
path: /etc/containerd/config.toml
regexp: '"registry.k8s.io/pause:.*'
replace: '"registry.k8s.io/pause:3.9"'

- name: 重启并启用 containerd 服务
systemd_service:
enabled: true
state: restarted
daemon_reload: true
name: containerd

从 GitHub Releases 安装

参考 containerd 安装手册 编写的 playbook 安装步骤

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
---
- hosts: all
become: true

vars:
containerd_url: https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-amd64.tar.gz
containerd_service_url: https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
runc_url: https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64
cni_plugins_url: https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz

tasks:
- name: 解压 containerd 包到 /usr/local
unarchive:
src: "{{ containerd_url }}"
dest: /usr/local
remote_src: yes
register: result

- name: 下载 runc 二进制文件到 /usr/local/sbin 并设置权限
get_url:
url: "{{ runc_url }}"
dest: "/usr/local/sbin/runc"
mode: "755"

- name: 创建 /opt/cni/bin 目录
file:
path: /opt/cni/bin
state: directory
# 启用 flannel 时也会安装 CNI,此步骤可能不需要
- name: 解压 CNI 插件包到 /opt/cni/bin
unarchive:
src: "{{ cni_plugins_url }}"
dest: /opt/cni/bin
remote_src: yes

- name: 配置 containerd
when: result.changed
block:
- name: 下载 containerd systemd 服务文件
get_url:
url: "{{ containerd_service_url }}"
dest: "/etc/systemd/system/containerd.service"

- name: 创建 /etc/containerd 目录
file:
path: /etc/containerd
state: directory

- name: 生成 containerd 默认配置文件
shell: "containerd config default > /etc/containerd/config.toml"

- name: 修改 SystemdCgroup true
replace:
path: /etc/containerd/config.toml
regexp: "SystemdCgroup = false"
replace: "SystemdCgroup = true"

- name: 更新 pause 镜像版本
replace:
path: /etc/containerd/config.toml
regexp: '"registry.k8s.io/pause:.*'
replace: '"registry.k8s.io/pause:3.9"'

- name: 重启并启用 containerd 服务
systemd_service:
enabled: true
state: restarted
daemon_reload: true
name: containerd

安装 K8s

containerd 安装配置完成后,使用以下 playbook 安装 K8s:

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
28
29
30
31
32
33
34
35
36
37
---
- hosts: all
become: true

tasks:
- name: 创建 APT 密钥目录
file:
path: /etc/apt/keyrings
state: directory
mode: "0755"

- name: 添加 Kubernetes APT 密钥
apt_key:
url: https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.30/deb/Release.key
keyring: /etc/apt/keyrings/kubernetes-apt-keyring.gpg

- name: 添加 Kubernetes APT 仓库
apt_repository:
repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.30/deb/ /"
filename: kubernetes

- name: 安装 Kubernetes 组件
apt:
name:
- kubelet
- kubeadm
- kubectl
update_cache: true

- name: Kubernetes 组件的包状态设置为 hold
dpkg_selections:
name: "{{ item }}"
selection: hold
loop:
- kubelet
- kubeadm
- kubectl

镜像拉取

containerd 也可以配置代理,参考上文的 为 Docker 配置代理
service_override_dir 改成 /etc/systemd/system/containerd.service.dsystemd_service 下的 name 改成 containerd 即可。

在上文的时候已经通过 docker 拉取镜像并导出,现在使用 containerd 仍然可以使用这些文件导入。
导入镜像的 playbook:

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
28
29
30
31
32
33
34
35
36
37
38
---
- hosts: all
become: true

vars:
images_base_url: http://192.168.1.100
tmp_dir: /tmp/images_import
filenames:
- kube-apiserver.tar
- kube-controller-manager.tar
- kube-scheduler.tar
- kube-proxy.tar
- coredns.tar
- pause.tar
- etcd.tar
- flannel.tar
- flannel-cni-plugin.tar

tasks:
- name: 创建临时目录用于存储镜像文件
file:
path: "{{ tmp_dir }}"
state: directory

- name: 下载镜像文件到临时目录
get_url:
url: "{{ images_base_url }}/{{ item }}"
dest: "{{ tmp_dir }}/{{ item }}"
loop: "{{ filenames }}"

- name: 导入镜像到 containerd
command: "ctr -n=k8s.io images import {{ tmp_dir }}/{{ item }}"
loop: "{{ filenames }}"

- name: 删除临时目录及其内容
file:
path: "{{ tmp_dir }}"
state: absent

环境准备好后,可以开始初始化 K8s 集群。
和上文初始化步骤差不多,只不过创建和加入都不需要指定运行时参数,直接执行 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 就可以初始化。
完整步骤: 初始化 K8s 集群