最近很多人在使用eks弹性集群的过程中遇到了一些镜像拉取问题,很多人部署了工作负载后,pod一直pengding,查看事件发现有报错ImagePullBackOff,但是这个镜像在镜像仓库是存在的,其实这里拉取镜像报错主要原因是网络问题和镜像拉取密钥没有匹配上导致的,下面我们来说说如何在eks上拉取不同镜像仓库的镜像。
eks上拉取腾讯云上的镜像仓库镜像可以走内网和公网,如果拉取非腾讯云平台镜像则必须要走公网,但是eks集群创建后pod默认是不能访问公网的,这里需要给eks集群的容器子网配置一个nat网关来访问外网,eks集群配置nat网关的方式参考文档https://cloud.tencent.com/document/product/457/48710 nat网关配置好之后,我们来讲解下如何拉取不同仓库的镜像,下面操作都是基于eks集群已经配置好nat网关前提下。
1. eks集群拉取TCR仓库镜像
拉取TCR上的镜像,首先需要创建一个TCR实例,然后将镜像上传到实例中镜像仓库,这里我们说说分别通过公网和内网拉取镜像如何配置,首先我们在TCR上配置一个永久访问凭证,这里后续配置到eks集群生成镜像拉取secret。
控制台点击实例,然后再访问凭证页新建一个永久的访问凭证,最后保存下这个凭证。
接下来在eks集群中配置下之前获取的tcr访问凭证,新建secret。
这里类型我们选择Dockercfg,域名和登录账号密码从我们之前保存的凭证获取,这里可以选择存量命名空间,如果后面新增命名空间则需要在对应命名空间新建一个相同的secret。
1.1 eks公网拉取TCR镜像
我们在TCR实例上开启下公网访问
然后配置下访问白名单,默认是拒绝所有公网流量访问的,注意eks访问公网需要配置nat网关才行,具体可以参考文档https://cloud.tencent.com/document/product/457/48710 。这里我们配置下我们的nat网关中eip就行,如果nat网关有多个eip就配置多个,配置好白名单后,我们在eks集群中通过拉取tcr上镜像来创建pod试试看。
eks上创建deployment的时候可以点击选择镜像选择到你tcr实例的镜像, 然后在镜像访问凭证选择我们之前创建的tcr-secret,从事件和pod运行状态看,pod已经成功运行,说明我们的eks已经能从公网拉取tcr镜像。
1.2 eks内网拉取TCR镜像
1.2.1 手动配置hosts解析拉取镜像
tcr默认开启内网访问,会在vpc下生成一个统一的入口ip作为实例访问ip,但是这个ip不会自动解析到tcr的域名上,如果您没有开启内网自动解析,也可以通配置hosts的模式来内网拉取tcr镜像。
代码语言:javascript复制apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: tcr-hosts-test
qcloud-app: tcr-hosts-test
name: tcr-hosts-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s-app: tcr-hosts-test
qcloud-app: tcr-hosts-test
template:
metadata:
labels:
k8s-app: tcr-hosts-test
qcloud-app: tcr-hosts-test
spec:
containers:
- env:
- name: PATH
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- name: NGINX_VERSION
value: 1.19.6
- name: NJS_VERSION
value: 0.5.0
- name: PKG_RELEASE
value: 1~buster
image: nwx-test.tencentcloudcr.com/tke/nginx:latest
imagePullPolicy: Always
name: tcr-hosts-test
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: false
dnsPolicy: ClusterFirst
hostAliases:
- hostnames:
- nwx-test.tencentcloudcr.com
ip: 10.0.0.184
imagePullSecrets:
- name: tcr-secret
restartPolicy: Always
这里我们在yaml配置下tcr域名和内网访问ip的hosts解析,然后配置下tcr镜像拉取秘钥,即可正常拉取镜像。
1.2.2开启内网自动解析拉取镜像
如果你不希望和上面步骤一样每个pod都去配置hosts解析,这里我们可以用到tcr的内网自动解析功能,首先开启tcr实例内网解析到eks所在的vpc内,然后在集群内配置访问凭证,最好创建pod的时候选择配置好的镜像访问凭证。这里访问凭证就用上面配置的tcr-secret即可。下面我们关闭tcr公网访问,开启内网解析访问。
我们关闭公网访问,新建内网接入,选择eks所在集群的vpc,然后点击管理自动解析,这样tcr域名就可以在vpc内自动解析了。下面我们创建deploymen试试。
这里我们选择我们实例中的镜像,然后选择tcr-secret这个拉取秘钥,从事件和pod状态可以发现镜像拉取成功并且pod成功运行,我们关闭了公网还是成功拉取了镜像,说明eks已经可以成功内网拉取tcr镜像了。
2. eks集群拉取CCR仓库镜像
eks集群上拉取个人版仓库ccr上的镜像,如果eks集群和镜像仓库是同一个地域,默认是走内网的,如果是跨地域访问,则需要走公网,这里不建议跨地域拉取ccr镜像,公网质量没有保证,如果必须跨地域拉取,可以参考tcr公网拉取方式配置secret,建议还是同地域内网拉取,这里我们讲讲如何内网拉取ccr上的镜像。
eks上拉取ccr上的镜像默认是不需要配置镜像拉取secret,只需要在命名空间下发默认的秘钥qcloudregistrykey即可
点击秘钥下发后,我们在test里面创建一个deployment,然后配置ccr的镜像和下发的qcloudregistrykey秘钥
从事件和pod状态可以发现镜像拉取成功,pod运行正常,说明eks可以正常拉取ccr上的私有镜像仓库了