从零开始的 Kubernetes 学习笔记(三)

后知后觉 暂无评论

使用 Kubernetes 对容器进行编排成为微服务时代的技术风向标。

更新记录

2022-08

2020-08

使用 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-endpointimage-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 」进行“中转”。

创建命名空间

首先需要创建阿里云的镜像仓库命名空间,这个命名空间是为了区分唯一用户的。可以随便取,建议简洁一些。

创建命名空间(!AVIF)

创建镜像仓库

然后需要创建镜像仓库,仓库即对应一个镜像名称。

创建镜像仓库(!AVIF)

小贴士:注意建议将「仓库名称」直接命名为实际需要的镜像名称,比如 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' 即可。

推送后即可到版本仓库中看到已经推送上来的版本。下图为旧图,仅供参考。

镜像版本(!AVIF)

注意:上述的操作因 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

附录

相关链接

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。