使用第三方镜像
操作场景
CCE支持拉取第三方镜像仓库的镜像来创建工作负载。
通常第三方镜像仓库必须经过认证(账号密码)才能访问,而CCE中容器拉取镜像是使用密钥认证方式,这就要求在拉取镜像前先创建镜像仓库的密钥。
前提条件
使用第三方镜像时,请确保工作负载运行的节点可访问公网。
通过界面操作
使用kubectl创建第三方镜像仓库的密钥
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 通过kubectl创建认证密钥 ,该密钥类型为kubernetes.io/dockerconfigjson类型。
kubectl create secret docker-registry myregistrykey -n default --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
其中,myregistrykey为密钥名称,default为密钥所在的命名空间,其余参数如下所示。
- DOCKER_REGISTRY_SERVER:第三方镜像仓库的地址,如“www.3rdregistry.com”或“10.10.10.10:443”。
- DOCKER_USER:第三方镜像仓库的账号。
- DOCKER_PASSWORD:第三方镜像仓库的密码。
- DOCKER_EMAIL:第三方镜像仓库的邮箱。
- 创建工作负载时使用第三方镜像,具体步骤请参见如下。
kubernetes.io/dockerconfigjson类型的密钥作为私有镜像获取的认证方式,以Pod为例,创建的myregistrykey作为镜像的认证方式。
apiVersion: v1 kind: Pod metadata: name: foo namespace: default spec: containers: - name: foo image: www.3rdregistry.com/janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey #使用上面创建的密钥
常见问题:远程镜像仓库使用非知名或不安全的证书
从第三方仓库下载镜像时,若第三方仓库使用了非知名或者不安全的证书,节点上会拉取镜像失败,Pod事件列表中有“实例拉取镜像失败”事件,报错原因为"x509: certificate signed by unknown authority"。
当前EulerOS 2.9镜像中有进行安全增强,移除系统中部分非安全或过期知名证书配置,部分第三方镜像在其他类型节点上未报错,在EulerOS 2.9系统报此错误属正常现象,也可通过下述解决方案进行处理。
解决方案:
- 确认报错unknown authority的第三方镜像服务器地址和端口。
从"实例拉取镜像失败"事件信息中能够直接看到报错的第三方镜像服务器地址和端口,错误信息为:
Failed to pull image "bitnami/redis-cluster:latest": rpc error: code = Unknown desc = error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/e8/e83853f03a2e792614e7c1e6de75d63e2d6d633b4e7c39b9d700792ee50f7b56/data?verify=1636972064-AQbl5RActnudDZV%2F3EShZwnqOe8%3D: x509: certificate signed by unknown authority
对应的第三方镜像服务器地址为 production.cloudflare.docker.com,端口为https默认端口443。
- 在需要下载第三方镜像的节点上加载第三方镜像服务器的根证书。
EulerOS, CentOS节点执行如下命令,{server_url}:{server_port}需替换成步骤1中地址和端口,如 production.cloudflare.docker.com:443。
若节点的容器引擎为containterd,最后一步“systemctl restart docker”命令替换为"systemctl restart containerd"。openssl s_client -showcerts -connect {server_url}:{server_port} < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/ca-trust/source/anchors/tmp_ca.crt update-ca-trust systemctl restart docker
ubuntu节点执行如下命令。openssl s_client -showcerts -connect {server_url}:{server_port} < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/local/share/ca-certificates/tmp_ca.crt update-ca-trust systemctl restart docker