はじめに
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を作成します。
この場合も平文でファイルを作成します。
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=
これらをマニフェストに直接書き込みます。
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の使用方法は次回確認したいと思います。