[Kubernetes]Secretの利用方法を確認する

#はじめに
[前回](https://qiita.com/dingtianhongjie/items/78572da323249cd9ce6c)Secretの作成方法を確認しました。
今回は、この作成したSecretの利用方法を確認したいと思います。
利用方法は大きく分けて、以下の2つになります。

* 環境変数として利用する
* Volumeとしてマウントする

#環境変数として利用する
環境変数として利用する場合も2つのやり方があります。

##特定のKeyを環境変数として指定する
以下のマニフェストのように、env配下にKeyを指定します。このマニフェストでは2つ指定していますが、1つでも構いません。

```sample-secret1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret1
spec:
  containers:
    - name: centos
      image: centos:latest
      command:
      - sh
      - -c
      args:
      - tail -f /dev/null
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: sample-auth
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: sample-auth
              key: password
```
このマニフェストをapplyします。

```
$ kubectl apply -f sample-secret1.yaml
pod/sample-secret1 created
$ kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
sample-secret1   1/1     Running   0          16s
```
ログインして確認します。

```
$ kubectl exec -it sample-secret1 /bin/bash
[root@sample-secret1 /]# env | grep -e USERNAME -e PASSWORD
USERNAME=user01
PASSWORD=user01password
```
USERNAMEとPASSWORDが環境変数として登録されていることがわかります。

##Secretリソースを指定する
今度はKey1つずつではなく、secretリソースを指定します。

```sample-secret2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret2
spec:
  containers:
    - name: centos
      image: centos:latest
      command:
      - sh
      - -c
      args:
      - tail -f /dev/null
      envFrom:
      - secretRef:
          name: sample-auth
```
このマニフェストをapplyします。

```
$ kubectl apply -f sample-secret2.yaml
pod/sample-secret2 created
```
ログインして確認します。

```
$ kubectl exec -it sample-secret2 /bin/bash
[root@sample-secret2 /]# env | grep -e username -e password
username=user01
password=user01password
```
Secretリソースを指定した場合、環境変数はSecretのKeyとなり、1つずつ指定したときのように変数名を指定することはできません。

###2つの方法の設定値の違いを確認
1つずつ指定した場合と、Secretリソースを指定した場合で、設定値に違いがあるのかを確認してみたいと思います。
今回は2つのKeyを持つ同じSecretを利用していますので、変数名以外に違いはないはずです。

環境変数の一覧をファイルに吐き出して、diffを取ってみます。

```
$ kubectl exec -it sample-secret1 printenv > 1.txt
$ kubectl exec -it sample-secret2 printenv > 2.txt
$ diff 1.txt 2.txt
2c2
< HOSTNAME=sample-secret1
---
> HOSTNAME=sample-secret2
4,5c4,6
< USERNAME=user01
< PASSWORD=user01password
---
> username=user01
> password=user01password
> KUBERNETES_SERVICE_HOST=10.96.0.1
13d13
< KUBERNETES_SERVICE_HOST=10.96.0.1
```
環境固有の値（HOSTNAME）以外はUSERNAMEとPASSWORDの変数名が違うだけですね。

#Volumeとしてマウントする
次にVolumeとしてマウントする方法を確認してみたいと思います。
こちらも、個々のKeyをマウントする方法と、Secretリソースをマウントする方法があります。

##特定のKeyをマウントする

以下のようにマウントポイントとファイル名を任意に指定することができます。

```sample-secret3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret3
spec:
  containers:
  - name: sample-secret3
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: sample-auth
      items:
      - key: username
        path: my-group/my-username
```
このマニフェストをapplyします。

```
$ kubectl apply -f sample-secret3.yaml
pod/sample-secret3 created
```
ログインして確認します。

```
$ kubectl exec -it sample-secret3 /bin/bash
root@sample-secret3:/data# cd /etc/foo/
root@sample-secret3:/etc/foo# ls
my-group
root@sample-secret3:/etc/foo# cd my-group
root@sample-secret3:/etc/foo/my-group# ls
my-username
root@sample-secret3:/etc/foo/my-group# cat my-username
user01
```
マウントされていて、SecretのKeyの値が確認できますね。


##Secretリソースをマウントする
以下のようにマウントポイントとマウントするSecretリソースを指定します。

```sample-secret4.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret4
spec:
  containers:
  - name: sample-secret4
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: sample-auth
```
このマニフェストをapplyします。

```
$ kubectl apply -f sample-secret4.yaml
pod/sample-secret4 created
```
ログインして確認します。

```
$ kubectl exec -it sample-secret4 /bin/bash
root@sample-secret4:/data# cd /etc/foo/
root@sample-secret4:/etc/foo# ls
password  username
root@sample-secret4:/etc/foo# cat password
user01password
root@sample-secret4:/etc/foo# cat username
user01
```
指定したマウントポイントにKeyの名前のファイルが作成されていて、値が記載されていることが確認できます。

#まとめ
今回はSecretの利用方法を確認しました。いろいろな方法がありますので、利用する値やアプリケーションによって使い分けることになりそうです。