1일차 : 팀 구성 및 프로젝트 구상
2일차 : kops 구축
3일차 : Autoscaling 설정
3일차 issue
CA(Cluster Autoscaling) apply 시 파드 CrashLoopBackOff
State: Waiting
Reason: RunContainerError
Last State: Terminated
Reason: StartError
Message: failed to create containerd task: failed to create shim task: OCI runtime create failed:
runc create failed: unable to start container process: error during container init:
error mounting "/etc/ssl/certs/ca-bundle.crt" to rootfs at "/etc/ssl/certs/ca-certificates.crt":
mount /etc/ssl/certs/ca-bundle.crt:/etc/ssl/certs/ca-certificates.crt (via /proc/self/fd/6),
flags: 0x5001: not a directory: unknown
Exit Code: 128
Started: Thu, 01 Jan 1970 09:00:00 +0900
Finished: Wed, 02 Oct 2024 20:11:21 +0900
Ready: False
SSL 인증서 파일 마운트 실패
Ubuntu 시스템에서는 일반적으로 CA 인증서 번들 파일이 ca-certificates.crt라는 이름으로 존재하는데
volumes의 hostPath에서 주로 RedHat 계열 시스템에서 사용되는 이름인 /etc/ssl/certs/ca-bundle.crt로 마운트 하려고 하기 때문
[root@ip-172-31-46-129: ~]$ ls -l /etc/ssl/certs/ca-bundle.crt
ls: cannot access '/etc/ssl/certs/ca-bundle.crt': No such file or directory
path를 변경하여 해결
E1002 11:26:23.155284 1 aws_manager.go:125] Failed to regenerate ASG cache: MissingRegion: could not find region configuration
F1002 11:26:23.155303 1 aws_cloud_provider.go:419] Failed to create AWS Manager: MissingRegion: could not find region configuration
CA yaml 설정파일에서 Region이 명시되지 않았기 때문에 발생
region을 추가했음에도 오류
--region 플래그는 CA 최신 버전에서 지원하지 않기 때문
--region 플래그 대신 환경 변수로 AWS 리전 설정
수정했음에도 CrashLoopBackOff
E1002 11:51:14.900517 1 aws_manager.go:125] Failed to regenerate ASG cache: NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
F1002 11:51:14.900553 1 aws_cloud_provider.go:419] Failed to create AWS Manager: NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
cluster-autoscaler가 AWS API에 액세스할 수 없어서 발생하는 문제
EC2 인스턴스의 IAM 권한 확인 : O
노드 그룹의 IAM 역할에 Autoscaling 권한 여부 : O
- autoscaling:DescribeAutoScalingGroups
- autoscaling:DescribeAutoScalingInstances
- autoscaling:DescribeLaunchConfigurations
- autoscaling:DescribeTags
- autoscaling:SetDesiredCapacity
- autoscaling:TerminateInstanceInAutoScalingGroup
- ec2:DescribeLaunchTemplateVersions
AutoScaling 그룹에 태그 추가 여부 : O
- Key: k8s.io/cluster-autoscaler/<your-cluster-name>
- Value: owned
- Key: k8s.io/cluster-autoscaler/enabled
- Value: true
적절한 역할과 태그가 주어졌지만 여전히 CrashLoopBack 발생,
kops로 k8s를 설치한 경우, 워커 노드에 IAM 권한을 직접 추가해주는 것과 더불어 CA 파드가 AWS API에 액세스할 수 있는 방식으로 IAM 역할을 설정해야 한다고 함
EKS와 다르게 kops는 자동으로 IRSA(EKS에서 자주 사용하는 방식)를 지원하지 않기 때문에 수동으로 명시적으로 추가 설정 필요
CA설정 yaml 파일에 annotation 추가
template:
metadata:
annotations:
iam.amazonaws.com/role: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME
labels:
app: cluster-autoscaler
하지만 여전히 CrashLoopBack 오류 발생
-----해결중-----
해결 예정 내용
EKS에서는 IAM 역할을 파드와 직접 연결하는 IRSA(IAM Roles for Service Accounts) 방식이 지원, 이를 통해 AWS 리소스에 접근할 때 자동으로 권한이 부여되며, AWS CLI 설정이 없어도 IAM 역할을 통해 자동으로 인증이 이루어짐
하지만 kops에서는 AWS CLI가 제대로 설정되어 있지 않으면 AWS API에 대한 인증이 제대로 이루어지지 않을 수 있음
이로 인해 Cluster Autoscaler(CA)가 AWS 리소스에 접근할 수 없게 되며, 이로 인해 NoCredentialProviders 오류가 발생할 수 있음
즉, CA 설정 YAML 파일에서 arn을 설정해주더라도, AWS CLI나 인증 설정이 올바르게 구성되지 않으면 AWS API에 접근할 수 없기 때문에 CA가 제대로 작동하지 않게 됨
aws sts get-caller-identity 명령어를 통해 현재 AWS CLI가 제대로 설정되었는지 확인
ca yaml에서 nodeSelector로 워커 노드에 배치되어있는지 tolerations로 마스터 노드에 배치되어있는지 확인
EKS
IRSA(IAM Roles for Service Accounts) 기능을 사용하여, Kubernetes 서비스 계정에 IAM 역할을 매핑하면 해당 서비스 계정을 사용하는 모든 파드가 자동으로 AWS 리소스에 필요한 권한을 가질 수 있습니다.
aws configure로 AWS CLI 설정을 등록하는 것은 일반적으로 CLI나 AWS SDK에서 자격 증명을 사용하는 데 필요할 뿐, 파드에서 AWS 서비스에 접근하기 위해서는 IRSA 설정이 필요합니다. 하지만 EKS는 기본적으로 IRSA를 통해 파드가 쉽게 AWS 리소스에 접근할 수 있습니다.
Kops
Kops에는 IRSA와 같은 기능이 기본적으로 제공되지 않기 때문에, 파드가 AWS 서비스에 접근하려면 kube2iam 또는 KIAM 같은 도구가 필요합니다.
각 파드가 AWS 서비스에 접근하려면 IAM 역할을 개별적으로 설정해야 합니다. 이를 위해 kube2iam이나 KIAM을 설치하여, 각 파드에 적절한 IAM 역할을 매핑해주어야 합니다.
aws configure는 EC2 인스턴스 내에서만 작동하며, 파드에 IAM 역할을 부여하는 방식과는 다릅니다. 따라서 Kops에서는 aws configure로만 해결되지 않으며, kube2iam 또는 KIAM을 통해 파드에 IAM 역할을 매핑해줘야 합니다.
정리:
EKS: IRSA로 쉽게 파드별 IAM 역할을 매핑.
Kops: kube2iam 또는 KIAM을 설치해 파드에 하나하나 IAM 역할을 매핑해줘야 함. aws configure만으로는 해결되지 않음.
따라서, Kops에서는 kube2iam이나 KIAM이 반드시 필요합니다.
EKS에서는 aws configure로 자격 증명을 설정하고, IRSA를 사용하면 파드에 따로 설정을 하지 않아도 AWS 서비스에 접근할 수 있습니다.
Kops에서는 aws configure로 정보를 등록하더라도, 파드가 AWS 서비스에 접근하려면 별도의 인증이 필요합니다. 이 인증을 위해 kube2iam이나 KIAM 같은 도구가 필수적입니다.
kubectl logs pod/<cluster-autoscaler pod name> -n kube-system
Kops는 주로 유연성과 다양한 클라우드 제공업체를 지원하는 점에서 EKS와 차별화됩니다. 아래는 Kops의 주요 장점입니다: