[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置
描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快CI/CD流水线速度,从而实现更快的构建与交付,就以作者公司为例,要迭代一个开发的微服务只需要简短的几分钟即可搞定。
我们知道如果你拉取一个公共的镜像仓库中的镜像,例如,拉取一个最新的nginx镜像,那么你只需要在服务器上执行docker pull nginx
命令,但是若是要拉取一个私有镜像仓库中的镜像,例如,docker pull harbor.weiyigeek.top/project/CMS-SpringBoot:latest
命令,那么你可能会遇到无法拉取镜像的问题,那么如何分别在Docker与Kubernetes集群拉取私有容器镜像仓库Harbor? 这便是本文将要分享的内容,希望对大家有所帮助。
假设,作者搭建部署了一套启用了HTTPS的Harbor私有镜像仓库,其域名是https://harbor.weiyigeek.top
,项目名称是project
,私有镜像名称是CMS-SpringBoot:lastest
。
Docker 环境
步骤01.在Docker客户端配置中添加Harbor仓库地址
# 新增 insecure-registries 字段,表示允许不安全的仓库。
vim /etc/docker/daemon.json
"insecure-registries": ["harbor.weiyigeek.top","192.168.12.111:5000"]
步骤02. 从官方文档可知客户端要使用tls与Harbor通信使用的还是
自签证书
,那么必须建立一个目录:/etc/docker/certs.d
,如果配置可能会出现x509: certificate signed by unknown authority
错误提示
# 创建证书目录
mkdir -vp /etc/docker/certs.d/harbor.weiyigeek.top
# 将 harbor.pem 证书文件复制到创建的目录中
cp -a /deployapp/harbor/harbor.pem /etc/docker/certs.d/harbor.weiyigeek.top/harbor.crt
# 将镜像仓库证书文件的所属和所属组设置为root,以及其证书文件的权限设置为600
chown root:root /etc/docker/certs.d/certs.d/harbor.weiyigeek.top/*
chmod -R 600 /etc/docker/certs.d/certs.d/harbor.weiyigeek.top/
步骤03.重载 systemd 以及重启Docker服务
systemctl daemon-reload
systemctl restart docker
步骤04.配置访问私有镜像仓库Harbor的认证信息,验证从私有仓库上传/拉取镜像。
docker login harbor.weiyigeek.top
# Username: weiyigeek
# Password:
# WARNING! Your password will be stored unencrypted in /home/weiyigeek/.docker/config.json.Configure a credential helper to remove this warning. See
# https://docs.docker.com/engine/reference/commandline/login/#credentials-store
# Login Succeeded
# 测试上传
$ docker pull nginx
$ docker tag nginx:latest harbor.weiyigeek.top/project/nginx:latest
$ docker push harbor.weiyigeek.top/project/nginx:latest
# The push refers to repository [harbor.weiyigeek.top/project/nginx:latest]
# 7b5417cae114: Pushed
# aee208b6ccfb: Pushed
# 2f57e21e4365: Pushed
# 2baf69a23d7a: Pushed
# d0fe97fa8b8c: Pushed
# v1.1: digest: sha256:34f3f875e745861ff8a37552ed7eb4b673544d2c56c7cc58f9a9bec5b4b3530e size: 1362
# 测试拉取
$ docker pull harbor.weiyigeek.top/project/nginx:latest
Kubernetes 集群环境
描述:在Kubernetes集群中,我们可以通过部署资源控制器配置的imagePullSecrets
字段,或者使用为serviceaccount
方式来拉取私有镜像仓库中的镜像。
步骤 01.值得注意的是,在Kubernetes集群中不同的容器运行时(CRI)中,配置方式是不同的,例如
若你使用Dockershim作为容器运行时(即Docker环境),那么你需要修改Docekr守护配置文件
/etc/docker/daemon.json
,按照上一章节步骤进行配置即可。若你使用Containerd作为容器运行时,修改
/etc/containerd/config.toml
文件,按照如下方式配置即可。
# 例如, 私有的 harbor.weiyigeek.top 镜像仓库配置
$ mkdir -vp charbor.weiyigeek.top/
$ touch /etc/containerd/certs.d/harbor.weiyigeek.top/hosts.toml
$ vim /etc/containerd/certs.d/harbor.weiyigeek.top/hosts.toml
server = "https://harbor.weiyigeek.top"
[host."https://harbor.weiyigeek.top"]
capabilities = ["pull", "resolve", "push"]
skip_verify = true
# 重启containerd服务
systemctl restart containerd
步骤 02.在集群中使用 secret 资源清单存储镜像仓库的认证信息。
# 方式1.docker-configjson 方式来创建 secret,前提是使用dockershim容器运行时
kubectl create secret generic harbor-secret \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson \
--namespace default
## 方式2.docker-registry 方式来创建 secret(当前主流)
kubectl create secret docker-registry harbor-secret \
--docker-server=harbor.weiyigeek.top \
--docker-username=weiyigeek \
--docker-password=Harbor12345 \
--docker-email=master@weiyigeek.top \
--namespace default
之后,在Kubernetes集群中部署资源时,配置imagePullSecrets
字段即可,操作如下:
apiVersion: v1
kind: Pod
metadata:
name: cms-app
spec:
containers:
- name: cms-app
image: harbor.weiyigeek.top/project/CMS-SpringBoot:lastest # 私有镜像
imagePullSecrets: # 关键点
- name: harbor-secret
或者,你也可以创建并使用serviceaccount
方式来拉取私有镜像仓库中的镜像,操作如下:
# 1.创建一个serviceaccount账户
kubectl create serviceaccount harbor-sa --namespace default
# 2.通过补丁的方式将该服务帐户与 前面创建的 harbor-Secret 关联起来
kubectl patch serviceaccount harbor-sa -p '{"imagePullSecrets": [{"name": "harbor-secret"}]}'
# 或者,你也可以使用 kubectl edit,或者如下所示手动编辑 YAML 清单,打开 sa.yaml 文件,删除带有键名 resourceVersion 的行,添加带有 imagePullSecrets: 的行,最后保存文件。
$ kubectl get serviceaccounts harbor-sa -o yaml > ./sa.yaml
$ vim sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2024-08-07T22:02:39Z
name: harbor-sa
namespace: default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: harbor-sa-token-uudge
imagePullSecrets:
- name: harbor-sa
# 最后,用新的更新的 sa.yaml 文件替换服务账号。
kubectl replace serviceaccount harbor-sa -f ./sa.yaml
然后,在创建的资源清单中,配置serviceAccountName: harbor-sa
字段即可,例如
apiVersion: v1
kind: Pod
metadata:
name: cms-app
spec:
serviceAccountName: harbor-sa # 关键点
containers:
- name: cms-app
image: harbor.weiyigeek.top/project/CMS-SpringBoot:lastest # 私有镜像
好了,今天的分享到此结束,如果觉得文章对你有点帮助,请关注我,点赞分享并留言,谢谢。
若文章写得不错,不要吝惜手中转发,点赞、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!
温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!
如果此篇文章对你有帮助,请你将它转发给更多的人!
学习推荐 往期文章
🔥【最新】运维必学 | 1.从零开始学Shell脚本编程之基础介绍
🔥【最新】运维必学 | 2.从零开始学Shell脚本编程之变量
💡【相关】GitOps实践 | 快速在银河麒麟KylinOS国产系统部署最新Harbor企业私有镜像仓库
💡【相关】记一次在k8s集群搭建的Harbor私有仓库无法提供服务之镜像迁移恢复实践