Amazon EKS에서 kubectl 명령을 실행할 수 없는 이유는 무엇인가요?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 kubectl exec, kubectl logs, kubectl attach 또는 kubectl port-forward와 같은 kubectl 명령을 정상적으로 실행할 수 없습니다.

해결 방법

일반적으로, API 서버가 워커 노드에서 실행되는 kubelet과 통신하지 않기 때문에 Amazon EKS 클러스터에서 kubectl 명령이 실패합니다. 일반적인 kubectl 명령에는 kubectl exec, kubectl logs, kubectl attach 또는 kubectl port-forward가 포함됩니다.

이 문제를 해결하려면 다음을 확인하세요.

  • 포드가 Classless Inter-Domain Routing(CIDR) 범위에서 실행 중입니다.
  • 컨트롤 플레인 및 노드에 사용되는 보안 그룹이 인바운드 및 아웃바운드 규칙에 대한 모범 사례를 사용합니다.
  • aws-auth ConfigMap에 노드와 연결된 Kubernetes 사용자 이름을 사용하는 올바른 AWS Identity and Access Management(IAM) 역할이 있습니다.
  • 새 인증서를 제출하기 위한 요구 사항이 충족되었습니다.

포드가 Classless Inter-Domain Routing(CIDR) 범위에서 실행 중임

클러스터를 생성한 직후 Amazon EKS는 Virtual Private Cloud(VPC)에 추가된 CIDR 블록에서 서브넷에서 시작된 노드와 통신할 수 없습니다. 기존 클러스터에 CIDR 블록을 추가하여 발생하는 업데이트된 범위를 Amazon EKS가 인식하는 데 5시간까지 걸릴 수 있습니다. 자세한 내용은 Amazon EKS VPC 및 서브넷 요구 사항과 고려 사항을 참조하세요.

포드가 보조 CIDR 범위에서 실행 중인 경우에는 다음 작업을 수행합니다.

  • 이러한 명령이 작동할 때까지 최대 5시간 기다립니다.
  • 자동화를 성공적으로 완료하려면 각 서브넷에 5개 이상의 사용 가능한 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"

컨트롤 플레인 및 노드에 사용되는 보안 그룹에 최소한의 필수 인바운드 및 아웃바운드 규칙이 있음

워커 노드에서 실행되는 경우, kublet에 대한 API 호출을 수행하려면 API 서버에 최소한의 필수 인바운드 및 아웃바운드 규칙이 있어야 합니다. 컨트롤 플레인 및 노드 보안 그룹에 최소한의 필수 인바운드 및 아웃바운드 규칙이 있는지 확인하려면 Amazon EKS 보안 그룹 요구 사항 및 고려 사항을 참조하세요.

aws-auth ConfigMap에 노드와 연결된 Kubernetes 사용자 이름을 사용하는 올바른 IAM 역할이 있음

aws-auth ConfigMap에 올바른 IAM 역할을 적용해야 합니다. IAM 역할에 노드와 연결된 Kubernetes 사용자 이름이 있는지 확인하세요. 클러스터에 aws-auth ConfigMap을 적용하려면 Amazon EKS 클러스터에 IAM 사용자 또는 역할 추가를 참조하세요.

새 인증서를 제출하기 위한 요구 사항이 충족됨

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 구성 파일(**/etc/kubernetes/kubelet/kubelet-config.json)**을 확인한 다음, RotateKubeletServerCertificateserverTLSBootstrap 플래그가 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-bootstrappersystem:bootstrapperssystem: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

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음