為什麼我無法在 Amazon EKS 中執行 kubectl 命令?
我無法在 Amazon Elastic Kubernetes Service (Amazon EKS) 中成功執行 kubectl 命令,如 kubectl exec、kubectl logs、kubectl attach 或 kubectl port-forward。
解決方案
一般而言,在 Amazon EKS 叢集中,kubectl 命令會失敗,因為 API 伺服器並未與在工作節點上執行的 kubelet 進行通訊。常見的 kubectl 命令包括 kubectl exec、kubectl logs、kubectl attach,或 kubectl port-forward。
若要對此錯誤進行疑難排解,請驗證以下各項:
- Pod 在次要無類別域間路由 (CIDR) 範圍內執行。
- 用於控制平面和節點的安全群組使用傳入和傳出規則的最佳實務。
- aws-auth ConfigMap 具有正確的 AWS Identity and Access Management (IAM) 角色,其中包含與您的節點關聯的 Kubernetes 使用者名稱。
- 滿足提交新憑證的要求。
Pod 在次要無類別域間路由 (CIDR) 範圍內執行
在建立叢集後,Amazon EKS 無法立即與新增至虛擬私有雲端 (VPC) 的 CIDR 區塊的子網路中啟動的節點通訊。將 CIDR 區塊新增至現有叢集導致的更新範圍,可能需要五小時才能被 Amazon EKS 辨識。如需詳細資訊,請參閱 Amazon EKS VPC 和子網路的要求與考量事項。
如果 Pod 在次要 CIDR 範圍內執行,則請執行以下操作:
- 等待長達五小時,這些命令才能開始工作。
- 確保每個子網路中至少有五個可用 IP 地址,以成功完成自動化。
使用以下範例政策來檢視任何 VPC 中所有子網路的可用 IP 地址:
[ec2-user@ip-172-31-51-214 ~]$ aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-078af71a874f2f068" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"' "subnet-0d89886ca3fb30074=8186" "subnet-0ee46aa228bdc9a74=8187" "subnet-0a0186a277b8b6a51=8186" "subnet-0d1fb1de0732b5766=8187" "subnet-077eff87a4e25316d=8187" "subnet-0f01c02b04708f638=8186"
用於控制平面和節點的安全群組具有最低要求的傳入和傳出規則
在工作節點上執行時,API 伺服器必須具有最低要求的傳入和傳出規則,才能對 kubelet 進行 API 呼叫。若要驗證用於控制平面和節點安全群組是否具有最低要求的傳入和傳出規則,請參閲 Amazon EKS 安全群組需求和考量。
aws-auth ConfigMap 具有正確的 IAM 角色,其中包含與您的節點關聯的 Kubernetes 使用者名稱
您必須將正確的 IAM 角色套用到 aws-auth ConfigMap。請確定 IAM 角色具有與節點相關聯的 Kubernetes 使用者名稱。若要將 aws-auth ConfigMap 套用到您的叢集,請參閱將 IAM 使用者或角色新增至您的 Amazon EKS 叢集。
滿足提交新憑證的要求
Amazon EKS 叢集要求節點的 kubelet 為自身提交和輪換服務憑證。服務憑證不可用時,會發生憑證錯誤。
1. 執行以下命令以驗證 kubelet 伺服器憑證:
cd /var/lib/kubelet/pki/# use openssl command to validate kubelet server cert sudo openssl x509 -text -noout -in kubelet-server-current.pem
輸出類似於以下內容:
Certificate: Data: Version: 3 (0x2) Serial Number: 1e:f1:84:62:a3:39:32:c7:30:04:b5:cf:b0:91:6e:c7:bd:5d:69:fb Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: Oct 11 19:03:00 2021 GMT Not After : Oct 11 19:03:00 2022 GMT Subject: O=system:nodes, CN=system:node:ip-192-168-65-123.us-east-2.compute.internal Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:7f:44:c6:95:7e:0f:1e:f8:f8:bf:2e:f8:a9:40: 6a:4f:83:0a:e8:89:7b:87:cb:d6:b8:47:4e:8d:51: 00:f4:ac:9d:ef:10:e4:97:4a:1b:69:6f:2f:86:df: e0:81:24:c6:62:d2:00:b8:c7:60:da:97:db:da:b7: c3:08:20:6e:70 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Basic Constraints: critical CA:FALSE X509v3 Subject Key Identifier: A8:EA:CD:1A:5D:AB:DC:47:A0:93:31:59:ED:05:E8:7E:40:6D:ED:8C X509v3 Authority Key Identifier: keyid:2A:F2:F7:E8:F6:1F:55:D1:74:7D:59:94:B1:45:23:FD:A1:8C:97:9B X509v3 Subject Alternative Name: DNS:ec2-3-18-214-69.us-east-2.compute.amazonaws.com, DNS:ip-192-168-65-123.us-east-2.compute.internal, IP Address:192.168.65.123, IP Address:3.18.214.69
2. 檢閱 kubelet 日誌是否有憑證錯誤。如果您沒有看到錯誤,則表示滿足提交新憑證的要求。
kubelet 日誌憑證錯誤的範例:
kubelet[8070]: I1021 18:49:21.594143 8070 log.go:184] http: TLS handshake error from 192.168.130.116:38710: no serving certificate available for the kubelet
**注意:**如需更詳細的日誌,請開啟具有旗標 --v=4 的 kubelet 詳細日誌,然後在工作節點上重新啟動 kubelet。kubelet 詳細日誌類似於以下內容:
#kubelet verbosity can be increased by updating this file ...max verbosisty level --v=4 sudo vi /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf # Normal kubelet verbosisty is 2 by default cat /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf [Service] Environment='KUBELET_ARGS=--node-ip=192.168.65.123 --pod-infra-container-image=XXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com/eks/pause:3.1-eksbuild.1 --v=2 #to restart the demon and kubelet sudo systemctl daemon-reload sudo systemctl restart kubelet #make sure kubelet in running state sudo systemctl status kubelet # to stream logs for kubelet journalctl -u kubelet -f
3. 如果您看到錯誤,請驗證工作節點上的 kubelet config 檔案 /etc/kubernetes/kubelet/kubelet-config.json,然後確認 RotateKubeletServerCertificate 和 serverTLSBootstrap 旗標列為 true:
"featureGates": { "RotateKubeletServerCertificate": true }, "serverTLSBootstrap": true,
4. 執行以下 eks:node-bootstrapper 命令,以確認 kubelet 具有提交憑證簽署請求 (CSR) 所需的角色型存取控制 (RBAC) 系統許可:
$ kubectl get clusterrole eks:node-bootstrapper -o yaml apiVersion: rbac.authorization.k8s.io/v1
輸出類似於以下內容:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"node"},"name":"eks:node-bootstrapper"},"rules":[{"apiGroups":["certificates.k8s.io"],"resources":["certificatesigningrequests/selfnodeserver"],"verbs":["create"]}]} creationTimestamp: "2021-11-09T10:07:42Z" labels: eks.amazonaws.com/component: node name: eks:node-bootstrapper resourceVersion: "199" uid: da268bf3-31a3-420a-9a71-414229437b7e rules: - apiGroups: - certificates.k8s.io resources: - certificatesigningrequests/selfnodeserver verbs: - create
所需的 RBAC 許可包括以下屬性:
- apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeserver"] verbs: ["create"]
5. 執行以下命令以檢查叢集角色 eks:node-bootstrapper 是否綁定至 system:bootstrappers 和 system:nodes。這可讓 kubelet 為自身提交和輪換服務憑證。
$ kubectl get clusterrolebinding eks:node-bootstrapper -o yaml apiVersion: rbac.authorization.k8s.io/v1
輸出類似於以下內容:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"node"},"name":"eks:node-bootstrapper"},"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"eks:node-bootstrapper"},"subjects":[{"apiGroup":"rbac.authorization.k8s.io","kind":"Group","name":"system:bootstrappers"},{"apiGroup":"rbac.authorization.k8s.io","kind":"Group","name":"system:nodes"}]} creationTimestamp: "2021-11-09T10:07:42Z" labels: eks.amazonaws.com/component: node name: eks:node-bootstrapper resourceVersion: "198" uid: f6214fe0-8258-4571-a7b9-ff3455add7b9 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:node-bootstrapper subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:bootstrappers - apiGroup: rbac.authorization.k8s.io kind: Group name: system:nodes
相關內容
- 已提問 1 年前lg...
- 已提問 1 個月前lg...
- 已提問 2 個月前lg...
- AWS 官方已更新 10 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 9 個月前