ポイント: Kubernetes Secretsは、パスワードやトークンなどの機密データを安全に保存し、プレーンテキストでの露出を防ぎます。このガイドでは、秘密を作成および管理する方法を説明し、それらをポッド内の環境変数またはボリュームとして使用する方法を説明します。
- 秘密は手動またはKubernetesによって自動的に作成できます。
- ポッド内のボリュームマウントまたは環境変数を介してアクセスできます。
このブログ投稿では、K8sの秘密について説明します。これには以下が含まれます:
- 秘密とは何か
- 秘密の作成方法
- 秘密の操作方法
Kubernetesや、、などの概念に関する基本的な理解があることを前提としています。続けて学ぶには、kubectlとminikubeをインストールする必要があります。
K8sの秘密とは?
秘密とは、その名の通り、パスワードやトークンなど、機密として保持する必要のある情報です。技術的には、資格情報をプレーンテキストでポッド仕様に直接記述できますが、それはあまり安全ではありません。これを解決するために、Kubernetesは秘密という概念を持っており、機密情報を安全に保存し、ポッドがそれをどのように消費するかを制御できます。
秘密を作成する方法
一般的に、ユーザーとKubernetesそのものの両方が秘密を作成できます。APIに安全にアクセスするだけが必要な場合、K8sはサービスアカウントに関連付けられた秘密を自動的に作成します。この秘密にはAPIにアクセスするための資格情報が含まれています。これはAPIにアクセスするための推奨方法です。他の用途のために独自の秘密を作成する必要がある場合も、私たちはそれを行うことができます。例えば、アプリケーションを実行しているポッドが「example-user」というユーザー名と「example-password」というパスワードで別のシステムにアクセスする必要があるとします。秘密を作成し、ポッドが資格情報を認識して使用する方法は?手動で作成するか、yamlファイルを使用するか、「kubectl create」を使用できます。
手動で秘密を作成する
秘密を手動で作成するには、まず文字列をbase64に変換する必要があります。
$ echo -n 'example-user' | base64
4oCYZXhhbXBsZS11c2Vy4oCZ
$ echo -n 'example-password' | base64
4oCYZXhhbXBsZS1wYXNzd29yZOKAmQ==
次に、秘密仕様を持つyamlファイル(example.yaml)を作成します。
apiVersion: v1
kind: Secret
metadata:
name: demo
type: Opaque
data:
username: 4oCYZXhhbXBsZS11c2Vy4oCZ
password: 4oCYZXhhbXBsZS1wYXNzd29yZOKAmQ==
秘密が作成されたかどうかを確認できます
$ kubectl get secret
NAME TYPE DATA AGE
default-token-v8gqd kubernetes.io/service-account-token 3 6m
demo Opaque 2 11s
ご覧のとおり、システム生成の秘密と私たちが作成した秘密があります。秘密がプレーンテキストでないことを確認するために、秘密を説明することもできます。
Type: Opaque
Data
====
username: 18 bytes
password: 22 bytes
kubectlで秘密を作成
資格情報を含むファイルから秘密を作成することもできます。たとえば、ユーザー名をusername.txtというファイルに保存し、パスワードをpassword.txtに保存することで、同じ秘密を作成できます。その後、「kubectl create secret generic demo-creds --from-file=./username.txt --from-file=./password.txt」を実行できます。
秘密を使用する方法
上記で作成した秘密を消費する方法は2つあります:
- データボリューム
- 環境変数
簡単な例で両方を示します。
ボリューム内で秘密を消費
ボリューム内で秘密を消費するには、まずポッドマニフェストでボリュームが定義されていることを確認し、コンテナが使用できるように秘密の名前が指定されている必要があります。ファイルパスや権限を変更することもできます。
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
spec:
containers:
- name: mycontainer
image: redis
volumeMounts: #We mount our volume
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes: #We use the volume and defined our secret
- name: foo
secret:
secretName: demo
秘密が使用されていることが確認できます
Volumes:
foo:
Type: Secret (a volume populated by a Secret)
SecretName: demo
Optional: false
default-token-v8gqd:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-v8gqd
Optional: false
秘密が上記で定義したものであることを確認するために、「kubectl exec」を使用してコンテナに入って確認できます。
$ kubectl exec -ti mypod bash
root@mypod:/data# cat /etc/foo/username
'Example-user'
root@mypod:/data# cat /etc/foo/password
‘example-password’
ポッド内のコンテナが、上記で作成した資格情報を実際に使用していることが確認できます。次に、環境変数で同じ秘密を使用する様子を見てみましょう。
環境変数内で秘密を消費
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: demo #Name of secret
key: username #secret key
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: demo
key: password
restartPolicy: Never
ご覧のとおり、ボリュームの代わりに、env[].valueFrom.secretKeyRefが秘密内のキーを参照しています。このポッドが作成された後、どのようになるか見てみましょう。
root@secret-env-pod:/data# env | grep SECRET
SECRET_PASSWORD='example-password'
SECRET_USERNAME='example-user'
K8sの秘密に関する最終的なヒント
考慮すべき他の点がいくつかあります:
- すでに消費されている秘密を更新すると、Kubeletはキーが自動的に更新されることを確認します。
- ポッドは秘密を使用する唯一のオブジェクトではなく、システムの他の部分も秘密を使用できます。
- 秘密は1つ以上のポッドによって消費されることができます。
追加リソース
Kubernetesに関する詳細は、次のリソースを参照してください:
Kubernetesガイド
- Kubernetesとは(K8s)?Kubernetesの基本チュートリアル
- クラスタの効率を高めるためのKubernetesのベストプラクティス
- ベストプラクティス:Kubernetes用のアプリケーションの設計方法
- Kubernetes Pods:入門
- Kubernetes ReplicaSets:簡単な紹介
- Kubernetes Deployments完全ガイド
- Kubernetes DaemonSetsの使用と管理
- Kubernetesサービスの仕組み
- KubernetesのPort、TargetPort、およびNodePortの使用
- KubernetesでのConfigMapsの作成と使用
- Kubernetes Secretsの紹介
- Kubernetesネットワーキングの基本
- Kubernetes Ingressの説明
- Kubernetes Helm Chartsの紹介
- Kubernetesオペレーターパターンとは?
- KubernetesでのPostgreSQLのStatefulSetとしてのデプロイ
- Kubernetesカスタムリソース定義(CRDs)の説明
- クラウドネイティブアプリケーションのための3つのKubernetesパターン
- Kubernetes計算リソースの説明
- DevOpsパイプラインのためのKubernetesセキュリティ
- Kubernetesでの継続的デリバリーのためのSpinnakerの使用
- Kubernetesマルチクラスター:使用方法と理由
- Kubernetesモニタリング:包括的ガイド
- Kubernetes vs Docker:簡単な比較
- Kubernetes vs Docker Swarm:コンテナオーケストレーションツールの比較
- Kubernetes vs OpenShift:違いは何ですか?
- Kubernetes認定:どのようにして認定を取得し、なぜ取得するのか
これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも表すものではありません。