概要:要想
k8s
从harbor
中拉取镜像,需要有harbor
的用户、密码、服务器信息,然后在k8s
指定namespace
中创建docker-registry
类型。
前提:已经搭建
K8s
集群、harbor
服务,且已经在机器上配置可以从harbor
中拉取上传镜像。
创建docker-registry
创建docker-registry
,有两种方式,命令行和YAML
.
第一种方式:命令行
kubectl create secret docker-registry test-deri-registry-secret --namespace=test-namespace \
--docker-server=hub.test.org.cn --docker-username=test2019 \
--docker-password=tests12019 --docker-email=admin@harbor.com
第二种方式: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
使用刚刚创建的docker-registry
如何使用刚刚创建的docker-registry
呢?两种方式:
- 一种是每次在创建
pod
或者deployment
时指定imagePullSecrets
, - 一种是在该
namespace
的serviceaccount
【默认default
,如果是别的serviceaccount
,需要在创建pod
时指定spec.serviceAccount
】中指定imagePullSecrets
,这样用该serviceaccount
创建的pod
会自动加上。
spec:
imagePullSecrets:
- name: test-registry-secret
第一种
每次创建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
第二种
以创建namespace
时自动创建的serviceaccount default
为例,首先查看default
的详细情况:
[root@master ~]# kubectl describe sa test-deri -n test-namespace
Name: test-deri
Namespace: test-namespace
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: test-deri-token-rmxbn
Tokens: test-deri-token-rmxbn
Events: <none>
可以看到当前的Image pull secrets: <none>
,需要为它指定成刚刚我们创建的secret
。使用命令:
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: <none>
Annotations: <none>
Image pull secrets: test-registry-secret
Mountable secrets: default-token-5fcn5
Tokens: default-token-5fcn5
Events: <none>
接下来在test-namespace
命名空间下用default
这个serviceaccount
创建的任何pods
容器,都会自动在pod
定义中附加上下面这样的密钥认证信息了。
最后测试一下吧。