Skip to content

Commit

Permalink
更新 containerd 内容
Browse files Browse the repository at this point in the history
  • Loading branch information
isno committed Jan 7, 2024
1 parent 63c452a commit aa34fd3
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 16 deletions.
64 changes: 53 additions & 11 deletions container/k8s-deploy-containerd.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,35 @@ containerd 内置的 CRI 插件管理容器和镜像,并通过 CNI 插件给 P
1. 安装 containerd

```
wget https://github.com/containerd/containerd/releases/download/v1.7.11/containerd-1.7.11-linux-amd64.tar.gz
$ wget https://github.com/containerd/containerd/releases/download/v1.7.11/containerd-1.7.11-linux-amd64.tar.gz
$ tar xzvf containerd-1.7.11-linux-amd64.tar.gz -C /usr/local/bin/
```

2. 安装 runc

runc 是底层容器运行时(真正创建容器的程序),containerd 二进制包中并没有内置,需要单独安装。

:::tip GPU

runc 并不支持GPU资源操作,譬如 nvidia-container-runtime

:::



```
wget https://github.com/opencontainers/runc/releases/download/v1.1.11/runc.amd64
$ wget https://github.com/opencontainers/runc/releases/download/v1.1.11/runc.amd64
chmod +x runc.amd64
mv runc.amd64 /usr/local/bin/runc
$ mv runc.amd64 /usr/local/bin/runc
$ chmod +x /usr/local/bin/runc
```

2. 创建配置文件

```
mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml
$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml
```

3. 修改 cgroup 驱动为 systemd
Expand All @@ -64,19 +73,19 @@ containerd config default > /etc/containerd/config.toml
SystemdCgroup = true
```

kubelet 和底层容器运行时都需要对接 cgroup 为 Pod 设置 CPU、内存资源的请求和限制,目前 cgroup 驱动有两种:
kubelet 和底层容器运行时都需要对接 cgroup 实现容器的资源的管理控制,目前 cgroup 驱动有两种:

- cgroupfs:当使用 cgroupfs 驱动时,kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup。
- systemd:systemd 也是对于 cgroup 接口的一个封装。systemd 以 PID 1 的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理 Linux 计算机操作系统资源。

debian、centos7 系统,都是使用 systemd 初始化系统的。systemd 这边已经有一套 cgroup 管理器了,如果容器运行时和 kubelet 使用 cgroupfs,此时就会存在 cgroups 和 systemd 两种 cgroup 管理器。也就意味着操作系统里面存在两种资源分配的视图。我们将 kubelet 和 容器运行时的 cgroup 驱动统一改为 Systemd。

部分系统譬如 debian、centos7 都是使用 systemd 初始化系统,相当于已经有一套 cgroup 资源分配视图了。如果 kubelet 和容器运行时使用 cgroupfs ,也就意味着一个系统里面存在两套资源分配视图。

4. 创建 containerd 的 systemd service 文件

```
https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
也可从 gtihub 中下载 containerd service 配置文件[^2],确认二进制执行文件配置正确。

```
cat >/etc/systemd/system/containerd.service <<EOF
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -118,8 +127,41 @@ OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF
```

5. 启动 containerd 服务

```
systemctl daemon-reload
systemctl enable --now containerd
```

6. 验证

```
$ ctr version
Client:
Version: v1.7.11
Revision: 64b8a811b07ba6288238eefc14d898ee0b5b99ba
Go version: go1.20.12
Server:
Version: v1.7.11
Revision: 64b8a811b07ba6288238eefc14d898ee0b5b99ba
UUID: 2f758747-ea47-4b81-8f2c-66133063dad5
```

下载镜像测试

```
$ ctr image pull docker.io/library/nginx:alpine
$ ctr run docker.io/library/nginx:alpine nginx
```

此时容器正常启动了,默认情况下 containerd 创建的容器只有 lo 网络,启动的容器还不具备网络能力,所以我们无法从外部访问它。各类的 CNI 插件其实就是创建 veth 接口、Linux bridge、分配 IP 等,这一部分的工作,我们使用 Cilium 配置完成。

[^2]: 参见 https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
[^1]: 参见 https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1/api.proto

5 changes: 2 additions & 3 deletions container/k8s-deploy-etcd.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,11 @@ WantedBy=multi-user.target

3. 启动 etcd 服务

在所有 etcd 集群节点上设置 etcd 开机自启并启动 etcd
在所有 etcd 集群节点上设置 etcd 开机自启并启动 etcd,在第一台节点上执行start后会一直卡着无法返回命令提示符,这是因为在等待其他节点准备就绪,继续启动其余节点即可

```
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd # 在第一台节点上执行start后会一直卡着无法返回命令提示符,这是因为在等待其他节点准备就绪,继续启动其余节点即可
systemctl enable -now etcd
```

4. 查看集群装填
Expand Down
2 changes: 1 addition & 1 deletion container/k8s-deploy-prepare.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ sed -i '/swap / s/^\(.*\)$/#\1/g' /etc/fstab

3. **关闭selinux**

SELinux是Linux内核的安全子系统,会通过访问策略控制机制对应用、进程和文件访问进行安全控制,然而,在Kubernetes环境中,容器需要访问宿主机的文件系统,开启 SELinux 可能会出现意外的权限问题,Kubernetes 官方建议关闭SELinux[^1]。此外,Kubernetes 本身也提供了一系列的安全机制,譬如RBAC、网络策略和 PodSecurityPolicy 等等。
SELinux是Linux内核的安全子系统,在 Kubernetes 环境中,容器需要访问宿主机的文件系统,开启 SELinux 可能会出现意外的权限问题,Kubernetes 官方建议关闭SELinux[^1]。另外一个重要的原因 SELinux 是通过**白名单访问策略**控制机制对应用、进程和文件访问进行安全控制,这就要意味着你要对你的应用系统非常熟悉。此外,Kubernetes 本身也提供了一系列的安全机制,譬如RBAC、网络策略和 PodSecurityPolicy 等等。

```
# 使用命令直接关闭
Expand Down
2 changes: 1 addition & 1 deletion intro.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 前言

如果你是一位互联网从业者,相信这几年你一定被层出不穷的技术概念包围:BigData(大数据)、Container(容器技术)、FaaS(函数即服务)、Serverless(无服务器架构)、ServiceMesh(服务网格)、DevOps、Observability...。相信我,此类的概念我可以一直写满一整页。但我想表达的意思是,这是个技术爆炸的时代,而软件的形态、技术方案迭代仿佛坐上了火箭。这样表现层的,可代替性
既然你翻开本书的第一页,如果你是一位互联网从业者,相信这几年你一定被层出不穷的技术概念迷惑:BigData(大数据)、Container(容器技术)、FaaS(函数即服务)、Serverless(无服务器架构)、ServiceMesh(服务网格)、DevOps、Observability...。相信我,此类的概念我可以一直写满一整页。但我想表达的意思是,这是个技术爆炸的时代,而软件的形态、技术方案迭代仿佛坐上了火箭。这样表现层的,可代替性

分析这些变化背后的根因,你会发现有以下几个非常重要的驱动因素:

Expand Down

0 comments on commit aa34fd3

Please sign in to comment.