kubernetes实战篇之建立密钥自动拉取私服镜像

系列目录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 ~]#

基于现有docker登录信息建立kubernetes密钥

命令以下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字段的名称必须设置为.dockerconfigjsonapi

  • 对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

直接从命令行建立secret

上面是使用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>

下面对上面字段作简要描述:

  • docker私服地址

  • 登录名

  • 登录密码

  • 邮箱,此字段为非必填项

这里仍然基于前面搭建的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]$

建立pod使用密钥拉取私仓镜像

编排文件示例以下:

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的名称.

相关文章
相关标签/搜索