linux怎么查看本机内存大小
980
2022-09-11
k8s节点如何从Harbor中拉取镜像的?镜像拉取凭证的配置
前言
Harbor因为kubernetes而兴起,作为镜像存储仓库,那要如何才能使用呢?本篇文章分析kubernetes集群中,Pod中容器的镜像是如何从Harbor中拉取镜像的,看到这篇文章,相比你对kubernetes多多少少都有了解吧!
1、Pod中拉取Harbor中镜像的两种情况
k8s集群在部署pod过程中,有以下两种情况来拉取镜像:
1.1、拉取Harbor中的公有镜像
公有镜像,即供任何人都可以访问使用的镜像,如library公有项目下的镜像。pod部署到的主机(宿主机)的网络能跟Harbor服务器能通就行,不需要做特殊的配置。
1.2、拉取Harbor中的私有镜像
在Harbor的生成使用环境中,因为有很多不同的系统使用Harbor来存储、拉取镜像,为防止各个系统间造成影响,harbor管理员会为每个系统创建一个项目(project)和一个用户(user),然后将项目设置为私有项目,并且该项目对用户授权。
该系统在部署Pod的时候,要拉取分配的私有项目中的私有镜像时,还能直接拉取吗?在kubernetes中,可以通过Secrets资源对象(认证)来配置镜像拉取凭证,然后在imagePullSecrets字段(参数)指定对应的拉取凭证来拉取私有镜像。
2、主机配置
Pod在拉取Harbor中的镜像是通过节点主机的容器运行时(CRI)来拉取的,本处以docker为例。需要对docker做些配置。
kubernetes集群中的每个节点都需要配置,至少要保证使用该镜像的Pod所在的节点都配置。
2.1、修改docker配置文件并重启服务
修改配置:
[root@sc-node1 ~]# vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": [" "insecure-registries": ["192.168.2.250:443"] # 此处添加Harbor仓库地址(安全加密端口) }
重新加载配置
[root@sc-node1 ~]# systemctl daemon-reload
重新启动docker服务
[root@sc-node1 ~]# systemctl restart dockerJob for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
2.2 节点主机命令行登录Harbor
本处以test-1私有项目、用户lidabai/Lidabai123为演示。
1)命令行登录harbor
[root@sc-node1 ~]# docker login -u lidabai -p Lidabai123WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. SeeSucceeded
如果登录报错,需要检查docker的配置及网络与Harbor是否正常。
注: Pod所在节点主机均需要登录成功!登录成功后,会在当前用户下生成 .docker/config.json 文件,该文件记录了相关的登录信息,后面会基于该文件来制作镜像拉取凭证。
[root@sc-node1 ~]# pwd/root[root@sc-node1 ~]# ls -la .docker/总用量 4drwx------ 2 root root 25 4月 4 11:07 .dr-xr-x---. 4 root root 178 4月 4 11:07 ..-rw------- 1 root root 155 4月 4 11:07 config.json # 该文件记录了相关的登录信息
2)查看登录的密钥数据
[root@sc-node1 ~]# cat ~/.docker/config.json { "auths": { "192.168.2.250:443": { "auth": "bGlkYWJhaTpMaWRhYmFpMTIz" } }, "HttpHeaders": { "User-Agent": "Docker-Client/19.03.8 (linux)" }}[root@sc-node1 ~]#
3) 对密钥进行加密
用BASE64编码dockercfg内容,注意一下要用到编码后的子串。
[root@sc-node1 ~]# cat ~/.docker/config.json | base64 -w 0ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjIuMjUwOjQ0MyI6IHsKCQkJImF1dGgiOiAiYkdsa1lXSmhhVHBNYVdSaFltRnBNVEl6IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy44IChsaW51eCkiCgl9Cn0=[root@sc-node1 ~]#
-w 0 表示生成秘钥不转行,默认转行不是正确的格式会出错!
3、创建Secret资源对象
在kubernetes集群管理节点操作!
3.1 编写资源清单文件
[root@sc-master1 ~]# vim harbor-image-secret.yaml apiVersion: v1kind: Secretmetadata: name: harbor-pull-secrettype: kubernetes.io/dockerconfigjsondata: .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjIuMjUwOjQ0MyI6IHsKCQkJImF1dGgiOiAiYkdsa1lXSmhhVHBNYVdSaFltRnBNVEl6IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy44IChsaW51eCkiCgl9Cn0=
3.2 更新资源清单文件
[root@sc-master1 ~]# kubectl apply -f harbor-image-secret.yamlsecret/harbor-pull-secret created[root@sc-master1 ~]# kubectl get secretNAME TYPE DATA AGEdefault-token-qkbdw kubernetes.io/service-account-token 3 9dharbor-pull-secret kubernetes.io/dockerconfigjson 1 13s # 是这个!!!
扩展:命令行创建secret
# kubectl create secret docker-registry image-secret \--docker-server= \--docker-username=lidabai --docker-password=lidabai123
4、容器中指定镜像拉取凭证
Secret制作的镜像拉取凭证制作好后,就可以在创建Pod时使用了。
本处以拉取test-1私有项目下的192.168.2.250:443/test-1/traefik:2.6.2私有镜像为例,lidabai用户以“开发者”的角色拥有对test-1项目的镜像上传、拉取权限。
4.1 环境说明
4.2 编写测试资源清单文件
[root@sc-master1 ~]# vim traefik.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: traefik namespace: defaultspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: 192.168.2.250:443/test-1/traefik:2.6.2 imagePullPolicy: IfNotPresent imagePullSecrets: # 镜像拉取凭证 - name: harbor-pull-secret # 镜像拉取凭证的名称,填入刚才创建的secret名称!!! affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: kubernetes.io/hostname
4.3、更新资源清单文件
[root@sc-master1 ~]# kubectl apply -f traefik.yamldeployment.apps/traefik created
4.4、查看资源部署状态(验证)
[root@sc-master1 ~]# kubectl get pods -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEStraefik-599b969746-5xc6r 1/1 Running 0 56s 10.244.119.243 sc-node1
可以看到,有个Pod创建失败了,因为镜像拉取失败!
4.4、故障分析
我的kubernetes集群是1master,2node节点,2个pod副本分别调度到两个node节点,之前在主机登录docker的时候,master和node1均有操作,但node2没有登录到harbor,从而没有生成~/.docker/config.json文件。
[root@sc-master1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONsc-master1 Ready control-plane,master 9d v1.20.6sc-node1 Ready
解决: node2节点在命令行登录harbor!
[root@sc-node2 ~]# docker login -u lidabai -p Lidabai123WARNING! Using --password via the CLI is insecure. Use --password-stdin.Error response from daemon: Get x509: cannot validate certificate for 192.168.2.250 because it doesn't contain any IP SANs[root@sc-node2 ~]# vim /etc/docker/daemon.json [root@sc-node2 ~]# systemctl daemon-reload [root@sc-node2 ~]# systemctl restart docker[root@sc-node2 ~]# docker login -u lidabai -p Lidabai123WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. SeeSucceeded[root@sc-node2 ~]# ls -la drwx------ 2 root root 25 4月 4 12:07 .docker
再次查看Pod状态:
[root@sc-master1 ~]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEStraefik-599b969746-5xc6r 1/1 Running 0 13m 10.244.119.243 sc-node1
可以看到,node2上的pod也拉取到Harbor私有仓库的镜像了。
~本文完~
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~