Slide 1

Slide 1 text

Kubernetes Sapporo for Beginners Kubernetes 入門 #3 ~ ハンズオン:設定をConfigMap/Secretとして登録しよう~

Slide 2

Slide 2 text

Kubernetes Sapporo for Beginners 自己紹介 廣瀬 亮輔(Ryosuke Hirose)/@hi-rose ● 旭川高専卒業後、札幌で今の会社に就職してシステム開発 ○ 言語経験:C#、Java、delphiなど ○ ミドルウェア経験:SQLServer、Oracle、Apache、Tomcatなど ● 2017年4月からアーキテクト部署となりクラウドシステムのバックエンド系基盤機能開発に ○ Kubernetesもそのころから利用 ■ 普段GCPで使用しているため、 GCP実装ベースでの理解が中心となります ○ データマイグレーション系サービスのプロジェクトリーダー 2

Slide 3

Slide 3 text

Kubernetes Sapporo for Beginners 事前準備 注意事項! コマンドは hands-onリポジトリをcloneした場所をカレントディレクトリとして記載しています。 3

Slide 4

Slide 4 text

Kubernetes Sapporo for Beginners 今日のゴール ● ConfigMap/Secretがどんなものかわかるようになる ● ConfigMap/Secretを動かして動作を理解する 4

Slide 5

Slide 5 text

Kubernetes Sapporo for Beginners ConfigMap/Secretについて ConfigMapとは Kubernetes上で設定情報を保持することを目的とするリソースとなります。 Key-Value形式やファイル形式で Kubernetesに登録することが可能です。 Secretとは 基本的な動作はConfigMapと同様ですが、接続情報や証明書ファイルのように、機密情報を取り扱う際に利 用します。 Kubernetes内部の動作として、kubectlを使った時に値が見えにくくなっていたり、 Podへの情報の受け渡し方 法がSSL/TLSを用いて転送されたりと、扱いが変わります。 ※今回はスキーマレスの Opaque Type(Generic)のみを取り扱います。 ConfigMap/Secret共通 1つの定義につき1MBまでという制限があります。 5

Slide 6

Slide 6 text

Kubernetes Sapporo for Beginners ConfigMap/Secretを使用する理由 ConfigMapやSecretを使用せずにコンテナに対して設定を記述する場合、 1. プログラム内にハードコーディング/設定ファイルとして保持する 2. Dockerビルド時に、設定ファイルや起動スクリプトとしてコンテナイメージに埋め込む 3. Deployment等のKubernetesワークロードのマニフェストファイル内に記述する といった手段が考えられますが、 1. 設定毎にプログラム管理が必要になる 2. 設定毎にコンテナイメージの作成が必要となる 3. 設定の違いによりマニフェストファイルの管理が必要となり煩雑化する といった問題が発生しますし、機密情報を扱うことには適していません。 そのため、環境毎・ワークロード毎に可変となる情報については ConfigMap/Secretで管理すべきと言えま す。 6

Slide 7

Slide 7 text

Kubernetes Sapporo for Beginners 今回のハンズオン構成 Kubernetesに対して登録したConfigMap/Secretをコンテナ内部の様子を見て確認していきます。 Pod内のコンテナへ情報を受け渡す方法として、環境変数として受け渡すパターンと、ファイルを Volumeとし てマウントするパターンがありますが、その動作の違いについても見ていきます。 7 ConfigMap Secret Kubernetes Master kubectl で反映 Kubernetes Node kubectlで デプロイ Pod 我々 Kubectl exec … echo! ls! Cat! rm! touch!

Slide 8

Slide 8 text

Kubernetes Sapporo for Beginners Let's ハンズオン1 STEP1.kubectl createコマンドでConfigMapおよび、SecretをKey-Value形式で登録します。 8 $ kubectl create configmap --save-config handson-configmap --from-literal=environment=develop --from-literal=domain=develop.example.jp configmap “handson-configmap” created $ kubectl create secret generic --save-config handson-secret --from-literal=mysql.host=127.0.0.1 --from-literal=mysql.password=p@ssword secret “handson-secret” created 以下の情報をConfigMap指定 environment=develop domain=develop.example.jp 以下の情報をSecret指定 mysql.host=127.0.0.1 mysql.password=p@ssword

Slide 9

Slide 9 text

Kubernetes Sapporo for Beginners Let's ハンズオン2 STEP2.登録内容を確認します。 9 $ kubectl describe configmap/handson-configmap Name: handson-configmap Namespace: default Labels: Annotations: (略) Data ==== environment: ---- develop domain: ---- develop.example.jp Events: $ kubectl describe secret/handson-secret Name: handson-secret Namespace: default Labels: Annotations: Type: Opaque Data ==== mysql.host: 9 bytes mysql.password: 8 bytes Secretは内容が 出ない

Slide 10

Slide 10 text

Kubernetes Sapporo for Beginners Let's ハンズオン3 STEP3.マニフェストファイルから登録します。( 登録内容) 10 $ kubectl apply -f ./Step4-ConfigMap-Secret/secret/handson-secret-file.yaml secret handson-secret-file created STEP4.登録内容を確認します。 $ kubectl get secrets -o json handson-secret-file 略

Slide 11

Slide 11 text

Kubernetes Sapporo for Beginners Let's ハンズオン4 STEP5.Podをデプロイします。( デプロイ定義) 11 $ kubectl apply -f ./Step4-ConfigMap-Secret/deployment/deployment-alpine.yaml Deployment.apps “alpine” created STEP6.POD名を確認し、EnvFromとして設定した環境変数を確認します。 $ kubectl get pod $ kubectl exec -it 【確認したPOD名】 -- env ~略~ environment=develop domain=develop.example.jp mysql.host=127.0.0.1 mysql.password=p@ssword ~略~ EnvFromに設定した環 境変数がセットされて いる。

Slide 12

Slide 12 text

Kubernetes Sapporo for Beginners Let's ハンズオン5 STEP7.VolumeマウントしたSecretファイルを確認する。 12 $ kubectl exec -it 【確認したPOD名】 -- ls /config Base-path-name secret-file.yaml $ kubectl exec -it 【確認したPOD名】 -- cat /config/secret-file.yaml Username: sapporo Password: pass Base64が復号化された状態でマウントされてい る。

Slide 13

Slide 13 text

Kubernetes Sapporo for Beginners Let's ハンズオン6 STEP8.Volumeマウントされた場所が読み取り専用であることを確認する。 13 $ kubectl exec -it 【確認したPOD名】 -- rm -rf /config/secret-file.yaml Rm: can’t remove ‘/config/secret-file.yaml’: Read-only file system Command terminated with exit code 1 ConfigMapやSecretでマウントされた場所は読 み取り専用となる。

Slide 14

Slide 14 text

Kubernetes Sapporo for Beginners Let's ハンズオン7 STEP9.Volumeマウントしているファイルを更新して、 POD内のファイルが更新されることを確認する。( 更新内 容) 14 $ kubectl apply -f ./Step4-ConfigMap-Secret/secret/handson-secret-file-modify.yaml Deployment.apps “alpine” configured $ kubectl exec -it 【確認したPOD名】 -- cat /config/secret-file.yaml Username: sapporo Password: modify 一定期間ごとの更新タイミング(デフォルト 60秒)が過ぎた後にファイルが更新されてい ることがわかる。 環境変数の方は起動時に指定され、 ConfigMap/Secretを更新しても途中更新され ないため注意。

Slide 15

Slide 15 text

Kubernetes Sapporo for Beginners 後片付け STEP10.以下を実行して作成したリソースを削除する 15 $ kubectl delete deployment alpine $ kubectl delete configmap handson-configmap $ kubectl delete secret handson-secret handson-secret-file

Slide 16

Slide 16 text

Kubernetes Sapporo for Beginners 補足:Secretのマニフェストファイル管理について Secretをマニフェストファイルとして管理し、 Git等に登録する場合、デフォルトでは平文 (Base64)での保存とな り、リポジトリに権限がある 管理上問題がある場合、マニフェストファイルを暗号化するための kubesecというツールを使うことで値部分を 暗号化してマニフェストファイルを管理することができます。 16 Kind: Secret : Data: Id: dXNlcg== Pass: cGFzcw== Kind: Secret : Data: Id: AAAbcC12… Pass: XXyz99… マニフェスト元ファ イル kubesecで暗号 化したファイル この状態で Git管理 Kind: Secret : Data: Id: dXNlcg== Pass: cGFzcw== : マニフェスト元ファ イル Gitから取得後、 Kubernetesに applyする際に kubesecで復号化

Slide 17

Slide 17 text

Kubernetes Sapporo for Beginners 質疑応答 お聞きいただきありがとうございました。 何でも気軽にご質問くださいませ! 17