最近更新时间:2024-04-23 16:43:55
当您使用容器实例从自建仓库中拉取镜像时,可能会遇到如下问题:
不能解析自建仓库的域名
因协议不同或者证书认证失败而导致镜像拉取失败
本文介绍如何配置容器实例解析自建仓库的域名,以及在自建镜像仓库采用HTTP协议和使用自签发证书的情况下,如何拉取自建镜像仓库中的镜像来创建容器实例。
您可以通过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 |
| 否 | 使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置dnsconfig,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Pod’s DNS Config) |
k8s.ksyun.com/kci-host-aliases |
| 否 | 使用自建镜像仓库时,若未在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
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
拉取自建镜像仓库中的镜像时,可能会出现镜像拉取失败的问题。在保证容器实例与镜像仓库网络连通性的前提下,问题原因和解决方法如下:
场景 | 原因 | 解决方法 |
---|---|---|
自建镜像仓库采用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下。
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
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
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
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
纯净模式