Edited at

IBM Cloud 他リージョンやDocker Hubのプライベートのレジストリからk8sへデプロイする方法

More than 1 year has passed since last update.

IBM Cloud k8s は、北米、欧州、豪州、韓国、東京などで展開しているのですが、レジストリ・サービスも、各リージョンに配置されていて、デフォルトでは、その地域のレジストリ・サービスを利用する様になります。 しかし、他地域に展開したり、マルチクラウドを考慮すると、レジストリ・サービスは、一箇所にしたいということもあります。 そこで、他リージョンのレジストリを利用する方法、そして、Docker Hub のレジストリを利用する方法についてのメモです。


他リージョンのレジストリ・サービスを利用してデプロイする

US南部のレジストリ・サービスからコンテナ・イメージをプルして、東京DCのk8sのクラスタへデプロイするケースについて書いてみます。


US南部レジストリ・サービスのトークンを取得

利用したいコンテナが保存されているレジストリから、トークンを取り出します。

bx loginした後に、レジストリ・サービスを北米南部(us-south)に指定して、レジストリ・サービスへログインします。

bx cr region-set us-south

リージョンを設定して、us-southにログイン

bx cr login

us-southのレジストリ・サービスをアクセスするために、トークンの値を取得します。bx cr token-listでトークンIDのリストを取得します。そのリージョンにk8sクラスタが作られた事があれば、そのクラスタ名でトークンが生成されています。 bx cr token-get トークンIDで、認証に利用するトークン値を取り出します。

bx cr token-list

<中略>
トークン ID 読み取り専用 有効期限 説明
182e86d5-91e0-5876-99f9-ff7b1ce6a8b6 true 0 mycluster2
<中略>

bx cr token-get 182e86d5-91e0-5876-99f9-ff7b1ce6a8b6
固有 ID が「182e86d5-91e0-5876-99f9-ff7b1ce6a8b6」のレジストリー・トークンを取得中...

トークン ID 182e86d5-91e0-5876-99f9-ff7b1ce6a8b6
トークン eyJhbGciOiJI<以下省略>


東京DCのk8sクラスタへUS南部レジストリのトークンを登録

次に、東京データセンターに接続したkubectlの環境をセットアップします。手順は以下のようになります。



  • bx login IBMクラウドへログイン


  • bx cs init --host https://ap-north.containers.bluemix.net 東京DCへ接続


  • bx cs clusters クラスタのリストを表示


  • bx cs cluster-config < my cluster name > kubectlで必要な認証情報を取得


  • export KUBECONFIG=... 上記で表示された環境変数を設置


  • kubectl get node 確認のため、クラスタのノード構成を表示

準備ができたら、kubectl で 認証情報を確認したシークレットを登録します。 この例では、us-southがシークレットのラベルになります。このラベルをk8sのデプロイに用いるYAMLファイルに指定することで、ユーザーIDとパスワードを知られることなく、設定する事ができます。

$ kubectl --namespace default create secret docker-registry us-south \

--docker-server=registry.ng.bluemix.net \
--docker-username=token \
--docker-password=eyJhbGciOiJI<以下省略> \
--docker-email=takara@jp.ibm.com

上記の\記号は、行の続きを意味する記号です。

その他の項目を以下に解説します。



  • create secret docker-registryは、コンテナ・レジストリのシークレットを生成することを指示します


  • --docker-server= レジストリ・サービスのアドレス


  • --docker-username=token ユーザー名は token で固定です。


  • --docker-password= パスワードには トークンをセットします。


  • --docker-email= は必須項目なのですが、特に何もしていません。 会社のメアドをセットしておきます。

これを実行した後、確認するには、次のコマンドを実行します。

$ kubectl get secret

NAME TYPE DATA AGE
<中略>
us-south kubernetes.io/dockercfg 1 1h


東京DCでデプロイ実行

東京DCにデプロイするためのYAMLを以下に示します。 ポイントは、14行目 image:で、米国南部のレジストリに登録されたコンテナを指定します。次に、17行目 imagePullSecrets:name: で先にラベルを付けた us-south を指定します。 これで、レジストリをアクセスするために必要なトークンをYAMLファイルに記載しないで、認証を実行する事ができる様になります。


south_rs.yaml

     1  apiVersion: extensions/v1beta1

2 kind: Deployment
3 metadata:
4 name: nginx-deployment
5 spec:
6 replicas: 3
7 template:
8 metadata:
9 labels:
10 app: nginx
11 spec:
12 containers:
13 - name: nginx
14 image: registry.ng.bluemix.net/takara/web:v3
15 ports:
16 - containerPort: 80
17 imagePullSecrets:
18 - name: us-south
19
20 ---
21 apiVersion: v1
22 kind: Service
23 metadata:
24 name: nginx-svc
25 spec:
26 type: NodePort
27 selector:
28 app: nginx
29 ports:
30 - protocol: TCP
31 port: 80
32 nodePort: 31580

以下のコマンドで、クラスタへデプロイできます。

$ kubectl create -f south_rs.yaml


Docker Hub のプライベート・リポジトリを利用してデプロイする

Docker Hub にアカウントを持っていれば、IBM Cloud k8s にデプロイする事ができます。 ここではプライベートのリポジトリとして登録して、k8s クラスタにデプロイするまでを書いていきます。


Docker Hub にプライベートのリポジトリ作成

Docker Hub https://hub.docker.com/ にログインして、"Create Repository" をクリックして、次の画面を開きます。 この例では、Docker Hub のユーザー名が "maho" となっており、その下に web というコンテナを作成します。そして、"Private"に設定します。


Docker Hubにコンテナ・イメージを登録

dockerコマンドで、Docker Hubにログインします。

$ docker login -u <username> 

docker tagを利用して、ローカルに登録されたイメージとDocker Hubのイメージを対応づけます。 

$ docker tag registry.ng.bluemix.net/takara/web:v3 maho/web:v3

次のコマンドで、Docker Hub にコンテナ・イメージをアップロードします。

$ docker push maho/web:v3

The push refers to a repository [docker.io/maho/web]
f237703ee57b: Pushed
110566462efa: Pushed
305e2b6ef454: Pushed
24e065a5f328: Pushed
v3: digest: sha256:659e3b2cf19e66755e0b7928a64a362c23f8e8bfc34a8a03ec13d16a811e4760 size: 1157

完了したらウェブ画面でも確認しておくと良いでしょう。 


東京DCのk8sクラスタへDocker Hubの認証情報を登録

kubectlで東京DCへ接続するまでの手順は、前述と同じです。 環境がセットアップできたら、次のコマンドで、dockerhubのラベルで、シークレットを登録します。

$ kubectl --namespace default create secret docker-registry dockerhub \

--docker-server=index.docker.io \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<登録メールアドレス>


Docker Hubからプルしてk8sクラスタへデプロイ

Docker Hub からプルして、IBM Cloud 東京DCにデプロイするためのYAMLを以下に示します。 ポイントは、14行目 image:で、Docker Hubのレジストリに登録されたコンテナを指定します。次に、17行目 imagePullSecrets:name: で先にラベルを付けた dockerhub を指定します。 これで、レジストリをアクセスするために必要なトークンをYAMLファイルに記載しないで、認証を実行する事ができる様になります。


dockerhub.yml

     1  apiVersion: extensions/v1beta1

2 kind: Deployment
3 metadata:
4 name: nginx-deployment
5 spec:
6 replicas: 3
7 template:
8 metadata:
9 labels:
10 app: nginx
11 spec:
12 containers:
13 - name: nginx
14 image: maho/web:v3
15 ports:
16 - containerPort: 80
17 imagePullSecrets:
18 - name: dockerhub
19
20 ---
21 apiVersion: v1
22 kind: Service
23 metadata:
24 name: nginx-svc
25 spec:
26 type: NodePort
27 selector:
28 app: nginx
29 ports:
30 - protocol: TCP
31 port: 80
32 nodePort: 31580

前述と同様に、適用します。

kubectl create -f dockerhub.yml


まとめ

東京DCのk8sに、米国南部のレジストリからプルする方法、Docker Hub のリポジトリのプライベートからプルする方法について、確認してみました。実際に動作させると、やはり、その地域のレジストリからプルするのが、速度的に早いというのも判りました。


参考資料

[1] IBM Cloud Container Registry CLI https://console.bluemix.net/docs/cli/plugins/registry/index.html#bx_cr_token_add

[2] IBM Cloud Container Registry の概説 https://console.bluemix.net/docs/services/Registry/index.html#index

[3] Push images to Docker Cloud https://docs.docker.com/docker-cloud/builds/push-images/