[k8s]DockerHub の PrivateRegistry のイメージを Pod で利用する時のメモ

メモです。

DockerHub の PrivateRegistry を使う時の方法について確認した時のメモで以下を参考にやってみた

[Pull an Image from a Private Registry](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)

# 環境

```bash
$kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15+", GitVersion:"v1.15.11-eks-af3caf", GitCommit:"af3caf6136cd355f467083651cc1010a499f59b1", GitTreeState:"clean", BuildDate:"2020-03-27T21:51:36Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"}
```

# 前提確認

DockerHub の PrivateRegistry について確認する。

```bash
# PrivateRegistry なので認証なしでは Pull 出来ない
$docker pull toshihirock/privatenginx
Using default tag: latest
Error response from daemon: pull access denied for toshihirock/privatenginx, repository does not exist or may require 'docker login'

# docker login する
$docker login

# pull 出来た
$docker pull toshihirock/privatenginx
```

こんな感じ。
k8s でも確認。

```bash
# 応答がなくなる
$kubectl run -i private-test --image=toshihirock/privatenginx --generator=run-pod/v1 --rm --restart=Never --command -- echo 'hi'

# 別ウィンドウで見ると以下のように ImagePullBackOff になっている
$kubectl get pods |grep private-test
private-test                        0/1     ImagePullBackOff   0
```

# やってみる

## kubernetes.io/dockerconfigjson type のシークレットを作る

k8s で DockerHub の PrivateRegistry のイメージを使う方法として認証情報を予め `kubernetes.io/dockerconfigjson` タイプの ``Secret` として作成しておき、利用する方法がある。
`docker login` コマンドが成功している場合 `~/.docker/config.json` に認証時に必要な設定があるのでこれを使う。

```bash
# ファイルの確認
$ cat ~/.docker/config.json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "xxxx"
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/18.06.1-ce (linux)"
        }
}

# json から kubernetes.io/dockerconfigjson タイプの Secret を作成
$kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson
```

# Pod を起動してみる

`kubectl run` コマンドのオプションで `imagePullSecrets` の指定はできなさそうなのでマニュフェストを作って検証する。

```bash
# ある程度のテンプレを作る
$kubectl run private-test --image=toshihirock/privatenginx --generator=run-pod/v1 --restart=Never --dry-run -o yaml --command -- echo 'hi' > private-test.yaml
```

`imagePullSecrets` を追加して作成した Secret の `regcred` を指定する。
マニュフェストはこんな感じ。

```private-test.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: private-test
  name: private-test
spec:
  imagePullSecrets:
  - name: regcred
  containers:
  - command:
    - echo
    - hi
    image: toshihirock/privatenginx
    name: private-test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}
```

やってみる。

```bash
# マニュフェストを適用し、Pod の作成
$kubectl apply -f private-test.yaml

#  Pod の確認
$kubectl get pods |grep private-test
private-test                        0/1     Completed          0          100s

# echo 文が実行されていることを確認
$kubectl logs private-test
hi
```

無事成功