このセクションでは、Generic タイプの Secret リソースについて紹介します。 Secret リソースは、ユーザー名やパスワードなどの機密情報を別のリソースとして定義しておき 別リソースから Pod へ情報を読み込ませることができます。

ファイルから値を参照し作成する場合( – – from-file )

ユーザー名とパスワード情報を登録するファイルを作成します。ここでは、ユーザー root の情報を username ファイルに、パスワード root-password の情報を password ファイルに登録しています。

[root@kube-master sample-secret]# echo -n "root" > ./username
[root@kube-master sample-secret]# echo -n "root-password" > ./password

作成したファイルを確認します。username と password ファイルが作成されていることが確認できます。

[root@kube-master sample-secret]# ls -la
合計 12
drwxr-xr-x.  2 root root   38  2月  2 10:40 .
drwxr-xr-x. 17 root root 4096  2月  2 10:37 ..
-rw-r--r--.  1 root root   13  2月  2 10:40 password
-rw-r--r--.  1 root root    4  2月  2 10:40 username
[root@kube-master sample-secret]# 

Master サーバーから 作成したファイル( username と password )から値を参照した Secret リソースを作成します。

[root@kube-master sample-secret]# kubectl create secret generic --save-config sample-secret --from-file=./username --from-file=./password
secret/sample-secret created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを確認します。 sample-secret リソースが Opaque タイプで起動していることが確認できます。

[root@kube-master sample-secret]# kubectl get secret sample-secret
NAME            TYPE     DATA   AGE
sample-secret   Opaque   2      57s
[root@kube-master sample-secret]# 
[root@kube-master sample-secret]# kubectl describe secret sample-db-auth
Name:         sample-db-auth
Namespace:    default
Labels:       <none>
Annotations:  
Type:         Opaque

Data
====
password:  13 bytes
username:  4 bytes
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上で作成したSecret リソースの情報を yaml 形式で出力します。ここでは、 username と password の情報が確認できます。secret で定義した情報は、base64 でエンコードされます。

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yaml
apiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-secret","creationTimestamp":null},"data":{"password":"cm9vdC1wYXNzd29yZA==","username":"cm9vdA=="}}
  creationTimestamp: "2019-02-02T02:08:06Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3391156"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: 6121774a-268f-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]# 

base64 でエンコードされた情報を平文で確認します。ここでは、username が root 、password が root-password であることが確認できます。

[root@kube-master sample-secret]# echo "cm9vdA==" | base64 --decode
root
[root@kube-master sample-secret]# 
[root@kube-master sample-secret]# echo "cm9vdC1wYXNzd29yZA==" | base64 --decode
root-password
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを削除します。

[root@kube-master sample-secret]# kubectl delete secrets sample-secret
secret "sample-secret" deleted
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Secret リソースが削除されていることを確認します。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
Error from server (NotFound): secrets "sample-secret" not found
[root@kube-master sample-secret]# 

envfileから値を参照し作成する場合( – – from-env-file )

envfile を使用すると、一つのファイルで参照する値を読み込ませることもできます。envfile を新規作成し、参照する値を記述します。

[root@kube-master sample-secret]# vi env-secret.txt

username と password の 値を指定します。

username=root
password=root-password

Master サーバーから 作成したファイル( env-secret.txt )から値を参照した Secret リソースを作成します。

[root@kube-master sample-secret]# kubectl create secret generic --save-config sample-secret --from-env-file ./env-secret.txt 
secret/sample-secret created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを確認します。 sample-secret リソースが Opaque タイプで起動していることが確認できます。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
NAME            TYPE     DATA   AGE
sample-secret   Opaque   2      9s
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上で作成したSecret リソースの情報を yaml 形式で出力します。ここでは、 username と password の情報が確認できます。secret で定義した情報は、base64 でエンコードされます。

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yaml
apiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-secret","creationTimestamp":null},"data":{"password":"cm9vdC1wYXNzd29yZA==","username":"cm9vdA=="}}
  creationTimestamp: "2019-02-02T02:33:44Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3393322"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: f629d84d-2692-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを削除します。

[root@kube-master sample-secret]# kubectl delete secrets sample-secretsecret "sample-secret" deleted
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Secret リソースが削除されていることを確認します。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
Error from server (NotFound): secrets "sample-secret" not found
[root@kube-master sample-secret]# 

kubectl で直接値を渡す場合( – – from-literal )

ファイルを参照して値を読み込ませるのではなく、kubectl を使って直接渡すこともできます。 Master サーバーから kubectl を使って、username と password の値を渡す場合には以下のようなコマンドを実行します。

[root@kube-master sample-secret]# kubectl create secret generic --save-config sample-secret --from-literal=username=root --from-literal=password=root-password
secret/sample-secret created
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを確認します。 sample-secret リソースが Opaque タイプで起動していることが確認できます。

[root@kube-master sample-secret]# kubectl get secrets sample-secretNAME            TYPE     DATA   AGE
sample-secret   Opaque   2      88s
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上で作成したSecret リソースの情報を yaml 形式で出力します。ここでは、 username と password の情報が確認できます。secret で定義した情報は、base64 でエンコードされます。

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yamlapiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"kind":"Secret","apiVersion":"v1","metadata":{"name":"sample-secret","creationTimestamp":null},"data":{"password":"cm9vdC1wYXNzd29yZA==","username":"cm9vdA=="}}
  creationTimestamp: "2019-02-02T05:15:48Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3406977"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: 99db731b-26a9-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]#

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを削除します。

[root@kube-master sample-secret]# kubectl delete secrets sample-secretsecret "sample-secret" deleted
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Secret リソースが削除されていることを確認します。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
Error from server (NotFound): secrets "sample-secret" not found
[root@kube-master sample-secret]# 

マニフェストから作成する場合

マニフェストから作成する場合は、base64 でエンコードした値をマニフェストに埋め込みます。サンプルのマニフェストファイルを新規作成し、以下コードを記述します。 

[root@kube-master sample-secret]# vi sample-secret.yaml 

kend に Secret、type に Generic ではなく Opaque を指定し、data に Pod に渡す Secret 情報をbase64 でエンコードした値で指定します。

apiVersion: v1
kind: Secret
metadata:
  name: sample-secret
type: Opaque
data:
  username: cm9vdA==
  password: cm9vdC1wYXNzd29yZA==

(補足)
base64 エンコードの値を取得した場合には、以下コマンドで取得できます。

[root@kube-master sample-secret]# echo "root" | base64
cm9vdAo=
[root@kube-master sample-secret]# 

[root@kube-master sample-secret]# echo "root-password" | base64
cm9vdC1wYXNzd29yZAo=
[root@kube-master sample-secret]# 

Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。

[root@kube-master sample-secret]# kubectl apply -f sample-secret.yaml 
secret/sample-secret created
[root@kube-master sample-secret]#

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを確認します。 sample-secret リソースが Opaque タイプで起動していることが確認できます。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
NAME            TYPE     DATA   AGE
sample-secret   Opaque   2      9s
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上で作成したSecret リソースの情報を yaml 形式で出力します。ここでは、 username と password の情報が確認できます。secret で定義した情報は、base64 でエンコードされます。

[root@kube-master sample-secret]# kubectl get secret sample-secret -o yaml
apiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"password":"cm9vdC1wYXNzd29yZA==","username":"cm9vdA=="},"kind":"Secret","metadata":{"annotations":{},"name":"sample-secret","namespace":"default"},"type":"Opaque"}
  creationTimestamp: "2019-02-02T05:26:28Z"
  name: sample-secret
  namespace: default
  resourceVersion: "3407878"
  selfLink: /api/v1/namespaces/default/secrets/sample-secret
  uid: 17410564-26ab-11e9-94ad-525400bc2a02
type: Opaque
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上に作成した Secret リソースを削除します。

[root@kube-master sample-secret]# kubectl delete secrets sample-secret
secret "sample-secret" deleted
[root@kube-master sample-secret]# 

Master サーバーから Kubernetes クラスタ上の Secret リソースが削除されていることを確認します。

[root@kube-master sample-secret]# kubectl get secrets sample-secret
Error from server (NotFound): secrets "sample-secret" not found
[root@kube-master sample-secret]#