'Helm'에 해당하는 글 2건

EKS version update

Daily/Prog 2023. 2. 14. 20:39

 

* AWS Email 전문

 

2023년 2월 15일부터 Amazon EKS는 Kubernetes 1.21 버전을 더 이상 지원하지 않습니다. 또한 그 이후, 더 이상 새 1.21버전의 클러스터를 생성할 수 없으며 Kubernetes 1.21 버전을 사용중인 모든 EKS 클러스터는 최신 플랫폼 버전의 Kubernetes 버전 1.22로 업데이트될 예정입니다.
...
1.21 버전의 클러스터를 Kubernetes 1.22 버전 이상으로 업데이트하는 것을 권장드립니다. 클러스터를 바로 가장 최신 Kubernetes 버전인 1.24 버전으로 업데이트하여, 버전 업데이트를 수행해야 하는 빈도를 최소화할 수 있습니다.

 

 

일단 EKS 버전 업데이트가 처음인데다가, 현재 운영중인 클러스터라 다운타임이 발생하면 회사에 치명적, 내 수명에도 치명적... 다른일 처리하다가 미루고 미루다 보니 내일 모레가 듀 데이트... 다행히 개발/운영 클러스터를 각각 사용하고 있어서 개발 클러스터로 다운타임이 발생하지 않는지 확인할 수 있었다. 결론부터 말하면 fargate 사용시 다운타임은 발생하지 않았다.

 

이왕 손댔을 때, 메일에 쓰인대로 1.21 버전에서 1.24 버전으로 올리면 좋겠지만 한번에 하나의 마이너버전 업데이트만 가능하다. 일단 업데이트 전 버전별 업데이트 주의사항들을 확인해 봤다.

 

https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html

 

Updating an Amazon EKS cluster Kubernetes version - Amazon EKS

Even though Amazon EKS runs a highly available control plane, you might experience minor service interruptions during an update. For example, assume that you attempt to connect to an API server around when it's terminated and replaced by a new API server t

docs.aws.amazon.com

 

요약하자면,

  • kubectl client/server 버전 동기화
  • 사라지는 v1beta API 들 체크하여, 기존 YAML 파일 변경
  • AWS Load Balancer Controller 2.4.1 이상으로 업데이트

 

이 정도인 것 같다. kubectl 은 로컬에 lens, docker 등에서도 설치가 되어 최신버전이 표시되게 설정이 필요하다. kubectl 버전은 EKS 클러스터 API 버전을 기준으로 마이너버전 +-1 만 사용이 가능하다. 예를 들어 1.23 kubectl Client 는 Kubernetes 1.22, 1.23, 1.24 클러스터에서 사용이 가능하다... 고는 하는데, kubectl client 1.24 과 server 1.21 을 사용할 때 큰 이슈는 없었다... 아무튼 최신버전(1.25+)에서는 제약이 있는 듯. yaml 파일 수정은 rbac.authorization.k8s.io/v1beta1 하나 했고, ALB Controller 는 업데이트 하지 않았더니 무한 restart...ㅎ

 

 

EKS v1.22 업데이트 순서

 

(현재 프로젝트용 fargate 와 모니터링용 node-group 을 사용중이다.)

 

1. 클러스터 버전 업데이트

 

$ eksctl upgrade cluster \
--name my-cluster \
--version 1.24 \
--approve

 

2. 노드 그룹 버전 업데이트 (옵션)

 

$ eksctl upgrade nodegroup \
--name=node-group-name \
--cluster=my-cluster \
--region=region-code \
--kubernetes-version=1.24

 

노드 그룹의 경우 볼륨 수대로 파드가 생성되서 에러인줄 알고 깜놀했는데, 10여분정도 뒤에 업데이트가 끝나면 알아서 다 정리된다. 프로메테우스는 재설치 했다..;

 

3. Custom Resources 업데이트

 

$ helm repo update
$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws configured
customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws configured

 

4. AWS Load Balancer Controller 2.4.1 이상으로 업데이트

 

$ helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=my-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=my-region \
--set vpcId=vpc-1234567890 \
--set image.repository=my-region-id.dkr.ecr.my-region.amazonaws.com/amazon/aws-load-balancer-controller

 

5. EKS 대시보드의 [추가기능] 업데이트

  • Amazon VPC CNI
  • CoreDNS
  • kube-proxy

업데이트시, 충돌 옵션을 선택하지 않으면 아래와 같은 에러가 발생한다. 옵션에서 [재정의] 를 선택하면 된다.

 

Conflicts found when trying to apply. Will not continue due to resolve conflicts mode. Conflicts: ConfigMap kube-proxy-config - .data.config DaemonSet.apps kube-proxy - .spec.template.spec.containers[name="kube-proxy"].image DaemonSet.apps kube-proxy - .spec.template.spec.containers[name="kube-proxy"].image

 

 

6. 프로젝트 deployment 각각 restart (업데이트 버전의 노드 확인)

 

$ kubectl rollout restart -n my-namespace deployment/my-project
...

 

 

EKS v1.23 업데이트

v1.23 에서는 노드그룹(EC2) 를 사용한다면, EBS CSI driver 설치를 해주어야 한다. EKS 대시보드의 [추가기능] 에서 생성. 생성시 필요한 IAM 역할 생성은 아래 사이트 참고.

 

https://docs.aws.amazon.com/eks/latest/userguide/csi-iam-role.html

 

Creating the Amazon EBS CSI driver IAM role for service accounts - Amazon EKS

Creating the Amazon EBS CSI driver IAM role for service accounts The Amazon EBS CSI plugin requires IAM permissions to make calls to AWS APIs on your behalf. For more information, see Set up driver permission on GitHub. When the plugin is deployed, it crea

docs.aws.amazon.com

 

EBS CSI driver 가 정상적인 권한으로 설치되지 않으면 Volumes mount 가 실패하고 에러가 발생한다.

failed to provision volume with StorageClass "gp2": rpc error: code = Internal desc = Could not create volume "pvc-c1234a61-1234-4321-1234-12347d4f1234": could not create volume in EC2: NoCredentialProviders: no valid providers in chain caused by: EnvAccessKeyNotFound: failed to find credentials in the environment. SharedCredsLoad: failed to load profile, . EC2RoleRequestError: no EC2 instance role found caused by: RequestError: send request failed caused by: Get "http://111.111.111.111/latest/meta-data/iam/security-credentials/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

 

 

EKS v1.24 업데이트

 

v1.24 에서는 따로 설정을 변경한 것은 없었지만, PSP(PodSecurityPolicy) 가 v1.25에서는 제거될 예정이라 PSS(PodSecurityStandards) 로 대체할 수 있다. PSS 설치 내용이 너무 길어서; v1.25 언제 쓸지도 모르는데 일단 그때까지 보류하는걸로

https://aws.amazon.com/ko/blogs/containers/implementing-pod-security-standards-in-amazon-eks/

 

Implementing Pod Security Standards in Amazon EKS | Amazon Web Services

Introduction Securely adopting Kubernetes includes preventing unwanted changes to clusters. Unwanted changes can disrupt cluster operations and even compromise cluster integrity. Introducing pods that lack correct security configurations is an example of a

aws.amazon.com

 

 

 

그저 단순 업데이트처럼 보이지만 참으로 살떨리는 작업이었다...ㅋ

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

AWS 로드 밸런서 컨트롤러는 k8s ingress 를 생성할 때 ALB(Application Load Balancer) / NLB(Network Load Balancer) 를 생성해 주고 관리한다. ALB / NLB 가 필요하다면 배포해야 하는데 EKS 와 k8s 간에 로드 밸런서 관리 권한을 연결해야 한다. eksctl + cloudFormation 으로 자동 생성할 수도 있지만, aws 관리콘솔 + awscli + kubectl 을 사용하여 수동 설정했다.

 

 

IAM / ServiceAccount 설정

 

AWS 로드 밸런서 컨트롤러의 IAM 정책(사용자 대신 AWS API를 호출) 다운로드

- 버전 확인 : https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html

 

Installing the AWS Load Balancer Controller add-on - Amazon EKS

If you view the policy in the AWS Management Console, the console shows warnings for the ELB service, but not for the ELB v2 service. This happens because some of the actions in the policy exist for ELB v2, but not for ELB. You can ignore the warnings for

docs.aws.amazon.com

 

$ curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy.json

 

다운로드한 정책을 사용하여 IAM 정책 생성

 

$ aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json

 

IAM 자격증명 공급자 생성(AWS 관리콘솔)

 

  • 클러스터에서 OpenID Connect 공급자 URL 복사하여 지문/인증서 확인
  • 대상: sts.amazonaws.com

 

IAM 역할 생성(AWS 관리콘솔)

 

  • Web Identity > 생성한 자격증명 공급자 연결 > 정책 선택(AWSLoadBalancerControllerIAMPolicy) > 역할 이름 입력(AmazonEKSLoadBalancerControllerRole) 후 생성
  • 생성한 역할에서 [신뢰 관계] 편집

oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED123D4633E53DE1B716D3041E:aud /

sts.amazonaws.com.

   
oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED123D4633E53DE1B716D3041E:sub /

system:serviceaccount:kube-system:aws-load-balancer-controller

 

k8s ServiceAccount 추가

 

$ vi aws-load-balancer-controller-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
      eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole

$ kubectl apply -f aws-load-balancer-controller-service-account.yaml
serviceaccount/aws-load-balancer-controller created

 

여기까지의 작업으로 쿠버네티스의 ServiceAccount 는 AWS 의 AmazonEKSLoadBalancerControllerRole 역할을 얻게 되었고, ingress 와 loadbalancer 에 대하여 AWS 에 ALB 와 NLB 를 각각 생성/관리할 수 있게 되었다.

 

 

Load Balancer Controller 설치

 

Fargate 에 컨트롤러를 배포할 때는 cert-manager 에 의존하지 않기 때문에 Helm 차트를 사용하여 설치한다. Helm 은 Kubernetes 클러스터에서 사용하는 패키지 관리자로 yum, apt 와 흡사하며, 흔히 나오는 차트라는 단어는 helm 패키지라고 이해하면 된다.

 

Helm 설치 - https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/helm.html

 

Amazon EKS에 Helm 사용 - Amazon EKS

Amazon EKS에 Helm 사용 Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다. 자세한 내용은 Helm 설명서를 참조하십시오. 이 주제에서는 Helm

docs.aws.amazon.com

 

eks 저장소 초기화 뒤 설치

 

$ helm repo add eks https://aws.github.io/eks-charts
"eks" has been added to your repositories

 

eks 저장소 차트 확인

 

$ helm repo update
$ helm search repo eks
...
eks/aws-load-balancer-controller
...

 

컨트롤러 설치

 

$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=cluster-name \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=region-code \
--set vpcId=vpc-xxxxxxxx \
--set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

LAST DEPLOYED: Thu Dec  9 13:27:38 2021
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

 

이미지 저장소 속성에서, 서울의 region-code 는 ap-northeast-2, account 는 602401143452 이다. 

image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller

 

위 명령에서 install 후에 차트 업그레이드(upgrade)시 필요한 TargetGroupBinding 사용자 리소스를 설치한다. 

 

$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"

 

 

Fargate 프로파일 생성 : kube-system 에 선택기 매칭이 필요한 경우 추가.

  • app.kubernetes.io/instance = aws-load-balancer-controller
  • app.kubernetes.io/name = aws-load-balancer-controller

 

$ kubectl rollout restart -n kube-system deployment aws-load-balancer-controller

 

 

컨트롤러 설치 확인

 

$ kubectl get deployment -n kube-system aws-load-balancer-controller
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           84s

 

load-balancer-controller

 


 

삽질1. 리전별 ECR 주소 혼동

 

--set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

 

컨트롤러 설치시 account 를 accountId 로 착각해 주소가 다르다는 오류를 발생시켰었다. AWS Load Balancer Controller, Amazon VPC CNI, kube-proxy, CoreDNS 등의 ECR 저장소를 이용할 때 주소가 리전마다 다르므로 주의한다.

 

리전별 ECR 주소 참고 : https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html

 

Amazon EKS add-on container image addresses - Amazon EKS

Amazon EKS add-on container image addresses When you deploy Amazon EKS add-ons such as the AWS Load Balancer Controller, the Amazon VPC CNI, kube-proxy, CoreDNS, or storage drivers, you pull an image from an Amazon ECR repository. The image name and tag ar

docs.aws.amazon.com

 

 

삽질2. aws-load-balancer-controller 설치 에러

 

$ helm install aws-load-balancer-controller...
Error: INSTALLATION FAILED: rendered manifests contain a resource that already exists. Unable to continue with install: ClusterRole "aws-load-balancer-contro
ller-role" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kuber
netes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "aws-load-balancer-controll
er"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "kube-system"

 

Kubernetes manifest 를 적용하여 설치했다가 이미 필요한 설정값들이 달라 발생한 오류. 재설치 하면서 발생하는 기존 리소스들 전부 찾아서 삭제하고 OK 떨어질때까지 반복하면서 해결.

 

$ kubectl delete clusterrole aws-load-balancer-controller-role
$ kubectl delete clusterrolebinding aws-load-balancer-controller-rolebinding
$ kubectl delete service aws-load-balancer-webhook-service -n kube-system
$ kubectl delete MutatingWebhookConfiguration aws-load-balancer-webhook
$ kubectl delete ValidatingWebhookConfiguration aws-load-balancer-webhook

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,