GNU/Linux >> Linux の 問題 >  >> Ubuntu

Kubernetesシークレット–シークレットを作成、使用、アクセスする方法

はじめに

Kubernetesを介してデプロイされるほとんどのアプリケーションは、外部にあるデータベース、サービス、およびその他のリソースにアクセスする必要があります。これらのリソースにアクセスするために必要なログイン情報を管理する最も簡単な方法は、Kubernetesシークレットを使用することです。シークレットは、機密情報を整理してクラスター全体に配布するのに役立ちます。

このチュートリアルでは、Kubernetesシークレットとは何か、クラスターでそれらを作成して使用する方法を学習します。

前提条件

  • Kubernetesクラスター(テスト目的で、minikubeを使用して作成できます)
  • Kuberneteskubectlコマンドラインツール

Kubernetesの秘密とは何ですか?

Kubernetesシークレットは、ユーザー名、パスワード、トークン、キーなどの機密データを保存するオブジェクトです。シークレットは、アプリのインストール中にシステムによって作成されるか、機密情報を保存してポッドで利用できるようにする必要がある場合はいつでもユーザーによって作成されます。

パスワード、トークン、またはキーが単にポッド定義またはコンテナイメージの一部である場合、Kubernetes操作中に誤って公開される可能性があります。したがって、シークレットの最も重要な機能は、シークレットに保存されている情報が誤って公開されるのを防ぎ、同時にユーザーが必要な場所で利用できるようにすることです。

Kubernetesシークレットタイプ

Kubernetesには、2つのカテゴリのシークレットがあります。

  • システムのサービスアカウントは、組み込みのシークレットを自動的に作成します それらをAPIクレデンシャルとともにコンテナに関連付けます。
  • カスタマイズされたシークレットを作成することもできます 資格情報については、ポッドで利用できるようにする必要があります。

組み込みのシークレットには、一般的な使用シナリオに対応するいくつかのタイプがあります。

組み込みタイプ 説明
Opaque これはデフォルトのタイプのシークレットです。構成ファイルにtypeステートメントが含まれていないシークレットは、すべてこのタイプであると見なされます。不透明なシークレットは、任意のユーザーデータを保存するように設計されています。
kubernetes.io/service-account-token サービスアカウントトークンシークレットは、サービスアカウントを識別するトークンを格納します。ポッドを作成すると、Kubernetesはこのシークレットを自動的に作成してポッドに関連付け、APIへの安全なアクセスを可能にします。この動作は無効にできます。
kubernetes.io/dockercfg イメージのDockerレジストリにアクセスするには、有効なDockerクレデンシャルが必要です。このタイプのシークレットは、シリアル化された ~/.dockercfgを保存するために使用されます Dockerコマンドライン構成のレガシー形式。 base64でエンコードされた.dockercfgが含まれています キー。
kubernetes.io/dockerconfigjson このタイプのシークレットは.dockerconfigjsonを特徴としています キー。~/.docker/config.jsonのbase64エンコードバージョンです。 ファイル、非推奨の .dockercfgの新しいバージョン
kubernetes.io/basic-auth 基本認証データを保存するための秘密。 usernameの2つのキーが含まれている必要があります およびpassword
kubernetes.io/ssh-auth SSH接続の確立に必要なデータを保存するには、 ssh-authを使用します タイプ。このタイプのデータフィールドには、 ssh-privatekeyが含まれている必要があります キーと値のペア。
kubernetes.io/tls このタイプは、TLS証明書とキーを格納するために使用されます。最も一般的な使用シナリオは入力リソースの終了ですが、 tls タイプは他のリソースでも使用されることがあります。
bootstrap.kubernetes.io/token ノードのブートストラッププロセス中に使用されるトークンは、トークンシークレットタイプを使用して保存されます。このタイプは通常、 kube-systemで作成されます 名前空間。

カスタマイズされたタイプのシークレットを定義するには、空でない文字列を typeの値として割り当てます。 シークレットファイルのフィールド。フィールドを空のままにすると、KubernetesはOpaqueを想定するようになります タイプ。カスタマイズされたタイプは、組み込みタイプによってもたらされる制約の秘密を解放します。

Kubernetesシークレットの使用

シークレットを作成するときは、それを使用するポッドによって参照される必要があります。ポッドでシークレットを利用できるようにするには:

1.ポッド内の任意の数のコンテナで使用可能なボリュームにシークレットをファイルとしてマウントします。

2.シークレットを環境変数としてコンテナにインポートします。

3. kubeletと、 imagePullSecretsを使用します フィールド。

次のセクションでは、Kubernetesシークレットを作成する方法と、それらをデコードしてアクセスする方法について説明します。

Kubernetesシークレットを作成する

Kubernetesシークレットを作成するには、次のいずれかの方法を適用します。

  • kubectlを使用します コマンドラインベースのアプローチの場合。
  • シークレットの構成ファイルを作成します。
  • Kustomizeなどのジェネレーターを使用してシークレットを生成します。

kubectlを使用してシークレットを作成する

1. kubectlを使用してシークレットの作成を開始するには 、最初に機密情報を保存するファイルを作成します:

echo -n '[username]' > [file1]
echo -n '[password]' > [file2]

-n オプションはechoを指示します 文字列の最後に改行を追加しないでください。改行も文字として扱われるため、残りの文字と一緒にエンコードされ、異なるエンコード値が生成されます。

2.ここで、 kubectlを使用します 前の手順のファイルを使用してシークレットを作成します。汎用サブコマンドを使用して、Opaqueを作成します 秘密の。また、 --from-fileを追加します 含める各ファイルのオプション:

kubectl create secret generic [secret-name] \  
--from-file=[file1] \
--from-file=[file2]

出力はシークレットの作成を確認します:

3.シークレットに格納されている値のキーを提供するには、次の構文を使用します。

kubectl create secret generic [secret-name] \  
--from-file=[key1]=[file1] \  
--from-file=[key2]=[file2]

4.次のように入力して、シークレットが正常に作成されたことを確認します。

kubectl get secrets

このコマンドは、使用可能なシークレットのリスト(名前、タイプ、含まれるデータ値の数、および経過時間)を表示します。

構成ファイルにシークレットを作成する

1.構成ファイルに必要な情報を指定してシークレットを作成するには、保存する値をエンコードすることから始めます。

echo -n '[value1]' | base64
echo -n '[value2]' | base64

2.テキストエディタを使用してyamlファイルを作成します。ファイルは次のようになります:

apiVersion: v1
kind: Secret
metadata:  
  name: newsecret
type: Opaque
data:
  username: dXNlcg==
  password: NTRmNDFkMTJlOGZh

3.ファイルを保存し、 kubectl applyを使用します シークレットを作成するコマンド:

kubectl apply -f [file]

ジェネレータを使用してKubernetesシークレットを作成する

Kustomizeなどのジェネレーターは、シークレットをすばやく生成するのに役立ちます。

1. Kustomizeでシークレットを作成するには、 kustomization.yamlという名前のファイルを作成します 次のようにフォーマットします:

secretGenerator:
- name: db-credentials 
  files:
  - username.txt
  - password.txt

上記の例では、 db-credentials シークレットの名前として、以前に作成された2つのファイル username.txtを使用します 、および password.txt データ値として。

2.または、暗号化されていないリテラルバージョンのデータ値を提供するには、literalsを含めます。 保存するキーと値のペアを含むセクション:

secretGenerator:
- name: db-credentials
  literals:
  - username=user
  - password=54f41d12e8fa

3.ファイルを保存し、 kustomization.yamlがあるフォルダーで次のコマンドを使用します にあります:

kubectl apply -k .

出力はシークレットの作成を確認します:

kubectldescribeを使用して作成されたシークレットを表示する

kubectl describe コマンドは、Kubernetesオブジェクトに関する基本情報を表示します。シークレットの説明を表示するために使用します。

kubectl describe secrets/[secret]

最初の例は、ファイルをデータ値として提供することによって作成された秘密を示しています。

2番目の例では、文字列リテラルを使用して作成されたシークレットについて説明します。 Dataの変更に注意してください セクション。ファイル名の代わりにキーの名前が表示されるようになりました:

秘密を解読する

1.シークレット内の値をデコードするには、次のコマンドを入力して値にアクセスします。

kubectl get secret [secret] -o jsonpath='{.data}'

出力には、データセクションに格納されているエンコードされたキーと値のペアが表示されます:

2. echoコマンドを使用してエンコードされた文字列を入力し、出力を base64にパイプします コマンド:

echo '[encoded-value]' | base64 --decode

デコードされた文字列が出力として表示されます:

ボリュームにロードされたアクセスシークレット

1.別のボリュームのポッドにマウントされたシークレットにアクセスするには、ポッドの定義を変更して新しいボリュームを含めます。必要なボリューム名を選択しますが、それがシークレットオブジェクトの名前と同じであることを確認してください。

2.必ずreadOnlyを指定してください 本当のように。たとえば、ポッドの定義は次のようになります。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  spec:
    containers:
      - name: test-pod
        image: redis
        volumeMounts:
        - name: newsecret
          mountPath: “/etc/newsecret”
          readOnly: true
    volumes:
    - name: newsecret
      secret:
        secretName: newsecret

2.別のターミナルインスタンスを開き、 kubectl execを使用します ポッドのbashシェルにアクセスするコマンド:

kubectl exec -it [pod] -- /bin/bash


3. cd /etc/newsecret 、シークレットに含まれているファイルを見つけます:

cd /etc/newsecret

環境変数を使用したコンテナへのプロジェクトシークレット

1. Kubernetesポッドのシークレットにアクセスする別の方法は、ポッド定義を変更してシークレットへの参照を含めることにより、シークレットを環境変数としてインポートすることです。例:

apiVersion: v1 
kind: Pod 
metadata: 
  name: secret-env-pod 
spec: 
  containers: 
  - name: secret-env-pod
    image: redis 
    env: 
      - name: SECRET_USERNAME 
        valueFrom: 
          secretKeyRef: 
            name: newsecret 
            key: username 
      - name: SECRET_PASSWORD 
        valueFrom: 
          secretKeyRef: 
            name: newsecret 
            key: password 
  restartPolicy: Never

2. kubectl execを使用します 再びポッドに打ち込む。

3. echoを使用して環境変数をテストします コマンド:

echo $[VARIABLE]

コマンド出力には、変数にマップされた値が表示されます:

シークレットを使用してプライベートDockerレジストリからDockerイメージをプルする

1.プライベートDockerレジストリを使用するには、最初にDockerにログインする必要があります:

docker login

2.プロンプトが表示されたら、ログイン資格情報を入力します。

3.ログインが成功すると、Dockerは config.jsonを更新します データをファイルします。 catコマンドを使用して、ファイルを表示します。

cat ~/.docker/config.json

auths セクションにはauthが含まれています キー。Dockerクレデンシャルのエンコードされたバージョンです。

4. kubectlを使用します シークレットを作成し、 config.jsonの場所を指定します ファイルとシークレットの種類:

kubectl create secret generic [secret] \
--from-file=.dockerconfigjson=./.docker/config.json \
--type=kubernetes.io/dockerconfigjson

または、Dockerへのログインを含め、上記のすべての手順を同じ行で実行します。

kubectl create secret docker-registry [secret] --docker-server:[address] --docker-username=[username] --docker-password=[password] --docker-email=[email]

5.このシークレットにアクセスできるポッドを作成するには、 yamlを作成します それを定義するファイル。ファイルは次のようになります:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec: 
  containers:
  - name: private-reg-container
    image:   
  imagePullSecrets:  
  - name: regcred

6. kubectl applyを使用してポッドをアクティブ化して、ポッドの作成を完了します

kubectl apply -f [file]

Kubernetesの秘密に関する考慮事項

Kubernetesの秘密 機密情報を安全に保管する方法です。ただし、使用シナリオに最適な方法を決定する前に、次の点を考慮する必要があります。

  • シークレットのユーザー名とパスワードはbase-64でエンコードされています。このテキストエンコーディング技術は、データを覆い隠し、偶発的な露出を防ぎますが、悪意のあるサイバー攻撃に対しては安全ではありません。
  • シークレットは、シークレットが配置されているクラスターでのみ使用できます。
  • シークレットは通常、すべてのロックを解除するために使用されるマスターキーに依存しています。マスターキーを保護する方法はいくつかありますが、それらを使用すると、別のマスターキーシナリオが作成されるだけです。

これらの問題を軽減するには、以下の解決策のいくつかを適用してください。

  • Kubernetesサービスアカウントを使用して、シークレットボールトへのアクセスが必要なユーザーを認証するシークレット管理ツールを統合します。
  • IAM(Identity and Access Management)ツールを統合して、システムがセキュアトークンサービスのトークンを使用できるようにします。
  • サードパーティのシークレットマネージャーをポッドに統合します。

Ubuntu
  1. CentOS7にTensorFlowをインストールして使用する方法

  2. サブドメインを作成して使用する方法

  3. Linuxでエイリアスを作成してエイリアスコマンドを使用する方法

  1. Umaskとは何ですか?その使用方法

  2. NFS Dockerボリューム:作成および使用方法

  3. Jenkins共有ライブラリ:作成、構成、および使用方法

  1. Kubernetes DaemonSetとは何ですか?その使用方法は?

  2. Ubuntu20.04にWineをインストールして使用する方法

  3. Ubuntu18.04にFFmpegをインストールして使用する方法