使用 Kubernetes 对容器进行编排成为微服务时代的技术风向标。
更新记录
2022-08
- (08-07)「新增」更新 v1.24 版本说明;
2020-08
- (08-17)「初始」版本;
使用 containerd 作为 CR
使用官方地址进行手动部署(推荐)
详细的官方英文指南可参考 Getting started with containerd。
步骤1:安装 containerd
从官方项目地址中下载二进制包,格式为 containerd-<版本>-<系统>-<架构>.tar.gz
,然后解压到安装目录中。
sudo tar Cxf /usr/local containerd-1.x.x-linux-amd64.tar.gz
步骤2:配置系统守护
从项目仓库下载守护单元
sudo mkdir -p /usr/local/lib/systemd/system/
sudo wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service
重载单元并启动
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
步骤3:安装 runc
从官方项目地址中下载二进制包,格式为 runc.<架构>
,然后安装到安装目录中。
wget https://github.com/opencontainers/runc/releases/download/v1.x.x/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
步骤4:配置 containerd
生成默认配置文件并修改
sudo install -m 0755 -d /etc/containerd/
containerd config default | sudo tee /etc/containerd/config.toml
修改 /etc/containerd/config.toml
配置,将默认 cgroup 引擎为 systemd,查找 containerd.runtimes.runc.options
字段下的 SystemdCgroup
改为 true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
...
SystemdCgroup = true
...
然后重启服务
sudo systemctl restart containerd.service
最后需要注意的是,此种方式部署不需要安装官方手册中的 CNI 插件,因为这部分插件可以使用 kubernetes 仓库的 CNI 插件。
使用 Docker 仓库进行部署
首先还是安装 containerd 作为容器运行时,可以使用 Docker 官方源安装 containerd ,而不是使用发行版的自带仓库(比较旧)但需要注意的是 Docker 官方对于大版本更新比较保守,因此可能并不是最新的版本。
部署官方仓库可以参考官方说明,本文使用 Debian 11 为例进行配置:
步骤1:配置仓库
安装依赖
sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
使用官方地址进行安装,中国大陆用户可参考基于 Debian 的系列发行版部署 Docker CE 使用国内镜像源进行安装。
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
步骤2:安装 containerd
仅需要安装一个组件即可
sudo apt update
sudo apt install containerd.io
步骤3:配置 containerd
生成默认配置文件覆盖掉官方配置
containerd config default | sudo tee /etc/containerd/config.toml
配置默认 cgroup 引擎为 systemd,查找 containerd.runtimes.runc.options
字段下的 SystemdCgroup
改为 true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
...
SystemdCgroup = true
...
然后重启 containerd 保证新配置文件生效
sudo systemctl restart containerd
检查进程状态
$ ps -ef | grep -v 'grep' | grep 'containerd'
root 517 1 0 Jul12 ? 00:20:36 /usr/bin/containerd
配置自动补全
为了方便使用 ctr
命令,需要配置自动补全。
curl -s https://raw.githubusercontent.com/containerd/containerd/main/contrib/autocomplete/ctr | sudo tee /etc/bash_completion.d/ctr
sudo chmod 644 /etc/bash_completion.d/ctr
需要退出终端重新登陆才能生效。
配置 CRI
新版的 kubernetes 新增了一个 CRI 配置工具 crictl
,使用此工具可以检测和配置 CRI 相关资源。
配置 CRI 接口
默认情况下 crictl 会自动检测后端使用的是何种引擎,本文以最新的 v1.24 版本为例,使用 containerd
作为后端进行配置:
配置 runtime-endpoint
和 image-endpoint
和延时
sudo crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
sudo crictl config --set image-endpoint=unix:///run/containerd/containerd.sock
sudo crictl config --set timeout=2
命令会将配置写入 /etc/crictl.yaml
,如果不配置会在执行命令时看到以下报错:
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"
配置自动补全
为了方便使用,配置 bash
自动补全:
crictl completion bash | sudo tee /etc/bash_completion.d/crictl
需要退出终端重新登陆才能生效。
查看 CRI 镜像
sudo crictl images
除了 Container 外都可以使用crictl
进行管理,与docker
作用一致,container 的概念变为了 k8s 中的 Pod,因此这部分需要在 k8s 中查看。
中国大陆下载镜像
由于众所周知的原因,官方的镜像仓库 k8s.io 的镜像在中国大陆的机器上无法正常拉取,因此可以使用阿里云的「容器镜像服务 ACR 」进行“中转”。
创建命名空间
首先需要创建阿里云的镜像仓库命名空间,这个命名空间是为了区分唯一用户的。可以随便取,建议简洁一些。
创建镜像仓库
然后需要创建镜像仓库,仓库即对应一个镜像名称。
小贴士:注意建议将「仓库名称」直接命名为实际需要的镜像名称,比如 kube-apiserver
仓库类型根据需求进行选择,私有仓库需要登录操作才能拉取。
海外上传镜像
需要先找到一个可以正常连接 k8s.gcr.io
仓库的服务器,比如可以使用阿里云的「轻量应用服务器 SAS」 香港/新加坡 服务器。
然后使用命名查询所需镜像名称和版本
$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.24.3
k8s.gcr.io/kube-controller-manager:v1.24.3
k8s.gcr.io/kube-scheduler:v1.24.3
k8s.gcr.io/kube-proxy:v1.24.3
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6
此部分为旧版本,忽略即可
$ kubeadm config images list
I0830 02:30:40.287681 3425 version.go:252] remote version is much newer: v1.19.0; falling back to: stable-1.18
W0830 02:30:43.217917 3425 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.8
k8s.gcr.io/kube-controller-manager:v1.18.8
k8s.gcr.io/kube-scheduler:v1.18.8
k8s.gcr.io/kube-proxy:v1.18.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
如何看到以下报错
failed to pull image "k8s.gcr.io/kube-apiserver:v1.24.3": output: E0727 15:31:44.603425 30260 remote_image.go:218] "PullImage from image service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.ImageService" image="k8s.gcr.io/kube-apiserver:v1.24.3"
time="2022-07-27T15:31:44+08:00" level=fatal msg="pulling image: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.ImageService"
, error: exit status 1
To see the stack trace of this error execute with --v=5 or higher
因为 1.24.x 版本修改了 CRI 导致,需要执行命令
sed -i '/disabled_plugins/s/^\(.*\)$/#\1/g' /etc/containerd/config.toml
然后正常拉取上述镜像,再上传到阿里云的私有镜像仓库,以下选取其中一个为例。
$ sudo docker image pull k8s.gcr.io/kube-apiserver:v1.18.8
修改标签
$ sudo docker tag k8s.gcr.io/kube-apiserver:v1.18.8 registry.cn-beijing.aliyuncs.com/vndroid/kube-apiserver:v1.18.8
登录私有仓库
$ sudo docker login --username=example@outlook.com registry.cn-beijing.aliyuncs.com
小贴士:上述命名可以随便进入一个仓库中,即可查看到具体的信息。用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
推送到私有仓库
$ sudo docker push registry.cn-beijing.aliyuncs.com/vndroid/kube-apiserver:v1.18.8
小贴士:如果提示无法找到主机等问题,是因为 DNS 问题,请在 /etc/resolv.conf
中加入阿里云 DNS '223.5.5.5' 即可。
推送后即可到版本仓库中看到已经推送上来的版本。下图为旧图,仅供参考。
注意:上述的操作因 CRI 的不同,可能需要根据实际情况替换 docker 命令为 crictl ,后面不再赘述。
部署 Helm 仓库
Helm 为一个公有 k8s 仓库,可以方便管理和控制版本发行。
安装
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt install apt-transport-https
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
sudo apt install helm
配置自动补全
helm completion bash | sudo tee /etc/bash_completion.d/helm
附录
相关链接
参考链接
- deploy kubernetes cluster on debian 11 with containerd - hostafrica
- containerd - GitHub
- Container Runtime Interface (CRI) CLI - GitHub
- Changing the Container Runtime on a Node from Docker Engine to containerd - kubernetes
- Kubernetes Removals and Deprecations In 1.24 - kubernetes Blog
- Debugging Kubernetes nodes with crictl - kubernetes
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2023-05-28 18:58 PM