为containerd配置仓库镜像

Posted by 梁远鹏 on 2023-01-12 | 阅读 |,阅读约 2 分钟

TOC

前言

containerd 的仓库镜像功能是很有用的功能,特别是国内无法访问 gcr.io 和 k8s.gcr.io 以及 registry.k8s.io 这些镜像仓库的情况下.

K3S 和 Kind 都提供了比较简单的方式来为内置的 containerd 配置仓库镜像.

K3S

下面列出关键部分,也就是配置镜像代理加速部分,至于 K3S 的部署不在本位内容范围内,修改好配置后重启下 K3S 就可以生效了.

root@k3sm3:~# cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "k8s.gcr.io":
    endpoint:
    - "https://lank8s.cn"
    - "https://k8s.lank8s.cn"
  "gcr.io":
    endpoint:
    - "https://gcr.lank8s.cn"
  "ghcr.io":
    endpoint:
    - "https://ghcr.lank8s.cn"
  "registry.k8s.io":
    endpoint:
    - "https://registry.lank8s.cn"
EOF
root@k3sm3:~# systemctl restart k3s

Kind

官方文档地址: https://kind.sigs.k8s.io/docs/user/local-registry/

有可能你使用以下命令会失效,是由于 Kind 的不断发展会导致下面字段 apiVersion 不再是 kind.x-k8s.io/v1alpha4 版本,而是更好的版本,本文使用的 Kind 版本是 kind v0.17.0 go1.19.2 linux/amd64.

kind.config

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
    endpoint = ["https://gcr.lank8s.cn"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
    endpoint = ["https://k8s.lank8s.cn"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
    endpoint = ["https://registry.lank8s.cn"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
    endpoint = ["https://ghcr.lank8s.cn"]  

执行以下命令用于初始化 K8S 集群.

oem@lan:~/repo/git/liangyuanpeng.github.io/content/post/cncf-containerd$ kind create cluster --config kind.config 
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.25.0) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

校验效果

K8S 测试环境准备好之后就可以部署一个容器来试试镜像拉取的效果.

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: distroless
  labels:
    app: distroless
spec:
  selector:
    matchLabels:
      app: distroless
  replicas: 1
  revisionHistoryLimit: 1
  template:
    metadata:
      labels:
        app: distroless
    spec:
      containers:
        - name: envoy
          image: gcr.io/distroless/static:nonroot

执行以下命令来部署上述的 Deployment 资源.

kubectl apply -f deployment.yaml

这里提供了一个 yaml 用于部署 Deployment 来拉取 gcr.io/distroless/static:nonroot 镜像,如果配置生效的话那么在无法访问 gcr.io 的情况下可以看到容器会成功拉取到镜像,最后 Pod 的状态是 CrashLoopBackOff 是由于容器无法启动的问题.

本文更友好

使用一个 gcr.io / registry.k8s.io 中可以正常运行的一个容器,欢迎投稿.

关于 lank8s.cn

关于 lank8s.cn 可以通过 lank8s.cn服务 了解更多.

微信公众号

扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。

wechat-qrcode