前提:已经搭建K8s集群、harbor服务,且已经在机器上配置可以从harbor中拉取上传镜像。
概要:要想k8s从harbor中拉取镜像,需要有harbor的用户、密码、服务器信息,然后在k8s指定namespace中创建docker-registry类型。
第一种方式:命令行
kubectl create secret docker-registry test-deri-registry-secret --namespace=test-namespace \
--docker-server=hub.test.org.cn --docker-username=test2019 \
--docker-password=tests12019 [email protected]
第二种方式:YAML,需要有一台已经成功登录过harbor服务器的机器,使用命令'cat ~/.docker/config.json',确认是否有harbor服务器的认证信息,例如
{
"auths": {
"hub.test.org.cn:443": {
"auth": "YWRtaW46RGVxasdXXnsada"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.4 (linux)"
}
}
接下来k8s也可以直接使用该认证信息,使用命令'cat ~/.docker/config.json |base64 -w 0'将该认证信息BASE64编码【以下示例结果都是瞎写的,请使用自己返回的结果】。
[root@master ~]# cat .docker/config.json |base64 -w 0
ewoJImF1dGhzIjogewoJCSJodWIuZGVyaS5vcmcuY246NDQzIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NlJHVnlhU015TURFNSIKCHIUASDGUGDUGAUDUIAGDJIIGIUDZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkSDISDhi7asd56523gHGSGH
编写test-registry-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: test-registry-secret
namespace: test-deri
data:
.dockerconfigjson: wraJImF1dGhzIjogeraJCSIxOTIuMTY4LjEzMC4yMyI6IHsKCQkJImF1dGgiOiAiYW5OaVpHVjJaV3h2Y0dWeU9rcHpZakV5TXpRMSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuMiAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson
使用命令'kubectl create -f test-registry-secret.yaml'或者在dashboard中用上述YAML即可创建docker-registry。
使用命令查看结果
kubectl get secret -n test-namespace
kubectl describe secret test-registry-secret -n test-namespace
spec:
imagePullSecrets:
- name: test-registry-secret
以创建namespace时自动创建的serviceaccount default为例,首先查看default的详细情况
[root@master ~]# kubectl describe sa test-deri -n test-namespace
Name: test-deri
Namespace: test-namespace
Labels:
Annotations:
Image pull secrets:
Mountable secrets: test-deri-token-rmxbn
Tokens: test-deri-token-rmxbn
Events:
可以看到当前的Image pull secrets:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "test-registry-secret"}]}' -n test-namespace
或者使用命令
kubectl edit sa default -n test-namespace
在打开的YAML文件中添加两行,保存退出。
imagePullSecrets:
- name: test-registry-secret
最后再次查看default的详细情况,可以看到Image pull secrets: test-registry-secret
[root@master ~]# kubectl describe sa default -n test-namespace
Name: default
Namespace: test-namespace
Labels:
Annotations:
Image pull secrets: test-registry-secret
Mountable secrets: default-token-5fcn5
Tokens: default-token-5fcn5
Events:
接下来在test-namespace命名空间下用default这个serviceaccount创建的任何pods容器,都会自动在pod定义中附加上下面这样的密钥认证信息了。
另一种方式,每次创建pod时指定secret,例如
apiVersion: v1
kind: Pod
metadata:
name: test-baresystem
namespace: test-namespace
spec:
containers:
- name: test-baresystem
image: hub.test.org.cn/dev-project/centos6-bare-system:v0
ports:
- containerPort: 8080
hostPort: 30001
imagePullSecrets:
- name: test-registry-secret
最后测试一下吧。