前置条件
已经安装完成kubernetes集群
已经安装完成harbor
在harbor中创建完成项目,用户,把用户添加到项目的成员当中,成员具有pull镜像的权限
登录到harbor(这个步骤是用来获取**的,yaml创建secret可以使用到)
根据配置的harbor域名,登录到harbor当中,如:
docker login xf.com
输入用户名和密码,即可登录成功。登录完成之后会在config.json文件中保存授权令牌。通过以下命令查看config.json
cat ~/.docker/config.json
文件内容如下:
{
"auths": {
"xf.com": {
"auth": "d2FuZ3hpYW5mZW5xxlhpYW5mZW5nOTk="
}
}
}
在k8s集群中创建一个Secret,包含harbor授权令牌
cat /root/.docker/config.json | base64 -w 0
-w 0 是为了输出不换行。
这个值为 .dockerconfigjson
yaml文件创建secret
通过yaml文件创建
apiVersion: v1
kind: Secret
metadata:
name: registrykey-m3-1
namespace: default
data:
.dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
指令创建secret
当从私有仓库harbor中pull镜像的时候,k8s集群使用类型为docker-registry的Secret进行认证。
现在创建一个Secret,名称为regcred:
kubectl create secret docker-registry regcred
--namespace=<NAME_SPACE>
--docker-server=<your-registry-server>
--docker-username=<your-name>
--docker-password=<your-pword>
--docker-email=<your-email>
your-registry-server 私有docker镜像仓库域名,如xf.com
your-name is your Docker username(用户名).
your-pword is your Docker password(密码).
your-email is your Docker email(注册所用的邮箱).
看一下Secret regcred的详细信息
使用如下命令查看regcred的详细信息
kubectl get secret regcred --output=yaml
或者
kubectl get secret regcred --namespace=<NAME_SPACE> -o yaml
输出类似如下:
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJha...PVGs9In19fQ==
kind: Secret
metadata:
creationTimestamp: 2018-06-27T02:43:53Z
name: regcred
namespace: default
resourceVersion: "3399680"
selfLink: /api/v1/namespaces/default/secrets/regcred
uid: ee450abc-79b3-11e8-b5d7-286ed488c89e
type: kubernetes.io/dockerconfigjson
图中data部分,dockerconfigjson为data的类型,后面的一长串即为进过base64加密的内容,通过解密后,你就会发现,里面的内容基本上就是/root/.docker/config.json中的内容。其中.dockerconfigjson的值包含了登录harbor的用户名和密码等信息,通过以下命令进行查看:
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 -d
用Secret创建一个Pod
创建文件private-reg-pod.yaml,使用Secret regcred
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: xf.com/4a/nginx
imagePullSecrets:
- name: regcred
要从私有仓库pull镜像,k8s需要认证信息,imagePullSecrets这个配置信息指明了k8s需要从名称为regcred的Secret中获取认证信息。然后使用如下命令创建Pod
kubectl create -f private-reg-pod.yaml
kubectl get pod private-reg
需要查看Pod被分配到了哪个节点上,看节点上是否已经成功下载了所需要的镜像。
配置默认规则
如果仅仅是这样的话,每次编写yaml脚本都需要添加imagePullSecrets这2行配置也太麻烦了。
我们需要使其默认就自动可以从私有仓库中下载还需要几步。
创建一个serviceaccout(zzq-serviceaccount.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: zzq-serviceaccount
namespace: zzq
将该regcred**放置到namespace为zzq,serviceaccount为zzq-serviceaccount中:
kubectl patch serviceaccount zzq-serviceaccount --namespace=zzq -p '{"imagePullSecrets": [{"name": "regcred"}]}'
查看 zzq-serviceaccount账号配置:
kubectl get serviceaccounts zzq-serviceaccount --namespace=zzq -o yaml
账户的详细配置如下:
apiVersion: v1
imagePullSecrets:
- name: regcred
kind: ServiceAccount
metadata:
creationTimestamp: "2019-03-13T02:05:45Z"
name: zzq-serviceaccount
namespace: zzq
resourceVersion: "480957"
selfLink: /api/v1/namespaces/zzq/serviceaccounts/zzq-serviceaccount
uid: 83050f1c-4534-11e9-bdda-505bc2d6ffbb
secrets:
- name: zzq-serviceaccount-token-fsr74
我们发现已经添加了imagePullSecrets,这样我们后续就不用在每个yaml脚本中都添加这个配置啦,自动会加上去的。
不同的namespace命名空间secret是隔离的。
使用的时候,只需要在yaml文件中添加:
spec:
serviceAccount: zzq-serviceaccount
containers:
- name: myweb
image: 192.168.10.100/wayne/tomcat:v100
ports:
- containerPort: 80