..

【翻译】k8s 从私有仓库获取镜像

原文地址: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

这篇文章将会教你在创建 pod 的时候如何正确从私有仓库获取镜像。

开始之前

你需要有一个 K8S 集群,并且安装配置好了 kubectl ,命令行能够访问你的集群。如果你还没有安装好 K8S ,那么请使用 minikube 安装, 或者使用我们为你准备好的集群

检查版本信息 kubectl version, 在执行这个训练之前,你还需要有一个能登录 docker 私有仓库的账号。

登录 docker 仓库

在你的本地机器,你必须先登录 docker 仓库,才能获得 pull 私有仓库镜像的权限。

docker login {host} 会提示输入账号密码, 登录成功以后会更新 $HOME/.docker/config.json 配置文件。使用 cat 查看文件内容: cat ~/.docker/config.json 会输入类似如下的内容

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "c3R...zE2"
        }
    }
}

该文件中保存了登录的 token 信息。

基于已经存在的 token 认证文件创建 K8S secret

K8S 在 pull 镜像的时候会使用 docker 的登录认证信息来认证私有仓库的权限。如果你已经执行过 docker login ,并且登录成功,那么你可以将 token 信息复制到 K8S 集群中:

kubectl create secret generic <secret-name> \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

如果你想在创建 secret 的时候设置 namespace 或者 label , 那么你可以遵循一下步骤:

  • 设置数据项目的名称 .dockerconfigjson
  • 将配置文件的信息 base64 编码,并且复制粘贴在 data[.dockerconfigjson]中
  • 设置 secret 类型为 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 文件。

使用账号密码创建 K8S secret

创建一个名字叫做regcred的 secret

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

说明:

  • <your-registry-server>  私有镜像仓库的域名和端口
  • <your-name>        私有镜像仓库的登录用户用户名
  • <your-pword>        私有登录仓库的登录密码
  • <your-email>        你的仓库对应邮箱

现在你已经成功的使用的你的账号密码在 K8S 中创建了一个叫做 regcred 的 secret

在命令行创建 secret 的时候,你的账号和密码不会被隐藏,这意味这其他使用这台电脑的人通过 history 命令也能看到你的密码。

查看 K8S secret 内容

查看刚刚创建的 secret , 通过如下命令将他格式化为 yml 格式:

kubectl get secret regcred --output=yaml

输出内容类似如下:

apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

.dockerconfigjson 的值是 `~/.docker/config.json`文件内容 base64 编码以后的结果。

将它 base64 解码看一下:

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

输出结果类似如下:

{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}

为了理解 auth 字段的信息,将它 base64 解码:

echo "c3R...zE2" | base64 --decode

输出是一个 : 分割的两个字符串,类似如下:

janedoe:xxxxxxxxxxx

这其实就是账号密码的的 base64 编码格式。

使用 secret 创建一个 pod

这里使用刚刚创建的 scret 来创建 pod 的配置文件

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

下载这个文件

wget -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml

里面的镜像仓库地址替换成我们的私有仓库的地址,执行

kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg

能看到已经成功获取到了镜像,并且成功创建了 pod 。