kubernetes私有仓库+k8s拉取+secret认证

您所在的位置:网站首页 k8s拉取镜像流程 kubernetes私有仓库+k8s拉取+secret认证

kubernetes私有仓库+k8s拉取+secret认证

2024-03-30 04:24| 来源: 网络整理| 查看: 265

首先声明,网上一些文档仅供学习使用,或多或少简化了安全证书相关的步骤。但是!!实际工作中,安全证书非常有必要。所以这里强调:准备工作一定要有域名,有安全证书,有docker用户密码!

目录 一,观察理解run镜像仓库的命令参数1.1 创建好registry以后1.1.1 push镜像,报错:没有授权1.1.2 push镜像,报错:不被信任的证书 1.2 如何在集群其他的机器(不是仓库所在的宿主机)上传镜像1.3 如何让k8s能够顺利的从私有仓库拉取镜像步骤如下1.3.1 将docker登录仓库的认证信息,用base64加密1.3.2 用加密过的信息创建secret,等待被调取、使用。1.3.3 生成secret1.3.4 开始使用secret 官方文档中关于secret的创建与消费无证书启动registry,用于学习测试

一,观察理解run镜像仓库的命令参数

再次强调证书,auth认证文件要准备好 不难看出,下列容器创建命令中定义了 1、证书放在/k8s/images_hub_cert下,映射到容器内/cert 2、auth认证文件放在/k8s/images_hub_auth下,映射到容器内/auth 3、私有镜像文件存放在/k8s/images_hub_data下,映射到容器内/registry 4、单独注意一下 -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \这条指令 告诉容器,认证文件在容器内部的/auth/htpasswd找。这时你可能会想,这个文件我去哪里给他?

答案是 我们要事先自己创建好,放到宿主机的/k8s/images_hub_auth下(因为已经映射出来了) 所以要先建立目录

mkdir -p /k8s/{images_hub_certs,images_hub_auth,images_hub_data}

然后设置仓库的账号密码

docker run --entrypoint htpasswd registry:2.7.0 -Bbn USERNAME PASSWORD > /k8s/images_hub_auth/htpasswd

现在可以安心的起容器了

docker run -itd -p 5000:5000 --restart=always --name alfred_uat_registry \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v /k8s/images_hub_certs:/certs \ -v /k8s/images_hub_auth:/auth \ -v /k8s/images_hub_data:/var/lib/registry \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/alfred-uat-images.pakpobox.com.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/alfred-uat-images.pakpobox.com.key \ --restart=always \ registry:latest 1.1 创建好registry以后 1.1.1 push镜像,报错:没有授权

在这里插入图片描述

1.1.2 push镜像,报错:不被信任的证书

如果用的自签证书,他会先报一次x509:不被信任的证书 大概长得这样的 在这里插入图片描述 要解决这个问题,我们需要新建个目录

mkdir -p /etc/docker/certs.d/你的域名:5000

然后将自签证书的crt文件拷贝到上面的路径下,并且重命名为ca.crt 你说你没有自签证书?不知道怎么创建自签证书?? 来!开袋即食版自签证书:

openssl req -newkey rsa:4096 -nodes -sha256 -keyout DOMAIN-NAME.key -x509 -days 3650 -out DOMAIN-NAME.crt

再然后,重启docker服务

systemctl restart docker 1.2 如何在集群其他的机器(不是仓库所在的宿主机)上传镜像

你需要把上面生成的证书,拷贝到本地的/etc/docker/certs.d/你的域名:5000 目录下

现在 回来老老实实登录

docker login -u USERNAME -p PASSWD 域名:端口(5000)

在这里插入图片描述 再次推送,成功! 在这里插入图片描述

1.3 如何让k8s能够顺利的从私有仓库拉取镜像

其实做到这里你会发现,执行过docker login 的宿主机,之后无论推拉镜像都是不需要再次验证的。 换而言之,如果你机器少,可以采用这种不优雅的,low的方法----慢慢的一个个手动登录。 但是 我们要目光长远,要操作优雅 创建k8s的保密字典来自动完成验证,这个资源叫做secret。

前面说到,只要我们在任意node上执行 docker login 验证后面就不需要再次验证了。这是为什么呢? 因为

我们验证的时候会生成一个文件 /root/.docker/config.json ,

所以 每次我们推拉镜像的时候,docker.service会帮我自动验证。 同理 我们的k8s也可以把这个文件利用起来。

步骤如下 1.3.1 将docker登录仓库的认证信息,用base64加密 cat /root/.docker/config.json|base64 -w 0

命令末尾加上 -w 0 是因为等会我们要用这段base64的时候,所有的换行符、制表符都是无效的。一定一定要去除,这个-w 0可以帮我去掉换行符。(注意!!官方文档提示我们:创建secret可以用yaml也可以用json,但是编码必须是base64!!!) 得到base64编码,输出大概是这样: 在这里插入图片描述

1.3.2 用加密过的信息创建secret,等待被调取、使用。 apiVersion: v1 kind: Secret metadata: name: registrykey-pakpobox namespace: default type: kubernetes.io/dockerconfigjson data: .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJpbWFnZXMucGFrcG9ib3guY29tIjogewoJCQkiYXV0aCI6ICJjR0ZyY0c5aWIzZzZVR0ZyY0c5aWIzZ3lNREU1IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOC4wOS4yIChsaW51eCkiCgl9Cn0= 1.3.3 生成secret kubectl create -f xx_secret.yaml 1.3.4 开始使用secret

在你的deployment或者pod的yaml文件里, 主要记得两点: (1)放在pod规格里; (2)跟containers同级,就是要对齐的意思; (3)怕时间长了看不懂,强调一下,关键作用的指令是imagePullSecrets 在这里插入图片描述 简单理解:加一个“镜像拉取密码”的选项,并在选项下写好我要用到叫哪个名字的secret。

遇到一次,mysql-pod起不来,重建secret后再重建mysql-pod,问题解决

官方文档中关于secret的创建与消费

创建secret: 3.1把你要的用户名和密码转成base64

echo -n "admin" | base64 YWRtaW4= echo -n "1f2d1e2e67df" | base64 MWYyZDFlMmU2N2Rm

3.2然后创建一个secret.yaml文件

apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm

3.3在创建deployment的yaml文件中引用:我们暂时只看-env环境变量的方式;截图来自官方文档https://kubernetes.io/zh/docs/concepts/configuration/secret/#%E6%89%8B%E5%8A%A8%E5%88%9B%E5%BB%BA-secret

在这里插入图片描述 3.4理解 假设我们用上图的yaml创建了一个pod,那么在这个pod的容器中,我们执行

echo $SECRET_USERNAME echo $SECRET_PASSWORD

得到的输出会是这样 -连起来看

在这里插入图片描述

举个例子: 如果你在上图中第三步的env下-name 写了MYSQL_ROOT_PASSWORD,那么在你创建出来的pod里的容器中,MYSQL_ROOT_PASSWORD就是已经被赋值了,值是多少?请再看一遍图就知道了。

无证书启动registry,用于学习测试 docker run -itd -p 5000:5000 --restart=always --name registry \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v /root/docker/registry/certs:/certs \ -v /root/docker/registry/auth:/auth \ -v /root/docker/registry/data:/var/lib/registry \ --restart=always \ registry:latest

如上启动registry后,使用docker login 会报错 在这里插入图片描述 因为此时registry服务端是http,而客户端是https

解决办法:在/etc/docker/daemon.json 加入

{ "insecure-registries":["192.168.1.120:5000"] }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3