kubernetesクラスタインストールガイド:CA証明書および関連コンポーネント証明書鍵の作成


実際のkubernetesアプリケーションシーンでは、クラスタ内のコンポーネント間のアクセスはTLS双方向認証セキュリティアクセス、すなわちhttpsアクセスであるため、配置時にkubernetesの各コンポーネントに証明書を作成する必要がある.これは、httpsセキュリティアクセスがないとクラスタ間ノードの通信アクセスが安全ではないため、不正なユーザーはクライアント操作、クラスタリソースの不正な操作、クラスタサービスの異常、さらにはクラスタダウンタイムを引き起こすことができる.例えば、etcdが格納したデータを不正に操作するため、クラスタはhttpsを開いて双方向認証にアクセスする必要がある.
1準備
1.1変数定義および各コンポーネント使用証明書の説明
かんきょうへんすう
#          
SSL_BIN_PATH=/usr/local/cfssl
CA_DIR=/etc/k8s/ssl
#      apiserver vip    
VIP_KUBEAPI_OUTSIDE=192.168.20.100
VIP_KUBEAPI_INSIDE=10.10.10.100
# master           
MASTER1_IP=10.10.10.22
MASTER2_IP=10.10.10.23
MASTER3_IP=10.10.10.24
# etcd          
ETCD1_IP=10.10.10.22
ETCD2_IP=10.10.10.23
ETCD3_IP=10.10.10.24
# kubernetes  service   
CLUSTER_KUBERNETES_SVC_IP=10.254.0.1
      
DOMAIN=mo9.com

証明書の使用説明
kube-apiserver  :
   ca.pem、kubernetes.pem、kubernetes-key.pem、etcd     、 metric      ;
kube-controller-manager  
   ca-key.pem, ca.pem, kuber-controller-manager      ;
kube-scheduler  : 
  ca.pem、kube-scheduler.pem、kube-scheduler-key.pem   ;
kube-proxy  :
   ca.pem、kube-proxy-key.pem、kube-proxy.pem   ;
kubelet  :
   ca.pem   ;
kubectl  :
   ca.pem、admin-key.pem、admin.pem   ;
etcd  :
   ca.pem、etcd-key.pem、etcd.pem   ;
flannel  :
  ca.pem、flannel.pem、flannel-key.pem   ;

コメント:
このインストールドキュメントでは、すべてのコンポーネントに証明書ファイルを生成します.実際には、一部のコンポーネントが証明書を共有するか、httpsアクセスを開くかを選択しないこともできます.例えば、etcd、flannel共有apiserverコンポーネント証明書またはhttpsアクセスを有効にしない場合、controller-manager、schedulerはhttpアクセスに基づいてもよい.
1.2関連ディレクトリの作成
mkdir -p $SSL_BIN_PATH
mkdir -p $CA_DIR

1.3 cfsslツールセットのインストール
多くの場合、kubernetesクラスタは独自のプライベートネットワークに構築されています.例えば、公開クラウドvpc領域、自己構築データセンターなどです.k 8 sのすべての関連コンポーネントはTLS双方向認証が必要であるため、合法的な証明書機関の多くはssl一方向認証証明書を提供しています.CAルート証明書を自己構築し、対応する公開鍵と秘密鍵ルート証明書を生成する必要があります.opensslまたはcfsslを通じてCA証明書を作成することができます.ここではcfsslを例に挙げます.
mkdir -p $SSL_BIN_PATH/bin  > /dev/null 2>&1
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -P $SS_BINL_PATH/bin/ 
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -P $SSL_BIN__PATH/bin/ 
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -P $SSL_BIN_PATH/bin/
cd  $SSL_BIN_PATH/bin/
mv cfssl_linux-amd64 cfssl  && mv cfssljson_linux-amd64 cfssljson
mv cfssl-certinfo_linux-amd64 cfssl-certinfo
chmod +x * && ln -sf $SSL_BIN_PATH/bin/cfssl* /usr/local/bin/

2.関連証明書の作成
2.1ルート証明書の作成(CA)
CA証明書はクラスタのすべてのノードで共有されており、CA証明書を1つ作成するだけで、その後作成されたすべての証明書が署名されます.
CAプロファイルの作成
CAプロファイルは、ルート証明書の使用シーン(profile)と特定のパラメータ(usage、期限切れ、サービス側認証、クライアント認証、暗号化など)を構成するために使用され、その後、他の証明書に署名する際に特定のシーンを指定する必要があります.
cat >$CA_DIR/ca-config.json<
  • signing:この証明書が他の証明書に署名するために使用できることを示し、生成されたca.pem証明書中のCA=TRUE;
  • server auth:clientがこの証明書でserverが提供した証明書を検証できることを示す.
  • client auth:serverがこの証明書でclientが提供した証明書を検証できることを示す.
  • expiryは証明書の使用時間、すなわち30年を表す.

  • CA証明書署名要求ファイルの作成
    cat >$CA_DIR/ca-csr.json<
  • CN:Common Name,kube-apiserverは証明書からこのフィールドを要求されたユーザー名(User Name)として抽出し、ブラウザはこのフィールドを使用してウェブサイトが合法であるかどうかを検証する.
  • O:Organization,kube-apiserverは証明書からこのフィールドを要求ユーザが属するグループ(Group)として抽出する.
  • kube-apiserverは抽出したUser、GroupをRBAC授権のユーザー識別とする.

  • CA証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert --initca=true ca-csr.json | cfssljson --bare ca

    2.2 kubernetes公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat >$CA_DIR/kubernetes-csr.json << EOF
    {
        "CN": "kubernetes",
        "hosts": [
          "127.0.0.1",
          "${MASTER1_IP}",
          "${MASTER2_IP}",
          "${MASTER3_IP}",
          "${VIP_KUBEAPI_INSIDE}",
          "${VIP_KUBEAPI_OUTSIDE}",
          "${CLUSTER_KUBERNETES_SVC_IP}",
          "*.${DOMAIN}",
          "kubernetes",
          "kubernetes.default",
          "kubernetes.default.svc",
          "kubernetes.default.svc.cluster",
          "kubernetes.default.svc.cluster.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "ST": "ShangHai",
                "L": "SahgnHai",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    EOF
  • apiserverはhttpsアクセスを開く必要があり、サービス側証明書を使用する必要があるため、hostフィールド、どのドメイン名またはIPが使用されるかを指定する必要があります.
  • hostsフィールドは、masterノードIP、kubernetesサービスのIPおよびドメイン名をリストする証明書の使用を許可するIPおよびドメイン名のリストを指定します.
  • kubernetes証明書はkube-apiserver証明書とも呼ばれ、kube-apiserver証明書として定義することもできる.
  • ドメイン名を追加指定する必要がある場合は、汎ドメイン名方式で記入してください.すなわち、ドメイン名型証明書の要求で、対応するドメイン名を記入すればいいです.
  • kubernetesサービスIPはapiserverによって自動的に作成され、一般的にservice-cluster-ip-rangeパラメータで指定されたセグメントの最初のIPであり、その後、次のコマンドで取得することができる:
  • $ kubectl get svc kubernetes
    NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   10.254.0.1           443/TCP   1d
  • kubernetesのデフォルトのserver-cluster ipは10.254.0.0で始まり、他のネットワークが必要な場合はapiserver構成で指定してください.

  • 証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    kubernetes-csr.json | cfssljson -bare kubernetes

    2.3 kube-controller-manager証明書公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/kube-controller-manager-csr.json <
  • kube-controller-managerはhttpsアクセスを開始し、サービス側証明書を使用する必要があるため、hostフィールド、どのIPが使用されるかを指定する必要があります.
  • hostsリストには、すべてのkube-controller-managerノードIPが含まれています.そうしないと認証できません.
  • CNとOはいずれもsystem:kube-controller-manager,kubernetes内蔵のClusterRoleBindings system:kube-controller-managerはkube-controller-managerにkube-controller-manager作業に必要な権限を与える.

  • 証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

    2.4 kube-scheduler証明書の公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/kube-scheduler-csr.json <
  • kube-schedulerはhttpsアクセスを開始し、サービス側証明書を使用する必要があるため、hostフィールドを指定し、IPを使用する必要があります.
  • hostsリストには、すべてのkube-schedulerノードIPが含まれています.そうしないと、認証できません.
  • CNとOはsystem:kube-scheduler、kubernetes内蔵のClusterRoleBindings system:kube-schedulerはkube-schedulerに仕事に必要な権限を与える.

  • 証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes  \
    kube-scheduler-csr.json | cfssljson -bare kube-scheduler

    2.5 kube-proxy証明書公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/kube-proxy-csr.json << EOF
    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "ShangHai",
          "L": "SahgnHai",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
  • この証明書はkube-proxyがclient証明書リンクapiserverとしてのみ使用されるため、hostsフィールドは空です.
  • CN:証明書のUserをsystem:kube-proxyと指定する.
  • 事前定義されたRoleBinding system:node-proxierは、kube-apiserver Proxy関連APIを呼び出す権限を付与するRole system:node-proxierにUser system:kube-proxyをバインドする.

  • 証明書公開鍵と秘密鍵の生成
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    kube-proxy-csr.json | cfssljson -bare kube-proxy

    2.6 kubectl証明書の公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/admin-csr.json << EOF
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "ShangHai",
          "L": "SahgnHai",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
  • この証明書はkubectlがclient証明書リンクapiserverとしてのみ使用されるため、hostsフィールドは空です.
  • Oはsystem:mastersであり、kube-apiserverはこの証明書を受け取った後、要求されたGroupをsystem:mastersに設定する.
  • 事前定義されたClusterRoleBinding cluster-adminはGroupsystem:mastersをRole cluster-adminにバインドし、このRoleはすべてのAPIの権限を付与する.
  • kubectl証明書はクラスタの最高権限証明書であり、クラスタのすべてのリソースにroot権限があるので、慎重に保存してください.

  • 証明書公開鍵と秘密鍵の生成
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    admin-csr.json | cfssljson -bare admin

    2.7 etcd証明書公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/etcd-csr.json << EOF
    {
      "CN": "etcd",
      "hosts": [
        "127.0.0.1",
        "${ETCD1_IP}",
        "${ETCD2_IP}",
        "${ETCD3_IP}"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "ShangHai",
          "L": "SahgnHai",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
  • etcdはhttpsアクセスを開始し、サービス側証明書を使用する必要があるため、どのIPがこの証明書
  • を使用するかを指定する必要がある.
  • hostsフィールドは、証明書の使用を許可するetcdノードIPまたはドメイン名のリストを指定し、etcdクラスタの3つのノードIPをリストする必要がある.

  • 証明書公開鍵と秘密鍵の生成
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    etcd-csr.json | cfssljson -bare etcd

    2.8ネットワークプラグイン証明書公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/flannel-csr.json << EOF
    {
      "CN": "flanneld",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "ShangHai",
          "L": "ShangHai",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
  • flanneldはetcdクラスタからセグメント割り当て情報にアクセスし、etcdクラスタは双方向x 509証明書認証を有効にするため、flanneldの証明書と秘密鍵を生成してetcdセキュリティアクセスを認証する必要がある.
  • この証明書はkubectlによってclient証明書としてのみ使用されるため、hostsフィールドは空です.

  • 証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    flannel-csr.json | cfssljson -bare flannel

    2.9 metric server証明書の公開鍵と秘密鍵の作成
    証明書署名リクエストの作成:
    cat > $CA_DIR/proxy-client-csr.json <
  • CN名は、kube-apiserverのrequestheader-allowed-namesパラメータに存在する必要があります.そうしないと、metricsへの後続アクセス時に権限が不足することを示します.

  • 証明書公開鍵と秘密鍵の生成
    cd $CA_DIR
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
    proxy-client-csr.json | cfssljson -bare proxy-client

    2.10署名要求関連ファイルの削除(オプション)
    cd $CA_DIR
    rm -rf *csr* && rm -rf *json
    chmod 666 *

    3同期証明書
  • masterノード同期masterノードすべてのコンポーネント(apiserver,controller-manager,scheduler)、flannel証明書、etcd証明書、metric証明書、ca証明書;
    ansible master_k8s_vgs -m \
    synchronize -a "src=${CA_DIR} dest=${CA_DIR}/ mode=push delete=yes rsync_opts=-avz'" -b
    ansible master_k8s_vgs -m shell -a "chmod 666 ${CA_DIR}/*" -b
    ansible master_k8s_vgs -m shell -a "cd ${CA_DIR} && rm -rf kube-proxy*" -b
  • workerノード同期workerノードすべての証明書(kube-proxy証明書)、flannel証明書、ca証明書公開鍵
    ansible worker_k8s_vgs -m copy -a "src=${CA_DIR}/ca.pem dest=${CA_DIR}/" -b
    ansible worker_k8s_vgs -m copy -a "src=${CA_DIR}/flannel.pem dest=${CA_DIR}/" -b
    ansible worker_k8s_vgs -m copy -a "src=${CA_DIR}/flannel-key.pem dest=${CA_DIR}/" -b
    注釈:
  • ansibleセクションは、前のセクションで構成が完了しました.ここでは、同期モジュールを使用して、証明書を各ノードサービスに同期します.
  • コンポーネントがhttpアクセスを開く必要がある場合、対応する証明書ファイルを対応するコンポーネントが存在するノードにコピーする必要があります.workerノードはkubeconfig認証ファイルやflannelなどの証明書だけを必要とします.kube-apiserverは自動的にkubeletローテーション証明書になります.


  • 証明書の作成内容は基本的に完了します.tls証明書の双方向認証については、自分でドキュメントを参照してください.証明書を作成した後、各コンポーネント認証ファイルを作成する必要があります.次のセクションを参照してください.kubernetesクラスタインストールガイド:クライアントインストールおよび各コンポーネント認証ファイルの作成