【翻译】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 。