[Kubernetes]Secretの作成方法を確認する

#はじめに
Secretはユーザー名やパスワードなどの機密情報を定義しておき、Podから読み込むリソースの一つです。
Podに機密情報を入れないことで、Podは外部のGitリポジトリなどで管理し、Secretは別で管理することができます。
今回はSecretの作成方法を確認したいと思います。

#genericタイプ
Secretの作成方法はいくつかあります。まずはGenericタイプのSecretを作成したいと思います。

##--from-file
ユーザー名とパスワードのファイルを作成して、それをkubectlコマンドで参照して作成します。

まずはユーザー名とパスワードのファイルをそれぞれ平文で作成します。
このとき、改行コードを入れないように注意する必要があります。

```
$ echo -n user01 > ./username
$ echo -n user01password > ./password
```

このファイルをそれぞれ指定してSecretを作成します。

```
$ kubectl create secret generic --save-config sample-auth --from-file=./username --from-file=./password
secret/sample-auth created
$ kubectl get secrets sample-auth
NAME          TYPE     DATA   AGE
sample-auth   Opaque   2      20s
```

yaml形式でSecretを表示すると、エンコードされたパスワードが確認できます。
なお、Secretはbase64でエンコードされていますが、暗号化されているわけではありません。

```
$ kubectl get secrets sample-auth -o yaml
apiVersion: v1
data:
  password: dXNlcjAxcGFzc3dvcmQ=
  username: dXNlcjAx
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-auth","creationTimestamp":null},"data":{"password":"dXNlcjAxcGFzc3dvcmQ=","username":"dXNlcjAx"}}
  creationTimestamp: "2020-04-18T13:00:44Z"
  name: sample-auth
  namespace: default
  resourceVersion: "915723"
  selfLink: /api/v1/namespaces/default/secrets/sample-auth
  uid: ea98b686-4615-44b1-b0a9-e0af6dc0cc3d
type: Opaque
```

##--from-env-file
次は1つのファイルにユーザー名とパスワードを記載して、Secretを作成します。
この場合も平文でファイルを作成します。

```secret.file
username=user01
password=user01password
```
このファイルを元にSecretを作成します。

```
$ kubectl create secret generic --save-config sample-auth2 --from-env-file ./secret.file
secret/sample-auth2 created
$ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-nstst   kubernetes.io/service-account-token   3      52d
sample-auth           Opaque                                2      10m
sample-auth2          Opaque                                2      10s
$ kubectl get secrets sample-auth2 -o yaml
apiVersion: v1
data:
  password: dXNlcjAxcGFzc3dvcmQ=
  username: dXNlcjAx
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-auth2","creationTimestamp":null},"data":{"password":"dXNlcjAxcGFzc3dvcmQ=","username":"dXNlcjAx"}}
  creationTimestamp: "2020-04-18T13:10:50Z"
  name: sample-auth2
  namespace: default
  resourceVersion: "917150"
  selfLink: /api/v1/namespaces/default/secrets/sample-auth2
  uid: 9740c7e0-7f28-4fe3-bbb2-34d617a10689
type: Opaque
```
##--from-literal
今度はファイルを作成せずに、kubectlで直接値を指定してSecretを作成します。
この場合も、平文で値を指定します。

```
$ kubectl create secret generic --save-config sample-auth3 --from-literal=username=user01 --from-literal=password=user01password
secret/sample-auth3 created
$ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-nstst   kubernetes.io/service-account-token   3      53d
sample-auth           Opaque                                2      18h
sample-auth2          Opaque                                2      17h
sample-auth3          Opaque                                2      17s
$ kubectl get secrets sample-auth3 -o yaml
apiVersion: v1
data:
  password: dXNlcjAxcGFzc3dvcmQ=
  username: dXNlcjAx
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-auth3","creationTimestamp":null},"data":{"password":"dXNlcjAxcGFzc3dvcmQ=","username":"dXNlcjAx"}}
  creationTimestamp: "2020-04-19T07:04:53Z"
  name: sample-auth3
  namespace: default
  resourceVersion: "919342"
  selfLink: /api/v1/namespaces/default/secrets/sample-auth3
  uid: 137b03b5-b5fc-40d8-8322-f7c9eaddfdd4
type: Opaque
```

##マニフェストから作成
マニフェストを作成して、applyすることでSecretを作成することもできます。マニフェストにはbase64でエンコードした値を記載する必要があります。

まずはエンコードした値を作成します。

```
$ echo -n user01 |base64
dXNlcjAx
$ echo -n user01password |base64
dXNlcjAxcGFzc3dvcmQ=
```
これらをマニフェストに直接書き込みます。

```secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: sample-auth4
type: Opaque
data:
  username: dXNlcjAx
  password: dXNlcjAxcGFzc3dvcmQ=
```
このマニフェストをapplyしてSecretを作成します。

```
$ kubectl apply -f secret.yaml
secret/sample-auth4 created
$ kubectl get secrets
NAME                  TYPE                                  DATA   AGE
default-token-nstst   kubernetes.io/service-account-token   3      53d
sample-auth           Opaque                                2      18h
sample-auth2          Opaque                                2      18h
sample-auth3          Opaque                                2      6m1s
sample-auth4          Opaque                                2      6s
$ kubectl get secrets sample-auth4 -o yaml
apiVersion: v1
data:
  password: dXNlcjAxcGFzc3dvcmQ=
  username: dXNlcjAx
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"password":"dXNlcjAxcGFzc3dvcmQ=","username":"dXNlcjAx"},"kind":"Secret","metadata":{"annotations":{},"name":"sample-auth4","namespace":"default"},"type":"Opaque"}
  creationTimestamp: "2020-04-19T07:10:48Z"
  name: sample-auth4
  namespace: default
  resourceVersion: "920184"
  selfLink: /api/v1/namespaces/default/secrets/sample-auth4
  uid: 27baeb7f-a7d6-410d-a36a-d2fa875e8ef3
type: Opaque
```

#TLSタイプ
証明書として利用するSecretはTLSタイプで作成します。

まずは自己署名証明書を作成します。

```
$ openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=foo.bar.com"
Generating a 2048 bit RSA private key
......................+++
........................................................+++
writing new private key to './tls.key'
-----
$ ls
tls.crt  tls.key
```

作成した秘密鍵と証明書からSecretを作成します。

```
$ kubectl create secret tls --save-config sample-tls --key ./tls.key --cert ./tls.crt
secret/sample-tls created
$ kubectl get secrets sample-tls
NAME         TYPE                DATA   AGE
sample-tls   kubernetes.io/tls   2      2m10s
$ kubectl get secrets sample-tls -o yaml
apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSU・・・
ind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-tls","creationTimestamp":null},"data":{"tls.crt":"LS0tLS1CRUdJT・・・
```

#まとめ
今回はSecretの作成方法を確認しました。作成したSecretの使用方法は次回確認したいと思います。