すでにアプリケーションをデプロイしている場合は、アプリケーションの保護を検討することができます。一部のアプリケーションでは、パスワードや API キーなどの機密データを含む設定が必要です。では、このデータを安全に保存し、アプリケーションに注入する方法を教えてください。
Explaining ConfigMaps and Secrets
Objectives
- アプリケーションから分離された設定およびシークレットを保存する方法の説明
- ConfigMaps および Secrets を使用するようにアプリケーションを設定します。
- ConfigMaps と Secret のマウントと挿入の違いを特定する
ConfigMaps および Secrets の使用シナリオ
ConfigMaps および Secrets を使用する理由
通常、アプリケーションにはいくつかの設定が必要です。分散アプリケーションに関しては、各アプリケーションがデータベース、メッセージキュー、または SMTP サービスにアクセスして電子メールを送信する必要がある場合があります。また、多くの場合、アプリケーションはパスワードや API キーなどの機密データを使用して設定する必要があります。
これらのバッキングサービスは、アタッチされたリソースとして扱う必要があります。アプリケーションでハードコーディングされた設定を使用することは推奨されません。代わりに、添付されたリソースを使用するようにアプリケーションを設定する必要があります。これにより、アプリケーションを更新することなく、バッキングサービスを簡単に変更することができます。通常、アプリケーションは環境変数を使用して設定されます。環境変数は、起動時にアプリケーションに渡される単純なキーと値のペアです。たとえば、環境変数には、データベース接続文字列、SMTP サーバアドレス、認証情報などが格納されます。パスワードや API キーなどの機密データについても同様です。
ワークロードを Kubernetes にデプロイする場合は、デプロイメントマニフェストで環境変数を直接定義できます。ただし、これらのマニフェストは Git などのバージョン管理システムに保存されることが多いため、これはお奨めしません。つまり、機密データはバージョン管理システムによってプレーンテキストで保存されます。これにより、データは暗号化されず、バージョン管理システムにアクセスできるすべてのユーザが読み込むことができます。
Kubernetes の ConfigMaps およびシークレットとは
Kubernetes には、アプリケーションから分離された設定データ (ConfigMaps および Secrets) を保存するための 2 つのネイティブリソースがあります。
機密データ以外には ConfigMaps を使用する必要があります。シークレットは、パスワードや API キーなどの機密データに使用する必要があります。ConfigMaps および Secrets に保存されるデータのサイズにも制限があることに注意してください。ConfigMaps と Secret の両方で、最大 1 MB のデータを格納できます。この制限を超えるものはすべて、ストレージとしてアプリケーションにマウントする必要があります。
ConfigMaps の使用
次の ConfigMap の例を参照してください。
123456789101112131415161718apiVersion: 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 をデプロイメントマニフェスト内のコンテナに割り当てます。
1234567891011121314151617181920212223242526apiVersion: 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 の例を参照してください。
12345678apiVersion: 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 を割り当てることができます。
12345678910111213141516171819202122232425apiVersion: 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: passwordConfigMaps とシークレットのマウントと挿入の違い
Kubernetes の ConfigMaps および Secret により、実行時に Pod に設定データを提供することができます。これは、取り付けと注入の 2 つの方法があります。
マウントでは、Pod にボリュームを作成し、その Pod に ConfigMap または Secret をボリュームとして追加します。これにより、ボリューム内のファイルとして ConfigMap または Secret のデータにアクセスできます。
たとえば、キー my-config を持つ config.txt という名前の ConfigMap がある場合は、以下のように Pod にマウントできます。
123456789101112131415apiVersion: 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 に挿入できます。
1234567891011121314apiVersion: 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 の両方について、ナビゲーションで対応するメニュー項目をクリックして、現在の名前空間で作成されたすべての既存のリソースの概要を確認することができます。

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

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

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