kubernetesクラスタインストールガイド:CA証明書および関連コンポーネント証明書鍵の作成
12420 ワード
実際のkubernetesアプリケーションシーンでは、クラスタ内のコンポーネント間のアクセスはTLS双方向認証セキュリティアクセス、すなわちhttpsアクセスであるため、配置時にkubernetesの各コンポーネントに証明書を作成する必要がある.これは、httpsセキュリティアクセスがないとクラスタ間ノードの通信アクセスが安全ではないため、不正なユーザーはクライアント操作、クラスタリソースの不正な操作、クラスタサービスの異常、さらにはクラスタダウンタイムを引き起こすことができる.例えば、etcdが格納したデータを不正に操作するため、クラスタはhttpsを開いて双方向認証にアクセスする必要がある.
1準備
1.1変数定義および各コンポーネント使用証明書の説明
かんきょうへんすう
証明書の使用説明
コメント:
このインストールドキュメントでは、すべてのコンポーネントに証明書ファイルを生成します.実際には、一部のコンポーネントが証明書を共有するか、httpsアクセスを開くかを選択しないこともできます.例えば、etcd、flannel共有apiserverコンポーネント証明書またはhttpsアクセスを有効にしない場合、controller-manager、schedulerはhttpアクセスに基づいてもよい.
1.2関連ディレクトリの作成
1.3 cfsslツールセットのインストール
多くの場合、kubernetesクラスタは独自のプライベートネットワークに構築されています.例えば、公開クラウドvpc領域、自己構築データセンターなどです.k 8 sのすべての関連コンポーネントはTLS双方向認証が必要であるため、合法的な証明書機関の多くはssl一方向認証証明書を提供しています.CAルート証明書を自己構築し、対応する公開鍵と秘密鍵ルート証明書を生成する必要があります.opensslまたはcfsslを通じてCA証明書を作成することができます.ここではcfsslを例に挙げます.
2.関連証明書の作成
2.1ルート証明書の作成(CA)
CA証明書はクラスタのすべてのノードで共有されており、CA証明書を1つ作成するだけで、その後作成されたすべての証明書が署名されます.
CAプロファイルの作成
CAプロファイルは、ルート証明書の使用シーン(profile)と特定のパラメータ(usage、期限切れ、サービス側認証、クライアント認証、暗号化など)を構成するために使用され、その後、他の証明書に署名する際に特定のシーンを指定する必要があります. signing:この証明書が他の証明書に署名するために使用できることを示し、生成されたca.pem証明書中のCA=TRUE; server auth:clientがこの証明書でserverが提供した証明書を検証できることを示す. client auth:serverがこの証明書でclientが提供した証明書を検証できることを示す. expiryは証明書の使用時間、すなわち30年を表す.
CA証明書署名要求ファイルの作成 CN:Common Name,kube-apiserverは証明書からこのフィールドを要求されたユーザー名(User Name)として抽出し、ブラウザはこのフィールドを使用してウェブサイトが合法であるかどうかを検証する. O:Organization,kube-apiserverは証明書からこのフィールドを要求ユーザが属するグループ(Group)として抽出する. kube-apiserverは抽出したUser、GroupをRBAC授権のユーザー識別とする.
CA証明書公開鍵と秘密鍵の生成
2.2 kubernetes公開鍵と秘密鍵の作成
証明書署名リクエストの作成: apiserverはhttpsアクセスを開く必要があり、サービス側証明書を使用する必要があるため、hostフィールド、どのドメイン名またはIPが使用されるかを指定する必要があります. hostsフィールドは、masterノードIP、kubernetesサービスのIPおよびドメイン名をリストする証明書の使用を許可するIPおよびドメイン名のリストを指定します. kubernetes証明書はkube-apiserver証明書とも呼ばれ、kube-apiserver証明書として定義することもできる. ドメイン名を追加指定する必要がある場合は、汎ドメイン名方式で記入してください.すなわち、ドメイン名型証明書の要求で、対応するドメイン名を記入すればいいです. kubernetesサービスIPはapiserverによって自動的に作成され、一般的にservice-cluster-ip-rangeパラメータで指定されたセグメントの最初のIPであり、その後、次のコマンドで取得することができる: kubernetesのデフォルトのserver-cluster ipは10.254.0.0で始まり、他のネットワークが必要な場合はapiserver構成で指定してください.
証明書公開鍵と秘密鍵の生成
2.3 kube-controller-manager証明書公開鍵と秘密鍵の作成
証明書署名リクエストの作成: 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作業に必要な権限を与える.
証明書公開鍵と秘密鍵の生成
2.4 kube-scheduler証明書の公開鍵と秘密鍵の作成
証明書署名リクエストの作成: kube-schedulerはhttpsアクセスを開始し、サービス側証明書を使用する必要があるため、hostフィールドを指定し、IPを使用する必要があります. hostsリストには、すべてのkube-schedulerノードIPが含まれています.そうしないと、認証できません. CNとOはsystem:kube-scheduler、kubernetes内蔵のClusterRoleBindings system:kube-schedulerはkube-schedulerに仕事に必要な権限を与える.
証明書公開鍵と秘密鍵の生成
2.5 kube-proxy証明書公開鍵と秘密鍵の作成
証明書署名リクエストの作成:この証明書は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をバインドする.
証明書公開鍵と秘密鍵の生成
2.6 kubectl証明書の公開鍵と秘密鍵の作成
証明書署名リクエストの作成:この証明書はkubectlがclient証明書リンクapiserverとしてのみ使用されるため、hostsフィールドは空です. Oはsystem:mastersであり、kube-apiserverはこの証明書を受け取った後、要求されたGroupをsystem:mastersに設定する. 事前定義されたClusterRoleBinding cluster-adminはGroupsystem:mastersをRole cluster-adminにバインドし、このRoleはすべてのAPIの権限を付与する. kubectl証明書はクラスタの最高権限証明書であり、クラスタのすべてのリソースにroot権限があるので、慎重に保存してください.
証明書公開鍵と秘密鍵の生成
2.7 etcd証明書公開鍵と秘密鍵の作成
証明書署名リクエストの作成: etcdはhttpsアクセスを開始し、サービス側証明書を使用する必要があるため、どのIPがこの証明書 を使用するかを指定する必要がある. hostsフィールドは、証明書の使用を許可するetcdノードIPまたはドメイン名のリストを指定し、etcdクラスタの3つのノードIPをリストする必要がある.
証明書公開鍵と秘密鍵の生成
2.8ネットワークプラグイン証明書公開鍵と秘密鍵の作成
証明書署名リクエストの作成: flanneldはetcdクラスタからセグメント割り当て情報にアクセスし、etcdクラスタは双方向x 509証明書認証を有効にするため、flanneldの証明書と秘密鍵を生成してetcdセキュリティアクセスを認証する必要がある. この証明書はkubectlによってclient証明書としてのみ使用されるため、hostsフィールドは空です.
証明書公開鍵と秘密鍵の生成
2.9 metric server証明書の公開鍵と秘密鍵の作成
証明書署名リクエストの作成: CN名は、kube-apiserverのrequestheader-allowed-namesパラメータに存在する必要があります.そうしないと、metricsへの後続アクセス時に権限が不足することを示します.
証明書公開鍵と秘密鍵の生成
2.10署名要求関連ファイルの削除(オプション)
3同期証明書 masterノード同期masterノードすべてのコンポーネント(apiserver,controller-manager,scheduler)、flannel証明書、etcd証明書、metric証明書、ca証明書; workerノード同期workerノードすべての証明書(kube-proxy証明書)、flannel証明書、ca証明書公開鍵 ansibleセクションは、前のセクションで構成が完了しました.ここでは、同期モジュールを使用して、証明書を各ノードサービスに同期します. コンポーネントがhttpアクセスを開く必要がある場合、対応する証明書ファイルを対応するコンポーネントが存在するノードにコピーする必要があります.workerノードはkubeconfig認証ファイルやflannelなどの証明書だけを必要とします.kube-apiserverは自動的にkubeletローテーション証明書になります.
証明書の作成内容は基本的に完了します.tls証明書の双方向認証については、自分でドキュメントを参照してください.証明書を作成した後、各コンポーネント認証ファイルを作成する必要があります.次のセクションを参照してください.kubernetesクラスタインストールガイド:クライアントインストールおよび各コンポーネント認証ファイルの作成
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<
CA証明書署名要求ファイルの作成
cat >$CA_DIR/ca-csr.json<
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
$ kubectl get svc kubernetes
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 443/TCP 1d
証明書公開鍵と秘密鍵の生成
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 <
証明書公開鍵と秘密鍵の生成
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 <
証明書公開鍵と秘密鍵の生成
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
証明書公開鍵と秘密鍵の生成
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
証明書公開鍵と秘密鍵の生成
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
証明書公開鍵と秘密鍵の生成
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
証明書公開鍵と秘密鍵の生成
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 <
証明書公開鍵と秘密鍵の生成
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同期証明書
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
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
注釈:証明書の作成内容は基本的に完了します.tls証明書の双方向認証については、自分でドキュメントを参照してください.証明書を作成した後、各コンポーネント認証ファイルを作成する必要があります.次のセクションを参照してください.kubernetesクラスタインストールガイド:クライアントインストールおよび各コンポーネント認証ファイルの作成