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

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

一,观察理解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"] }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值