前置条件

已经安装完成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

PS:需要注意这里必须要激活ServiceAccount,否则会报错。

在这里插入图片描述

Logo

开源、云原生的融合云平台

更多推荐