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コマンドで確認したら、以下のエラーメッセージが見つかりました。
Dockerをする時、多くの友達が自分のPrivate Registryを構築したことがあります。Dockerは、baic auth方式で認証を行うPrivate Registryにアクセスして、現地でdocker loginを実行するだけで、ユーザー名とパスワードを入力すると、Registry Pushイメージやpullイメージに自由に現地に行くことができます。
実際の効果はどうですか?私たちはPod yamlを作成して、runが起きるかどうかテストします。
方法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を提供する必要があります。
もし一つのpodの中に異なる私有倉庫からの鏡像があるとしたら、どうすればいいですか?クbectl create secret docker-registryを通じて、私達は一回に一回だけregistrykeyを作ることができます。二つのミラー倉庫を訪問するなら、それぞれの倉庫のためにregistrykeyを作る必要があります。gzhoo.aliyuncs.com/xxxx/test:
このPodを作成:
四、方法3:secret yamlファイルを通じてpull puwuplicpath用のsecretを作成する。
上記のクベルクによって、簡単にPull puwuplicpath用のsecretを作成できるほか、従来の手段であるyaml記述ファイルを使って、私たちが必要とするsecretリソースを作成することもできます。
registrykey-m 3-1 secretを作成します。
次に、registrykey-m 3-1を参照したPodを作成します。
この方法はどのように対応していますか?複数のミラー倉庫containerからのPodを含んでいますか?ここの考え方と方法は少し違っています。2つ以上のsecretを作成して引用する必要はありません。複数のプライベートミラー倉庫にアクセスできるsecretを作成します。複数のミラー倉庫のアクセス許可列を全部入れます。docker/config.json:
方法1の紹介によって、まずlogin registry.cn-hangzhoo.aliyuncs.com/xxxx/rbd-ret-appiを獲得し、config.jsonを以下の通りとします。
五、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:
公式リンク: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作成成功!