从零开始的 Kubernetes 学习笔记(三)
后知后觉 暂无评论

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

2022-07

2020-08


配置 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"

配置自动补全

为了方便使用,配置命令自动补全:

crictl completion bash | sudo tee /etc/bash_completion.d/crictl

需要退出终端重新登陆才能生效。

常用命令

crictl 命令与 docker 命令使用方法类似,大部分可直接进行替换。比如:

## 查看镜像列表
sudo crictl images
## 查看容器列表
sudo crictl pods
## 查看容器资源使用状态
sudo crictl stats

获得 Kubernetes 镜像

由于众所周知的原因,官方的镜像仓库地址在大陆无法访问。

PaaS 镜像服务中转

可以使用阿里云的「容器镜像服务 ACR 」、腾讯云的「容器镜像服务 TCR 」或亚马逊「弹性容器注册 ECR 」的进行“中转”。

创建命名空间

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

创建命名空间(!AVIF)

创建镜像仓库

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

创建镜像仓库(!AVIF)

小贴士:注意建议将「仓库名称」直接命名为实际需要的镜像名称,比如 kube-apiserver 仓库类型根据需求进行选择,私有仓库需要登录操作才能拉取。

海外上传镜像

需要先找到一个可以正常连接 k8s.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
从2023年9月13日开始,原仓库 k8s.gcr.io 废弃,使用新地址 registry.k8s.io,详情参考 Announcement

如果看到以下报错

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 导致,需要执行命令

sudo sed -i '/disabled_plugins/s/^\(.*\)$/#\1/g' /etc/containerd/config.toml

然后正常拉取上述镜像,再上传到阿里云的私有镜像仓库,以下选取其中一个为例。

docker image pull registry.k8s.io/kube-apiserver:v1.x.x

修改标签

docker image tag registry.k8s.io/kube-apiserver:v1.x.x registry.cn-beijing.aliyuncs.com/vndroid/kube-apiserver:v1.x.x

登录私有仓库

docker login --username=example@mail.com registry.cn-beijing.aliyuncs.com
小贴士:上述命名可以随便进入一个仓库中,即可查看到具体的信息。用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

推送到私有仓库

docker push registry.cn-beijing.aliyuncs.com/vndroid/kube-apiserver:v1.x.x
小贴士:如果提示无法找到主机等问题,是因为 DNS 问题,请在 /etc/resolv.conf 中加入阿里云 DNS '223.5.5.5' 即可。

其他镜像也都是同理,修改标签后推送,推送后即可到版本仓库中看到已经推送上来的版本。下图为旧版示例图,仅供参考。

镜像版本(!AVIF)

注意:上述的操作因 CRI 的不同,可能需要根据实际情况替换 docker 命令为 crictl ,后面不再赘述。

参数替换仓库地址

如果有搭建镜像服务器或者私有化镜像仓库,可以使用 kubeadm 的 --image-repository 参数来替换容器仓库地址。

## 查看默认镜像地址
sudo kubeadm config images list
## 修改地址
sudo kubeadm config images list --image-repository k9s.io/kubernetes
sudo kubeadm config images list --image-repository=k9s.io/kubernetes

可以看到其中 coredns 镜像的地址因为是两层子路径导致被错误替换,而无法使用(这是一个已知问题,在官方文档中有具体说明),此时要么重新规划私有仓库地址结构,去掉双层子目录,要么使用自定义配置来修改定义:

找到 apiserver 开头的配置段:

---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta4
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:                                          ## 这里的配置默认应该是 {},删除括号后添加下一行内容
  imageRepository: k9s.io/kubernetes/coredns  ## 如果代理仓库是双层目录那就按格式修改
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k9s.io/kubernetes            ## 这里修改为单层的目录结构

如果使用 Harbor 仓库的 Proxy Cache 功能,那么需要注意修改实际的代理路径。修改完成后可以使用命令查看并确认自定义的仓库地址是否正确:

## kubeadm-config.yaml 为示例,具体文件名按实际进行修改
sudo kubeadm config images list --config kubeadm-config.yaml
## 为加速部署,可以先提前拉取所需镜像
sudo kubeadm config images pull --config kubeadm-config.yaml

额外需要注意的是,如果在这里修改了容器的仓库前缀,那么前面 containerd 配置的【沙箱容器】还需要同步修改,切记。


部署 Helm 仓库

Helm 为一个公有 Kubernetes 仓库,可以方便管理和控制版本发行,安装手册可见官网文档

安装

同其他软件一样,官方提供了多种部署方法,根据需求和环境自行选择。

二进制安装(推荐)

  1. 官方 GitHub 中下载二进制包,根据架构下载,常见服务器都选择 Linux amd64。
  2. 解压二进制包

    tar xf helm-v3.x.x-linux-amd64.tar.gz
  3. 将程序安装到系统 $PATH 目录

    sudo install -m 755 linux-amd64/helm /usr/local/bin/helm

仓库方式

常见发行版可选此种方式(Ubuntu, CentOS, Debian 等)。

sudo apt install curl gnupg
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /etc/apt/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/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

验证

安装后验证程序是否正常执行

helm help

可以正常显示帮助信息,没有报错即为安装成功。


附录

相关链接

参考链接

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