バイナリインストールkubernetes v 1.11.2(第8章kube-apiserver配備)
22896 ワード
前章の配置を続行します.
八、kube-apiserverコンポーネントの配置
7章のhaproxyとkeepalivedを使用して配備された高可用性クラスタが提供するVIP:${MASTER_VIP}
8.1バイナリファイルのダウンロード、第三章参照
8.2 kubernetes証明書と秘密鍵の作成 hostフィールドは、証明書の使用を許可するIPまたはドメイン名のリストを指定します.ここには、VIP、apiserverノードIP、kubernetesサービスIP、ドメイン名 がリストされています.ドメイン名は最後にできません.(kubernetes.default.svc.cluster.local.)でなければ、解析に失敗した場合は、x 509:cannot parse dnsName"kubernetes.default.svc.cluster.local." 非clusterを使用する場合.localドメイン名、例えばxxx.comでは、ドメイン名リストの最後の2つのドメイン名を変更する必要があります:kubernetes.default.svc.xxx、kubernetes.default.svc.xxx.com kubernetesサービスIPはapiserverによって自動的に作成され、一般的に-service-cluster-ip-rangeパラメータで指定されたセグメントの最初のIPであり、その後、次のコマンドで取得することができる:
8.3証明書と秘密鍵の生成
8.4生成した証明書と秘密鍵ファイルをmasterノードにコピーする
8.5暗号化プロファイルの作成
8.6暗号化プロファイルをmasterノードの/etc/kubernetesディレクトリにコピーする
置換後の暗号化プロファイル:
8.7 kube-apiserver systemd unitテンプレートファイルの作成--experimental-encryption-provider-config:暗号化機能を有効にする --authorization-mode=Node,RBAC:NodeとRBACライセンスモードをオンにし、不正な要求を拒否する --enable-admission-plugins:ServiceAccountとNodeRestrictionを有効にする --service-account-key-file:署名ServiceAccount Tokenの公開鍵ファイル、kube-controller-managerの--service-account-private-key-fileは秘密鍵ファイルを指定し、両者のペアは を使用します.--tls-*-file:apiserverが使用する証明書、秘密鍵、CAファイルを指定します.--Client-ca-fileは、client(kue-controller-manager、kube-scheduler、kubelet、kube-proxyなど)要求に伴う証明書 を検証するために使用される.--kubelet-client-certificate、--kubelet-client-key:指定した場合、httpsを使用してkubelet APIsにアクセスします.RBACルールは、証明書に対応するユーザ(上のkubernetes*.pem証明書のユーザはkubernetes)のユーザに定義する必要があります.そうしないと、kubelet APIにアクセスすると、 が許可されていないことを通知します.--bind-address:127.0.0.1にはできません.そうしないと、外部からセキュリティポート6443 にアクセスできません.--insecure-port=0:傍受非安全ポートを閉じる(8080) --service-cluster-ip-range:Service Cluster IPアドレスセグメント を指定--service-node-port-range:NodePortのポート範囲を指定する --runtime-config=api/all=true:autoscaling/v 2 alpha 1 などのすべてのバージョンのAPIsを有効にします.--enable-bootstrap-token-auth:kubelet bootstrapを有効にするtoken認証 --apiserver-count=3:クラスタ実行モードを指定し、複数のkube-apiserverがleader選挙によって1つのワークノードを生成し、他のノードがブロックされている User=k 8 s:k 8 sアカウントを使用して を実行
8.8各ノードに対するkube-apiserver systemd unitファイルの作成と配布
テンプレート内の変数を置き換え、各masterノードのsystemd unitファイルを生成します.
8.9生成したsystemd unitファイルの配布ログディレクトリ を作成する必要があります.配布後、ファイル名はkube-apiserverと変更された.service
8.10 kube-apiserverサービスの開始
8.11 kube-apiserver運転状態の確認
サービスステータスがActive:active(running)であることを確認
ログの表示方法:journalctl-u kube-apiserver
8.12 kube-apiserver書き込みetcdデータの印刷
8.13クラスタ情報の確認
8.14 kubectl命令式を実行するときに次のようなエラーメッセージを出力と、使用する~/.kube/configファイルが間違っています.正しいアカウントに切り替えてから、このコマンドを実行してください.
The connection to the server localhost:8080 was refused - did you specify the right host or port?
8.15 kubectl get componentstatusesコマンドを実行すると、apiserverはデフォルトで127.0.0.1にリクエストを送信します.Controller-manager、schedulerがクラスタモードで動作している場合、kube-apiserverとは1台のマシンに存在しない可能性があります.この場合、Controller-managerまたはschedulerの状態はUnhealthyですが、実際には正常に動作します.
8.16 kube-apiserverが傍受しているポートを確認する 6443 https要求を受信するセキュリティポートは、すべての要求を認証し、 を許可する.非セキュアポートがオフになっているため、8080 は傍受されていない.
8.17 kubernetes証明書にkubelet APIへのアクセス権を付与
kubectl exec、run、logsなどのコマンドを実行するとapiserverがkubeletに転送されます.ここでRBACルールを定義します
転載先:https://www.cnblogs.com/aast/p/9849416.html
八、kube-apiserverコンポーネントの配置
7章のhaproxyとkeepalivedを使用して配備された高可用性クラスタが提供するVIP:${MASTER_VIP}
8.1バイナリファイルのダウンロード、第三章参照
8.2 kubernetes証明書と秘密鍵の作成
source /opt/k8s/bin/environment.sh
cat > kubernetes-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.56.20",
"192.168.56.20",
"${MASTER_VIP}",
"${CLUSTER_KUBERNETES_SVC_IP}",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
EOF
$ kubectl get svc kubernetes
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 443/TCP 1d
8.3証明書と秘密鍵の生成
cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
-ca-key=/etc/kubernetes/cert/ca-key.pem \
-config=/etc/kubernetes/cert/ca-config.json \
-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls kubernetes*pem
8.4生成した証明書と秘密鍵ファイルをmasterノードにコピーする
source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "mkdir -p /etc/kubernetes/cert/ && sudo chown -R k8s /etc/kubernetes/cert/"
scp kubernetes*.pem k8s@${master_ip}:/etc/kubernetes/cert/
done
8.5暗号化プロファイルの作成
source /opt/k8s/bin/environment.sh
cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${ENCRYPTION_KEY}
- identity: {}
EOF
8.6暗号化プロファイルをmasterノードの/etc/kubernetesディレクトリにコピーする
source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
scp encryption-config.yaml root@${master_ip}:/etc/kubernetes/
done
置換後の暗号化プロファイル:
[root@k8s-m1 cert]# more encryption-config.yaml
kind: EncryptionConfig
apiVersion: v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: V8NUF8gATb1bZmBke9NRVw33JHt3elTDfNoIi0uhOFI=
- identity: {}
8.7 kube-apiserver systemd unitテンプレートファイルの作成
source /opt/k8s/bin/environment.sh
cat > kube-apiserver.service.template <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
ExecStart=/opt/k8s/bin/kube-apiserver \\
--enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
--anonymous-auth=false \\
--experimental-encryption-provider-config=/etc/kubernetes/encryption-config.yaml \\
--advertise-address=##NODE_IP## \\
--bind-address=##NODE_IP## \\
--insecure-port=0 \\
--authorization-mode=Node,RBAC \\
--runtime-config=api/all \\
--enable-bootstrap-token-auth \\
--service-cluster-ip-range=${SERVICE_CIDR} \\
--service-node-port-range=${NODE_PORT_RANGE} \\
--tls-cert-file=/etc/kubernetes/cert/kubernetes.pem \\
--tls-private-key-file=/etc/kubernetes/cert/kubernetes-key.pem \\
--client-ca-file=/etc/kubernetes/cert/ca.pem \\
--kubelet-client-certificate=/etc/kubernetes/cert/kubernetes.pem \\
--kubelet-client-key=/etc/kubernetes/cert/kubernetes-key.pem \\
--service-account-key-file=/etc/kubernetes/cert/ca-key.pem \\
--etcd-cafile=/etc/kubernetes/cert/ca.pem \\
--etcd-certfile=/etc/kubernetes/cert/kubernetes.pem \\
--etcd-keyfile=/etc/kubernetes/cert/kubernetes-key.pem \\
--etcd-servers=${ETCD_ENDPOINTS} \\
--enable-swagger-ui=true \\
--allow-privileged=true \\
--apiserver-count=2 \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/var/log/kube-apiserver-audit.log \\
--event-ttl=1h \\
--alsologtostderr=true \\
--logtostderr=false \\
--log-dir=/var/log/kubernetes \\
--v=2
Restart=on-failure
RestartSec=5
Type=notify
User=k8s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
8.8各ノードに対するkube-apiserver systemd unitファイルの作成と配布
テンプレート内の変数を置き換え、各masterノードのsystemd unitファイルを生成します.
source /opt/k8s/bin/environment.sh
for (( i=0; i < 2; i++ ))
do
sed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" kube-apiserver.service.template > kube-apiserver-${NODE_IPS[i]}.service
done
ls kube-apiserver*.service
8.9生成したsystemd unitファイルの配布
source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "mkdir -p /var/log/kubernetes && chown -R k8s /var/log/kubernetes"
scp kube-apiserver-${master_ip}.service root@${master_ip}:/etc/systemd/system/kube-apiserver.service
done
8.10 kube-apiserverサービスの開始
source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver"
done
8.11 kube-apiserver運転状態の確認
source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "systemctl status kube-apiserver |grep 'Active:'"
done
サービスステータスがActive:active(running)であることを確認
ログの表示方法:journalctl-u kube-apiserver
8.12 kube-apiserver書き込みetcdデータの印刷
source /opt/k8s/bin/environment.sh
ETCDCTL_API=3 etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/etcd/cert/etcd.pem \
--key=/etc/etcd/cert/etcd-key.pem \
get /registry/ --prefix --keys-only
8.13クラスタ情報の確認
[root@k8s-m1 template]# kubectl cluster-info
Kubernetes master is running at https://192.168.56.6:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@k8s-m1 template]# kubectl get all --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.254.0.1 443/TCP 9m
[root@k8s-m1 template]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
8.14 kubectl命令式を実行するときに次のようなエラーメッセージを出力と、使用する~/.kube/configファイルが間違っています.正しいアカウントに切り替えてから、このコマンドを実行してください.
The connection to the server localhost:8080 was refused - did you specify the right host or port?
8.15 kubectl get componentstatusesコマンドを実行すると、apiserverはデフォルトで127.0.0.1にリクエストを送信します.Controller-manager、schedulerがクラスタモードで動作している場合、kube-apiserverとは1台のマシンに存在しない可能性があります.この場合、Controller-managerまたはschedulerの状態はUnhealthyですが、実際には正常に動作します.
8.16 kube-apiserverが傍受しているポートを確認する
[root@k8s-m1 template]# sudo netstat -lnpt|grep kube
tcp 0 0 192.168.56.20:6443 0.0.0.0:* LISTEN 9918/kube-apiserver
8.17 kubernetes証明書にkubelet APIへのアクセス権を付与
kubectl exec、run、logsなどのコマンドを実行するとapiserverがkubeletに転送されます.ここでRBACルールを定義します
[root@k8s-m1 template]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created
転載先:https://www.cnblogs.com/aast/p/9849416.html