系列目录html
前面咱们讲解了如何搭建nexus服务器,以及如何使用nexus搭建docker私有镜像仓库,示例中咱们都是手动docker login
登录私服,而后经过命令拉取镜像而后运行容器.然而这种作法在kubernetes集群中是不可行的.第一,项目规模不一样,天天产生的镜像数量也不一样,若是天天产生大量仓库都要手动执行docker pull
来拉取,很是麻烦也很是容易出错.第二,集群规模不一样,节点数量也不一样,少则三五个,多则成百上千甚至更多.咱们一台台拉取显然很是麻烦,即使使用ansible脚本批量执行命令也一样存在问题:由于不一样的容器分布在不一样的节点上.把全部镜像都用批量脚本拉到全部服务器上显然会浪费很是多的资源,而且集群扩容或者缩容器都须要更改脚本,很容易出现错误.这时候咱们更倾向使用kubernetes自身的强大管理功能.其实kubernetes能够把docker的登录信息作成secrets,在容器编排时显式指定要用到的secret,kubernetes就会自动去拉取私服上编排时指定的镜像.大大方便咱们自动化的流程.下面咱们就讲解如何如何制做docker私仓拉取secrets以及如何在拉取镜像时使用.node
咱们在拉取公仓镜像的时候,是不须要输入帐户密码的.可是私仓每每都是要登录之后才能拉取里面的镜像.前面讲解nexus docker私服的时候咱们也讲到过,全部操做的前提就是使用docker login -u 用户名 -p 密码 服务器
首先登录私服.咱们登录过一次后下次再次登录其实不用指定用户名和密码,好比,我可使用如下命令直接登录:linux
[root@k8s-node1 ~]# docker login 192.168.124.43:8002 Authenticating with existing credentials... WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@k8s-node1 ~]#
能够看到没有指定用户名和密码咱们也一样登录了.实际上,咱们首次登录成功后,docker便把登录信息存在了~/.docker/config.json
这个文件里,咱们能够看一下docker
[root@k8s-node1 ~]# . { "auths": { "192.168.124.43:8002": { "auth": "YWRtaW46YWRtaW4xMjM=" } }, "HttpHeaders": { "User-Agent": "Docker-Client/18.09.4 (linux)" } }[root@k8s-node1 ~]#
命令以下json
kubectl create secret generic regcred \ --from-file=.dockerconfigjson= ~/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
以上方法同其它建立kubernetes密钥的方法并无区别,这里的关键是.docker目录下的config.json文件.ubuntu
固然,若是你想对生成出来的secrets有更多的控制,好比指定这个secrets的名称空间,可使用yml文件来声明式建立.步骤与上面略有不一样,以下centos
data字段的名称必须设置为.dockerconfigjson
api
对config.json文件进行base64编码,而后把编码后的内容复制到.dockerconfigjson
字段bash
类型设置为kubernetes.io/dockerconfigjson
服务器
示例:
apiVersion: v1 kind: Secret metadata: name: myregistrykey namespace: awesomeapps data: .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== type: kubernetes.io/dockerconfigjson
经常使用报错解析:
error: no objects passed to create
这意味着base64编码信息无效
Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...
这意味着base64编码成功,可是不能解码为.docker/config.json
上面是使用docker存储的已经登录的信息建立的secret,若是没有使用docker登录,也能够直接经过命令行来建立secret,命令格式以下:
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
下面对上面字段作简要描述:
这里仍然基于前面搭建的nexus docker私仓为例:
kubectl create secret docker-registry regcred --docker-server=192.168.124.43:8002 --docker-username=admin --docker-password=admin123
即可以建立secret了.
可使用如下命令查看刚建立的密钥:
kubectl get secret regcred --output=yaml
[centos@k8s-master trackingapi]$ kubectl get secret regcred --output=yaml apiVersion: v1 data: .dockerconfigjson: eyJhdXRocyI6eyIxOTIuMTY4LjEyNC40Mzo4MDAyIjp7IlVzZXJuYW1lIjoiYWRtaW4iLCJQYXNzd29yZCI6ImFkbWluMTIzIiwiRW1haWwiOiIifX19 kind: Secret metadata: creationTimestamp: "2019-04-12T05:53:19Z" name: regcred namespace: default resourceVersion: "3763835" selfLink: /api/v1/namespaces/default/secrets/regcred uid: 46028dd4-5ce7-11e9-bc12-0050568417a2 type: kubernetes.io/dockerconfigjson [centos@k8s-master trackingapi]$
其中.dockerconfigjson
字段为docker的登录信息,咱们能够经过base64解码来查看它:
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
[centos@k8s-master trackingapi]$ kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode {"auths":{"192.168.124.43:8002":{"Username":"admin","Password":"admin123","Email":""}}}[centos@k8s-master trackingapi]$
能够看到以上正信息与咱们建立密码时输入的信息吻合
注 以上是咱们经过命令行生成的,若是是经过config.json生成的则解码后的信息与以上略有不一样.经过config.json生成的密钥解码后有 个
auth
字段,它仍然是base64编码形式存在的,咱们须要再次对其解码才能查看到信息
好比
[centos@k8s-master trackingapi]$ echo "YWRtaW46YWRtaW4xMjM="|base64 --decode admin:admin123 [centos@k8s-master trackingapi]$
编排文件示例以下:
apiVersion: v1 kind: Pod metadata: name: ubuntu-demo spec: restartPolicy: Never containers: - name: u-demo image: 192.168.124.43:8002/ubuntu imagePullPolicy: IfNotPresent command: ["printenv"] args: ["HOSTNAME"] imagePullSecrets: - name: regcred
以上示例咱们使用了预先上传到私服里的一个ubuntu镜像来建立一个pod,因为以上镜像建立完成后立刻就结束了.所以咱们让打印一个环境变量信息,而后再使用log命令来查看,以证实操做是成功的.
镜像建立完成之后,咱们查看pod的状态
[centos@k8s-master trackingapi]$ kubectl get po NAME READY STATUS RESTARTS AGE busybox 1/1 Running 552 23d consul-0 1/1 Running 2 28h consul-1 1/1 Running 3 28h consul-2 1/1 Running 2 28h helloworld-7fdc8d9855-ncfdz 1/1 Running 3 30d hostaliases-pod 1/1 Running 0 3h42m ubuntu-demo 0/1 Completed 0 50m
能够看到pod已处于完成状态,咱们使用kubectl logs
来查看它是否打印了信息
[centos@k8s-master trackingapi]$ kubectl logs ubuntu-demo ubuntu-demo
能够看到,输出了host的名称.