【Red Hat OpenShift Administration対策】(3)Openshift上のSecretのPodへの適用例

Red Hat openshift Administration試験(EX280)の勉強記事三回目です。
今回は資格情報や証明書を保管するためのSecretと、それをPodが使用できるようにするための例について書きます。

# Secretとは
一回目の記事でも書きましたが、OpenshiftにはSecretという資格情報(ユーザーIDやパスワード)や、証明書を保存するために暗号化されたKey-Valueデータを保持する仕組みがあります。
Secretはetcd上にプロジェクト単位(namespace単位)で保管されており、同じプロジェクト内であれば同じSecretへアクセスすることができます。Base64でエンコードされているのですが、プロジェクト単位で権限が与えられているので、同じプロジェクトであれば暗号化された値を取得してデコードすることもぶっちゃけ可能です。

![20210211_Openshift上のSecretのPodへの適用例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/7cfa0e89-20e6-073f-e0f9-98d85a2b5af0.jpeg)

Secretは、環境変数としてPodに挿入する方法と、ファイルとしてPodに挿入する方法の二種類があります。例えば資格情報は環境変数としてPodに設定し、証明書はファイルとしてPodに設定することが考えられます。

またSeretを使用するPodを作成した後、Secretを別の値に更新しても稼働中のPodには影響を与えません。更新したSecretをPodが使えるようにするには、Podを再作成する必要がありますので注意してください。

# Secretの作成とPodへの挿入
Secretは以下コマンドで作成できます。

```
oc create secret generic test-secret --from-literal key1=secret1 --from-literal key2=secret2
```

・環境変数として挿入
環境変数として挿入する場合、oc set env <deployment名>の構文でSecretを指定します。以下が例です。

```
oc set env deployment/test-deploy --from secret/test-secret
```

・ファイルとして挿入
ファイル(ボリューム)として挿入する場合、oc set volume <deployment名>の構文でSecretとPod上のマウントポイントを指定します。以下が例です。

```
oc set volume deployment/test-deploy --add --type secret --secret-name test-secret --mount-path /secret
```

上記を実行すると、Pod内に/secret/key1ファイルと/secret/key2がマウントされます。key1ファイルの中身にvalue1が、key2ファイルの中身にvalue2が記載されています。


# 実例
wordpressとmysqlのPodを構築し、それぞれの環境変数をSecretを使用して設定する事を考えます。
今回は環境変数としてユーザーIDやパスワードのSecretをwordpressとmysqlに設定することにします。
またSCCも適用する必要があるので、以下手順はkube-admin権限があるユーザーで実行してください。

手順の流れは以下となります。
(1)ユーザーIDやパスワード等の資格情報が入ったSecret作成
(2)wordpressとmysqlを実行するPodを作成
(3)SecretをPodに環境変数として挿入
(4)Podを実行するサービスアカウントの作成と適用
(5)稼働確認

(1)ユーザーIDやパスワード等の資格情報が入ったSecret作成
wordpressとmysqlに挿入する資格情報が入ったSecretを作成します。以下の通りです。

```
oc create secret generic wp-secret --from-literal WORDPRESS_DB_HOST=test-mysql --from-literal WORDPRESS_DB_NAME=wpdb --from-literal WORDPRESS_DB_USER=wpuser --from-literal WORDPRESS_DB_PASSWORD=wppassword
oc create secret generic mysql-secret --from-literal MYSQL_DATABASE=wpdb --from-literal MYSQL_USER=wpuser --from-literal MYSQL_PASSWORD=wppassword --from-literal MYSQL_ROOT_PASSWORD=P@ssw0rd
```

(2)wordpressとmysqlを実行するPodを作成
Podを作成します。最初から環境変数を挿入してPodをデプロイすることもできるのですが、あえてPodを実行してから環境変数を使用するよう変更することにします。

```
oc new-app --name test-mysql --docker-image mysql
oc new-app --name test-wordpress --docker-image wordpress
```

上記コマンドを実行しても、環境変数が設定されていないため、deploymentは正しく成功していません。

(3)SecretをPodに環境変数として挿入

```
oc set env deployment/test-mysql --from secret/mysql-secret
oc set env deployment/test-wordpress --from secret/wp-secret
```

数十秒ほど待つと、Podが再起動し、環境変数が正しく設定されます。
deploymentの状態がRunningにならない場合は、以下コマンドを実行してPodのエラーメッセージを確認しましょう。

```
oc get pod
oc logs test-mysql-XXXXXXXXX-XXXXX
oc logs test-wordpress-XXXXXXXXX-XXXXX
```

(4)Podを実行するサービスアカウントの作成と適用
openshiftでは、デフォルトではセキュリティコンテキスト制約(SCC:Security Context Constraints)が適用されています。これは、作成したPodが外部リソースへアクセスすることを制限する機能です。
この場合、wordpressを実行するためのサービスアカウント(ここではwpsaとします)を作成してセキュリティー・ポリシーを設定しdeploymentに適用することでアクセスができるようになります。次回解説しますが、ここではまず以下のコマンドを実行してください。SCC変更にはcluster-admin権限が必要です。

```
oc create serviceaccount wpsa
oc adm policy add-scc-to-user anyuid -z wpsa
oc set serviceaccount deployment/test-wordpress wpsa
```

(5)稼働確認
wordpressアプリケーションのrouteを作成し、curlコマンドを実行してwordpressとmysqlが稼働しており、かつ二つのアプリケーションが通信できることを確認します。

wordpressアプリケーションのrouteを作成

```
oc expose service/test-wordpress
oc get route
```
test-wordpressへのルートが作成され、HOST/PORT欄にURLが出力されていることを確認します。

wordpressからMySQLに通信できることを確認

```
curl -s http://<test-wordpressへのURL>/wp-admin/install.php
```

wordpressインストールページのソースが表示されれば成功です。<title>タグに「WordPress Installation」と表示されているはずです。可能であれば、上記URLをそのままブラウザで開いてしまったほうが早いと思います。


# ConfigMapの使い方
Secretとは別に、ConfigMapと呼ばれるものを使用してKey-ValueをPodに与えることもできます。ただしConfigMapは暗号化されていません。以下がコマンド例です。

```
oc create configmap test-configmap --from-literal key1=value1 --from-literal key2=value2
```