Kubelet クライアント証明書または鍵が未設定

API サーバーが kubelet に証明書で認証するには、クライアント証明書と秘密鍵が必要です。

説明

--kubelet-client-certificate と --kubelet-client-key は、kube-apiserver が kubelet に認証するための組み合わせです。証明書認証が必要な環境で片方でも欠けると、API サーバーから kubelet にアクセスできなくなる可能性があります。

このクライアント認証は、kubelet サーバー証明書の CA 検証とは別です。証明書と鍵だけで相互認証やアクセス制御のすべてが完成するわけではありません。

想定される影響

  • ログの取得や実行中のコンテナーへの接続など、kubelet を使う操作が失敗する可能性があります。
  • 接続失敗を避けるために匿名アクセスを許可すると、ノード管理機能が不要に公開されるおそれがあります。

対処方法

  • 証明書認証を使う場合は、両引数に有効なクライアント証明書と対応する秘密鍵を指定してください。
  • パス・マウント・権限・有効期限と、kubelet がクライアント CA を信頼する設定を確認してください。
  • サーバー証明書の検証と kubelet の認可も構成し、API サーバーの正常なアクセスを試験してください。

例

Kubernetes 1.6.0 の引数を使った過去の抜粋です。実際のバージョンで使う認証方式とファイルパスを適用してください。

変更前

yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
spec:
  containers:
    - name: command-demo-container
      image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
      command: ["kube-apiserver"]

クライアント証明書と鍵が指定されていません。kubelet がクライアント証明書を要求する場合、この設定では認証できません。

変更後

yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
spec:
  containers:
    - name: command-demo-container
      image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
      command:
        [
          "kube-apiserver",
          "--kubelet-client-certificate=/path/to/any/file.pem",
          "--kubelet-client-key=/path/to/any/file2.pem"
        ]

証明書と鍵を両方指定しています。kubelet がその証明書を信頼し、必要な操作を許可することも確認してください。

参考資料