ConfigMaps および Secret の使用

Explaining ConfigMaps and Secrets

Objectives

After completing this lesson, you will be able to:
  • アプリケーションから分離された設定およびシークレットを保存する方法の説明
  • ConfigMaps および Secrets を使用するようにアプリケーションを設定します。
  • ConfigMaps と Secret のマウントと挿入の違いを特定する

ConfigMaps および Secrets の使用シナリオ

すでにアプリケーションをデプロイしている場合は、アプリケーションの保護を検討することができます。一部のアプリケーションでは、パスワードや API キーなどの機密データを含む設定が必要です。では、このデータを安全に保存し、アプリケーションに注入する方法を教えてください。

ConfigMaps および Secrets を使用する理由

通常、アプリケーションにはいくつかの設定が必要です。分散アプリケーションに関しては、各アプリケーションがデータベース、メッセージキュー、または SMTP サービスにアクセスして電子メールを送信する必要がある場合があります。また、多くの場合、アプリケーションはパスワードや API キーなどの機密データを使用して設定する必要があります。

これらのバッキングサービスは、アタッチされたリソースとして扱う必要があります。アプリケーションでハードコーディングされた設定を使用することは推奨されません。代わりに、添付されたリソースを使用するようにアプリケーションを設定する必要があります。これにより、アプリケーションを更新することなく、バッキングサービスを簡単に変更することができます。通常、アプリケーションは環境変数を使用して設定されます。環境変数は、起動時にアプリケーションに渡される単純なキーと値のペアです。たとえば、環境変数には、データベース接続文字列、SMTP サーバアドレス、認証情報などが格納されます。パスワードや API キーなどの機密データについても同様です。

ワークロードを Kubernetes にデプロイする場合は、デプロイメントマニフェストで環境変数を直接定義できます。ただし、これらのマニフェストは Git などのバージョン管理システムに保存されることが多いため、これはお奨めしません。つまり、機密データはバージョン管理システムによってプレーンテキストで保存されます。これにより、データは暗号化されず、バージョン管理システムにアクセスできるすべてのユーザが読み込むことができます。

Kubernetes の ConfigMaps およびシークレットとは

Kubernetes には、アプリケーションから分離された設定データ (ConfigMaps および Secrets) を保存するための 2 つのネイティブリソースがあります。

機密データ以外には ConfigMaps を使用する必要があります。シークレットは、パスワードや API キーなどの機密データに使用する必要があります。ConfigMaps および Secrets に保存されるデータのサイズにも制限があることに注意してください。ConfigMaps と Secret の両方で、最大 1 MB のデータを格納できます。この制限を超えるものはすべて、ストレージとしてアプリケーションにマウントする必要があります。

ConfigMaps の使用

次の ConfigMap の例を参照してください。

YAML
123456789101112131415161718
apiVersion: v1 kind: ConfigMap metadata: name: my-config data: my-key: "my-value" my-other-key: "my-other-value" # You can also use file-like key-value pairs my-file-like-key: | # This "file" contains a bash script /bin/bash echo "Hello World" my-other-file-like-key: | # This "file" contains a JSON object { "key": "value" }

ConfigMaps は、設定データを保存する単純でありながら強力な方法です。しかし、アプリケーションでどのように使用しますか。

これを行うには、以下の例のように、ConfigMap をデプロイメントマニフェスト内のコンテナに割り当てます。

YAML
1234567891011121314151617181920212223242526
apiVersion: apps/v1 kind: Deployment metadata: name: hello-kyma-config spec: replicas: 1 selector: matchLabels: app: hello-kyma-config template: metadata: labels: app: hello-kyma-config spec: containers: - name: my-container image: bash envFrom: # 1. Use all keys as environment variables - configMapRef: name: my-config env: # 2. Use only specific keys as environment variables - name: MY_KEY valueFrom: configMapKeyRef: name: my-config key: my-key

アプリケーションで ConfigMaps を使用するには、はるかに多くの方法があります。詳細については、ConfigMap を使用するためのポッドの設定を参照してください。

シークレットの使用

Secret の例を参照してください。

YAML
12345678
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque # default type data: username: "YWRtaW4=" # This is the base64 encoded string "admin" password: "dG9wc2VjcmV0" # This is the base64 encoded string "topsecret"

上記のマニフェストにより、2 つのキー (username および password) を含む Secret が作成されます。Kubernetes には、さまざまなタイプの機密データの保存に使用できるさまざまな Secret タイプも付属しています。たとえば、タイプ kubernetes.io/dockerconfigjson では、Docker 設定ファイルが格納されます。これは、プライベート Docker レジストリからイメージをプルする場合に役立ちます。

アプリケーションでのシークレットの使用は、ConfigMaps の使用とよく似ています。以下の例のように、デプロイメントマニフェストでコンテナに Secret を割り当てることができます。

YAML
12345678910111213141516171819202122232425
apiVersion: apps/v1 kind: Deployment metadata: name: hello-kyma-secret spec: selector: matchLabels: app: hello-kyma-secret template: metadata: labels: app: hello-kyma-secret spec: containers: - name: my-container image: ghcr.io/sap-samples/kyma-runtime-learning-journey/hello-kyma:1.0.0 envFrom: # 1. Use all keys as environment variables - secretRef: name: my-secret env: # 2. Use only specific keys as environment variables - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password

ConfigMaps とシークレットのマウントと挿入の違い

Kubernetes の ConfigMaps および Secret により、実行時に Pod に設定データを提供することができます。これは、取り付けと注入の 2 つの方法があります。

マウントでは、Pod にボリュームを作成し、その Pod に ConfigMap または Secret をボリュームとして追加します。これにより、ボリューム内のファイルとして ConfigMap または Secret のデータにアクセスできます。

たとえば、キー my-config を持つ config.txt という名前の ConfigMap がある場合は、以下のように Pod にマウントできます。

YAML
123456789101112131415
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: bash volumeMounts: - name: my-config-volume mountPath: /etc/config volumes: - name: my-config-volume configMap: name: my-config

次に、コンテナ内の config.txt/etc/config/config.txt ファイルのデータにアクセスします。

一方、を注入するには、環境変数またはコマンドライン引数としてデータを Pod に直接注入します。

たとえば、キーpassword.txtを含む my-secret という名前の Secret がある場合は、以下のように Pod に挿入できます。

YAML
1234567891011121314
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: bash env: - name: MY_PASSWORD valueFrom: secretKeyRef: name: my-secret key: password.txt

その後、コンテナ内の環境変数 password.txt として MY_PASSWORD の値にアクセスできます。

一般的に、マウントは、コンテナ内のファイルとしてデータにアクセスする必要がある場合に役立ちます。挿入は、環境変数またはコマンドライン引数としてデータをアプリケーションに渡す必要がある場合に役立ちます。

Kyma ダッシュボードの ConfigMaps および Secret

Kyma ダッシュボードでは、ConfigMaps および Secrets を作成、表示、編集、および削除できます。ダッシュボードを使用して新しいデプロイメントを作成し、それに ConfigMap または Secret を割り当てることもできます。

ConfigMaps と Secrets の両方について、ナビゲーションで対応するメニュー項目をクリックして、現在の名前空間で作成されたすべての既存のリソースの概要を確認することができます。

ConfigMaps の概要

ConfigMap または Secret をクリックすると、リソースの詳細が表示されます。編集ボタンをクリックして、リソースを編集することもできます。

ConfigMap 詳細

Secrets の場合、値はデフォルトで base64 でエンコードされます。デコードを選択して、値をプレーンテキストにデコードすることができます。

秘密の詳細

サマリ

このレッスンでは、ConfigMaps および Secrets のコンセプトについて説明します。Kyma ダッシュボードで、それらの使用時期、使用方法、およびその作成および管理方法を学習しました。

その他の参考資料