KubergnetesがPrivate Registryから容器の鏡像を引き出す方法

18398 ワード

原文のリンク:http://tonybai.com/2016/11/16/how-to-pull-p_w_picpaths-from-prvate-registry-on-kubergnetes-cluster/?utm_source=rss
公式リンク:https://kubernetes.io/docs/concepts/containers/p_w_picpaths/萶using-a-prvate-registry
Private Registryをk 8 sで引くと、エルImagePull、ImagePurBackOffなどのPod statusに出会います。クベルクdescribe pod/MyPodコマンドで確認したら、以下のエラーメッセージが見つかりました。
  23s    5s    2    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api}    Warning    Failed        Failed to pull p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest": p_w_picpath pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request.  details: (Error: p_w_picpath xxxx/rbd-rest-api:latest not found)
方法1:Node上の配置を利用してPrivate Registryにアクセスする
Dockerをする時、多くの友達が自分のPrivate Registryを構築したことがあります。Dockerは、baic auth方式で認証を行うPrivate Registryにアクセスして、現地でdocker loginを実行するだけで、ユーザー名とパスワードを入力すると、Registry Pushイメージやpullイメージに自由に現地に行くことができます。
# docker login registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api
Username: {UserName}
Password:
Login Succeeded
このプロセスが終わると、Dockerは実際に~/.dockerディレクトリの下でconfig.jsonファイルを作成し、その後Registryと対話する過程で使用する鑑権列を保存します。
# cat ~/.docker/config.json
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "xxxxyyyyzzzz"
        }
    }
}
一つのNodeにこの構成があったら、K 8 sはdockerを通じて直接Private Registryにアクセスできます。これはK 8 s文書の中で私有のミラー倉庫と相互作用する最初の方法です。PodがクラスタのいずれかのNodeにスケジューリングされることができることを考慮して、各Node上で上述のlogin動作を実行する必要があるか、または簡単に~/.docker/config.json scpを各node上の~/.dockerディレクトリの下に実行することができる。
実際の効果はどうですか?私たちはPod yamlを作成して、runが起きるかどうかテストします。
//rbd-rest-api-using-node-config.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-using-node-config
spec:
  containers:
  - name: rbd-rest-api-using-node-config
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
このPodを作成してpodの作成状態を確認します。
# kubectl create -f rbd-rest-api-using-node-config.yaml
pod "rbd-rest-api-using-node-config" created
# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
rbd-rest-api-using-node-config   0/1       ErrImagePull       0          5s
describeを通じてPodの失敗の詳細を調べます。
# kubectl describe pod/rbd-rest-api-using-node-config
... ...

Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                    Type        Reason        Message
  ---------    --------    -----    ----            -------------                    --------    ------        -------
  1m        1m        1    {default-scheduler }                            Normal        Scheduled    Successfully assigned rbd-rest-api-using-node-config to 10.66.181.146
  1m        42s        3    {kubelet 10.66.181.146}    spec.containers{rbd-rest-api-using-node-config}    Normal        Pulling        pulling p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        42s        3    {kubelet 10.66.181.146}    spec.containers{rbd-rest-api-using-node-config}    Warning        Failed        Failed to pull p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest": p_w_picpath pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request.  details: (Error: p_w_picpath xxxx/rbd-rest-api:latest not found)
  1m        42s        3    {kubelet 10.66.181.146}                            Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "rbd-rest-api-using-node-config" with ErrImagePull: "p_w_picpath pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request.  details: (Error: p_w_picpath xxxx/rbd-rest-api:latest not found)"
... ...
この方法は私たちの環境には効果的ではない。そして何度もテストした結果、K 8 sはPrivate Registryから私達が欲しいイメージファイルを取得できませんでした。
方法2:クベックスを通じてdocker-registryのsecretを作成する
K 8 sが提供する第二の方法は、クベックスを通じてdocker-registryのsecretを作成し、Pod記述ファイルでsecretを引用してPrivate Registry Pule Imageの目的を達成することである。
操作する前に、まず各Nodeのdocker/config.jsonを削除します。
kubectl create secret docker-registryを実行する時はprvate registryの訪問UserNameとPasswordを提供する必要があります。
# kubectl create secret docker-registry registrykey-m2-1 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api --docker-username={UserName} --docker-password={Password} [email protected]
secret "registrykey-m2-1" created

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         29s
secret:registrykey-m 2-1の作成に成功しました。このsecretのオブジェクトを引用したPodがPull Imageに成功してRunに起きるかどうかをテストします。Pod yamlファイルは以下の通りです。
//rbd-rest-api-registrykey-m2-1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m2-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m2-1
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
  p_w_picpathPullSecrets:
  - name: registrykey-m2-1
Podを作成し、Podの状態を観察します。
# kubectl create -f rbd-rest-api-registrykey-m2-1.yaml
pod "rbd-rest-api-registrykey-m2-1" created

# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m2-1    1/1       Running            0          7s
rbd-rest-api-using-node-config   0/1       ImagePullBackOff   0          29m
describe podを通じて、作成されたイベントシーケンスを調べます。
Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                    Type        Reason        Message
  ---------    --------    -----    ----            -------------                    --------    ------        -------
  1m        1m        1    {default-scheduler }                            Normal        Scheduled    Successfully assigned rbd-rest-api-registrykey-m2-1 to 10.57.136.60
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Pulling        pulling p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Pulled        Successfully pulled p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Created        Created container with docker id d842565e762d
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Started        Started container with docker id d842565e762d
私たちが望むように、secret:registrykey-m 2-1のPodを引用してRunに成功しました。
もし一つのpodの中に異なる私有倉庫からの鏡像があるとしたら、どうすればいいですか?クbectl create secret docker-registryを通じて、私達は一回に一回だけregistrykeyを作ることができます。二つのミラー倉庫を訪問するなら、それぞれの倉庫のためにregistrykeyを作る必要があります。gzhoo.aliyuncs.com/xxxx/test:
# kubectl create secret docker-registry registrykey-m2-2 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/test --docker-username={UserName} --docker-password={Password} [email protected]
secret "registrykey-m2-2" created

root@node1:~/pullp_w_picpathtest/test# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         6s
次に、複数のcontainerを含むPodを作ります。
//rbd-rest-api-multi-registrykeys-m2-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-multi-registrykeys-m2-2
spec:
  containers:
  - name: rbd-rest-api-multi-registrykeys-m2-2
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
  - name: test-multi-registrykeys-m2-2
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest
    p_w_picpathPullPolicy: Always
    command:
       - "tail"
       - "-f"
       - "/var/log/bootstrap.log"
  p_w_picpathPullSecrets:
  - name: registrykey-m2-1
  - name: registrykey-m2-2
secret引用では、二つのkeyを引用しています。
このPodを作成:
# kubectl create -f rbd-rest-api-multi-registrykeys-m2-2.yaml
pod "rbd-rest-api-multi-registrykeys-m2-2" created

# kubectl get pod
NAME                                   READY     STATUS             RESTARTS   AGE
rbd-rest-api-multi-registrykeys-m2-2   2/2       Running            0          5s
podのイベントを通して、起動の操作手順を確認します。
Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                        Type        Reason        Message
  ---------    --------    -----    ----            -------------                        --------    ------        -------
  44s        44s        1    {default-scheduler }                                Normal        Scheduled    Successfully assigned rbd-rest-api-multi-registrykeys-m2-2 to 10.57.136.60
  43s        43s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Pulling        pulling p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  43s        43s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Pulled        Successfully pulled p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Created        Created container with docker id 7c09048a41f6
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Started        Started container with docker id 7c09048a41f6
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Pulling        pulling p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Pulled        Successfully pulled p_w_picpath "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Created        Created container with docker id 9930834fe4a3
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Started        Started container with docker id 9930834fe4a3
K 8 sはそれぞれ二つのミラー倉庫からpuwuplicpathを試しました。そしてついに成功しました。
四、方法3:secret yamlファイルを通じてpull puwuplicpath用のsecretを作成する。
上記のクベルクによって、簡単にPull puwuplicpath用のsecretを作成できるほか、従来の手段であるyaml記述ファイルを使って、私たちが必要とするsecretリソースを作成することもできます。
//registrykey-m3-1.yaml
apiVersion: v1
kind: Secret
metadata:
  name: registrykey-m3-1
  namespace: default
data:
    .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson
docker loginは~/.dockerの下にconfig.jsonファイル保存鑑権列を作成すると前に言いましたが、ここでsecret yamlの.dockerconfigjsonの後のデータはそのjsonファイルのbase 64符号化出力です。
registrykey-m 3-1 secretを作成します。
# kubectl create -f registrykey-m3-1.yaml
secret "registrykey-m3-1" created

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
myregistrykey3        kubernetes.io/dockerconfigjson        1         3h
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         23m
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         29s
対照的に、クbectlとyamlを通じて作成された二つのregistrykey secretのタイプは少し違っています。前者はクベルネテs.io/dockercfgで、後者はクベルネテs.io/dockerconfigjsonです。
次に、registrykey-m 3-1を参照したPodを作成します。
//rbd-rest-api-registrykey-m3-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m3-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m3-1
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
  p_w_picpathPullSecrets:
  - name: registrykey-m3-1
Podを作成:
# kubectl create -f rbd-rest-api-registrykey-m3-1.yaml
pod "rbd-rest-api-registrykey-m3-1" created
# kubectl get pods
NAME                            READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m3-1   1/1       Running            0          8s
作成に成功しました
この方法はどのように対応していますか?複数のミラー倉庫containerからのPodを含んでいますか?ここの考え方と方法は少し違っています。2つ以上のsecretを作成して引用する必要はありません。複数のプライベートミラー倉庫にアクセスできるsecretを作成します。複数のミラー倉庫のアクセス許可列を全部入れます。docker/config.json:
方法1の紹介によって、まずlogin registry.cn-hangzhoo.aliyuncs.com/xxxx/rbd-ret-appiを獲得し、config.jsonを以下の通りとします。
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "....  ...."
        }
    }
}
私達はまたlogin registry.cn-hangzhou.aliyuncs.com/xxxx/testを獲得して、config.jsonは以下の通りです。
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "....  ...."
        },
        "registry.cn-hangzhou.aliyuncs.com/xxxx/test": {
            "auth": "....  ...."
        }
    }
}
Dockerが自動的に新しいloginのprvate registryのライセンスを同じconfig.jsonに登録したのを見ました。今はこの二つのライブラリ認証串を含むconfig.jsonに基づいて新しいsecretを作成します。registrykey-m 3-2:
//registrykey-m3-2.yaml

apiVersion: v1
kind: Secret
metadata:
  name: registrykey-m3-2
  namespace: default
data:
  .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson
secretを作成:registrykey-m 3-2
# kubectl create -f registrykey-m3-2.yaml
secret "registrykey-m3-2" created

# kubectl get secrets
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         42m
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         19m
registrykey-m3-2      kubernetes.io/dockerconfigjson        1         6s
私たちは二つの容器を含んで編集します。secret「registrykey-m 3-2」のPod yamlを参照してください。
//rbd-rest-api-multi-registrykeys-m3-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-multi-registrykeys-m3-2
spec:
  containers:
  - name: rbd-rest-api-multi-registrykeys-m3-2
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
  - name: test-multi-registrykeys-m3-2
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest
    p_w_picpathPullPolicy: Always
    command:
       - "tail"
       - "-f"
       - "/var/log/bootstrap.log"
  p_w_picpathPullSecrets:
  - name: registrykey-m3-2
このPodを作成:
# kubectl create -f rbd-rest-api-multi-registrykeys-m3-2.yaml
pod "rbd-rest-api-multi-registrykeys-m3-2" created

# kubectl get pod
NAME                                   READY     STATUS             RESTARTS   AGE
rbd-rest-api-multi-registrykeys-m3-2   2/2       Running            0          4s
Pod作成成功
五、APIを呼び出してregistrykey secretを作成する
方法2と方法3を比較して、方法2はより簡潔で、方法3はより強大である。しかし、どの製品でもsecretはマニュアルで作成されるべきではない。この場合、APIはregistrykey secretを作成することが必要だ。APIを通じて作成することを選択すると、方法2の原理に従って、config.jsonの中の内容をAPIで要求されたBodypt 8 Posevに与えることが明らかになる。あなた
どうやってリモートでconfig.jsonの内容を構築しますか?そしてsecret yamlの中で.dockerconfigjsonの値データを構築しますか?私達はconfig.jsonのコースを発見しました。唯一不確定なのはprvate repositoryの下のauth列です。じゃ、この列は何ですか?あなたはビッグbase 64-d:
# echo -n "VXNlck5hbWU6UGFzc3dvcmQ="|base64 -d
UserName:Password
はい、実質的にこのauth列はUserName:Passwordのbaser 64符号化値です。そのため、まずある倉庫のUserNameとPasswordを使って、UserName:Passwordというフォーマットでbaser 64符号化します。符号化の結果値を利用してjson内容を構成します。
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "VXNlck5hbWU6UGFzc3dvcmQ="
        }
}
その後、このjsonデータをbasecret 64符号化します。得られた値はsecret yamlの中の.dockerconfigjsonの値データです。これでAPIを通じてsecretを作成します。
$ curl -v -H "Content-type: application/json"  -X POST -d ' {
  "apiVersion": "v1",
  "kind": "Secret",
  "metadata": {
    "name": "registrykey-m4-1",
    "namespace": "default"
  },
  "data": {
    ".dockerconfigjson": "{cat ~/.docker/config.json |base64 -w 0}"
  },
  "type": "kubernetes.io/dockerconfigjson"
}' http://10.57.136.60:8080/api/v1/namespaces/default/secrets

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         2h
registrykey-m2-2      kubernetes.io/dockercfg               1         1h
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         43m
registrykey-m3-2      kubernetes.io/dockerconfigjson        1         24m
registrykey-m4-1      kubernetes.io/dockerconfigjson        1         18s
registrykey-m 4-1に基づいて、Podを起動します。
//rbd-rest-api-registrykey-m4-1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m4-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m4-1
    p_w_picpath: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    p_w_picpathPullPolicy: Always
  p_w_picpathPullSecrets:
  - name: registrykey-m4-1

# kubectl create -f rbd-rest-api-registrykey-m4-1.yaml
pod "rbd-rest-api-registrykey-m4-1" created

# kubectl get pod
NAME                            READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m4-1   1/1       Running            0          5s
Pod作成成功!