使用自建仓库

最近更新时间:2023-04-25 11:19:06

查看PDF

当您使用容器实例从自建仓库中拉取镜像时,可能会遇到如下问题:

  • 不能解析自建仓库的域名
  • 因协议不同或者证书认证失败而导致镜像拉取失败

本文介绍如何配置容器实例解析自建仓库的域名,以及在自建镜像仓库采用HTTP协议和使用自签发证书的情况下,如何拉取自建镜像仓库中的镜像来创建容器实例。

场景1:容器实例解析自建仓库域名

您可以通过vk维度/pod维度两种配置方式,来更新容器实例底层的DNS相关配置,实现对自建镜像仓库的域名解析。

vk维度配置通过环境变量指定,对vk所管理的所有容器实例生效:

环境变量 含义 是否必填
KCI_HOST_ALIASES 若需使用自建镜像仓库,在vk级别配置实例hostAliases,生效于该vk所管理的实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Adding additional entries with hostAliases
KCI_DNS_CONFIG 若需使用自建镜像仓库,在vk级别配置实例dnsconfig,生效于该vk所管理的实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Pod’s DNS Config

Yaml示例如下:

...
          env:
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: TEMP_AKSK_CM
              value: user-temp-aksk
            - name: KCI_CLUSTER_ID
              value: ${cluster_id} 
            - name: KCI_SUBNET_ID
              value: ${subnet_id}
            - name: KCI_SECURITY_GROUP_IDS
              value: ${security_group_ids} 
            # 使用自建镜像仓库时,指定该虚拟节点所管理的实例底层系统的hostAliases配置
            - name: KCI_HOST_ALIASES
              value: '[{"ip":"1.2.3.4","hostnames":["www.privaterepo1.com"]},{"ip":"2.3.4.5","hostnames":["www.privaterepo2.com"]}]'
            # 使用自建镜像仓库时,指定该虚拟节点所管理的实例底层系统的dnsconfig配置
            - name: KCI_DNS_CONFIG
              value: '{"nameservers":["1.1.1.1"],"options":[{"name":"ndots","value":"2"},{"name":"timeout","value":"3"}],"searches":["test1.com"]}'
...  

Pod维度通过 annotation 配置:

Annotation Key Annotation Value示例 是否必填 描述
k8s.ksyun.com/kci-dns-config '{"nameservers":["1.1.1.1"],"options":[{"name":"ndots","value":"2"},{"name":"timeout","value":"3"}],"searches":["test1.com"]}' 使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置dnsconfig,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Pod’s DNS Config
k8s.ksyun.com/kci-host-aliases '[{"ip":"1.2.3.4","hostnames":["www.privaterepo1.com"]},{"ip":"2.3.4.5","hostnames":["www.privaterepo2.com"]}]' 使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置hostAliases,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Adding additional entries with hostAliases

Yaml示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-rbkci
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
        annotations:
            k8s.ksyun.com/kci-dns-config: '{"nameservers":["1.1.1.1"],"options":[{"name":"ndots","value":"2"},{"name":"timeout","value":"3"}],"searches":["test1.com"]}'   #实例维度配置dnsconfig,生效于实例底层系统内,用于解析镜像仓库地址
            k8s.ksyun.com/kci-host-aliases: '[{"ip":"1.2.3.4","hostnames":["www.privaterepo1.com"]},{"ip":"2.3.4.5","hostnames":["www.privaterepo2.com"]}]'   #实例维度配置hostAliases,生效于实例底层系统内,用于解析镜像仓库地址
        labels:
            app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
      nodeName: rbkci-virtual-kubelet   #指定nodeName将pod调度到虚拟节点上

场景2:容器实例支持采用HTTP协议和使用自签发证书的镜像仓库

功能说明

拉取自建镜像仓库中的镜像时,可能会出现镜像拉取失败的问题。在保证容器实例与镜像仓库网络连通性的前提下,问题原因和解决方法如下:

场景 原因 解决方法
自建镜像仓库采用HTTP协议 容器实例默认使用HTTPS协议拉取镜像,协议不同导致镜像拉取失败 配置容器实例使用HTTP协议与镜像仓库进行交互
自建镜像仓库采用HTTPS协议,但使用的证书是自签发证书 使用自签发证书的情况下,拉取镜像时无法通过证书认证,导致镜像拉取失败 配置跳过证书认证

配置说明

拉取自建镜像仓库中的镜像时,如果镜像仓库采用HTTP协议,或者使用自签发证书,需配置Annotation来避免镜像拉取失败。相关Annotation说明如下:

Annotation Key Annotation Value示例 描述
k8s.ksyun.com/kci-http-registry 192.168.xx.xx:5000 使用HTTP协议的自建镜像仓库中的镜像创建容器实例时,需配置该Annotation使得容器实例使用HTTP协议拉取镜像,避免因协议不同而导致镜像拉取失败。支持配置多个仓库域名或IP,以逗号隔开。
k8s.ksyun.com/kci-insecure-registry harbor.example.com 使用自签发证书的自建镜像仓库中的镜像创建容器实例时,需配置该Annotation来跳过证书认证,避免因证书认证失败而导致镜像拉取失败。支持配置多个仓库域名或IP,以逗号隔开。

说明:

  • 如果有多个容器的镜像需要从不同的镜像仓库中拉取,支持填写多个镜像仓库地址,各个地址之间采用半角逗号隔开,例如harbor.example.com,192.168.XX.XX
  • 如果镜像仓库地址有端口号,则需要带上端口号,例如:镜像地址为192.168.XX.XX:5000/nginx:latest,则Annotation的值需设置为192.168.XX.XX:5000

配置示例

配置时,Annotation请添加在Pod的metadata下,例如配置Deployment时,Annotation需添加在spec>template>metadata下。

自建镜像仓库采用HTTP协议

Yaml示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-rbkci
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      annotations:
        k8s.ksyun.com/kci-http-registry: 192.168.xx.xx:5000  # 配置使用HTTP协议的镜像仓库地址
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.xx.xx:5000/library/nginx:latest
      nodeName: rbkci-virtual-kubelet
自建镜像仓库采用自签发证书

Yaml示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-rbkci
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      annotations:
        k8s.ksyun.com/kci-insecure-registry: kevin.harbor.com  # 配置使用自签发证书的镜像仓库地址
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: kevin.harbor.com/library/nginx:v1
      nodeName: rbkci-virtual-kubelet

文档内容是否对您有帮助?

根本没帮助
文档较差
文档一般
文档不错
文档很好

在文档使用中是否遇到以下问题

内容不全,不深入
内容更新不及时
描述不清晰,比较混乱
系统或功能太复杂,缺乏足够的引导
内容冗长

更多建议

0/200

评价建议不能为空

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

问题反馈