실습 (AWS Worshop Studio)

EKS 클러스터 생성

  1. AWS Workshop Studio 콘솔에서 AWS 자격증명을 환경변수로 지정하는 명령어를 복사해서 실행

  2. ClusterConfig 생성

    cat <<EOF > mycluster.yaml
    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    
    metadata:
      name: mycluster
      region: $AWS_REGION
      version: "1.32"
    
    availabilityZones:
    - ${AWS_REGION}a
    - ${AWS_REGION}b
    - ${AWS_REGION}c
    - ${AWS_REGION}d
    
    managedNodeGroups:
    - name: nodegroup
      instanceType: t3.small
      minSize: 2
      desiredCapacity: 2
      maxSize: 5
      volumeSize: 20
      iam:
        attachPolicyARNs:
        - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
        - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
    addonsConfig:
      disableDefaultAddons: true
    addons:
      - name: vpc-cni
      - name: kube-proxy
      - name: coredns
    EOF
  3. EKS 클러스터 생성

    eksctl create cluster --config-file=mycluster.yaml
  4. 클러스터 생성 확인

    {
        rm -rf ~/.kube/config
        aws eks update-kubeconfig --name mycluster
        kubectl get node
    }

Authentication

  1. kubeconfig 파일 리뷰

  2. user에 명시된 명령어 실행

  3. 토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐

  4. Base64URL 유틸리티 설치

  5. 토큰값을 디코딩해서 환경변수로 지정

  6. 디코딩한 URL 호출

  7. HTTP 헤더에 클러스터 이름 추가해서 디코딩한 URL 호출

  8. 현재 설정된 AWS 자격증명을 확인

  9. API 서버 주소를 확인하고 환경변수로 지정

  10. Node 목록을 보는 API 호출

  11. 토큰값을 환경변수로 지정

  12. Node 목록을 보는 API 호출

  13. IAM 유저를 생성하고 Access Key 발급

  14. 위에서 생성한 Access Key를 AWS CLI 자격증명 파일에 반영

  15. 위에서 명시한 프로필을 통해서 AWS API 호출

  16. kubeconfig 파일 삭제

  17. 쿠버네티스 API 호출 시도

  18. 새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성

  19. IAM 유저에서 eks:DescribeCluster 권한 부여

  20. 새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성 - 정책 적용까지 시간이 걸릴수 있음

  21. 새로 생성된 kubeconfig 파일 리뷰

  22. 환경변수로 주입한 AWS 자격증명 해제

  23. 쿠버네티스 API 호출 시도

  24. 인증 토큰 검증

  25. AWS Workshop Studio 콘솔에서 AWS 자격증명을 환경변수로 지정하는 명령어를 복사해서 실행

  26. EKS 클러스터를 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

Authorization

  1. EKS 클러스터에 설정된 Access Entry 확인

  2. EKS 클러스터를 생성한 IAM 유저의 Access Entry 확인

  3. EKS 클러스터를 생성한 IAM 유저에 부여된 Access Policy 확인

  4. 현재 kubeconfig에 설정된 유저의 자격증명으로 수행할수 있는 API 목록 확인

  5. EKS 클러스터에 설정된 Access Entry 확인

  6. Node에 부여된 IAM 역할을 확인하고 환경변수로 지정

  7. Node에 부여된 IAM 역할의 Access Entry 확인

  8. Node에 부여된 IAM 역할에 부여된 Access Policy 확인

  9. Kubernetes RBAC을 쉽게 확인할수 있는 플러그인 설치

  10. Node에 부여된 IAM 역할에 연동된 쿠버네티스 그룹에 부여된 권한 확인

  11. eks:node-bootstrapper ClusterRole 리뷰

  12. 위에서 새로 생성한 IAM 유저에 EKS Access Entry 생성

  13. IAM 유저에서 kube-system 네임스페이스에 대한 읽기 권한을 부여

  14. IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

  15. 클러스터에 생성된 모든 Pod 목록 확인

  16. kube-system 네임스페이스에 생성된 모든 Pod 목록 확인

  17. kube-system 네임스페이스에 Pod 생성 시도

  18. AWS Workshop Studio 콘솔에서 AWS 자격증명을 환경변수로 지정하는 명령어를 복사해서 실행

  19. IAM 역할 생성

  20. 위에서 새로 생성한 IAM 역할에 EKS Access Entry 생성

  21. IAM 역할에 EKS 클러스터 어드민 권한 부여

  22. IAM 유저에서 sts:AssumeRole 권한 부여

  23. IAM 유저의 자격증명으로 위에서 생성한 IAM 역할 전환하는 설정 추가해서 kubeconfig 파일 업데이트

  24. 새로 생성된 kubeconfig 파일 리뷰

  25. 쿠버네티스 API 호출 시도 - 정책 적용까지 시간이 걸릴수 있음

  26. EKS 인증 토큰 확인

  27. AWS Workshop Studio 콘솔에서 AWS 자격증명을 환경변수로 지정하는 명령어를 복사해서 실행

  28. AWS 관리콘솔에 로그인된 IAM 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트

  29. 리소스 삭제

Scheduling

Manual Scheduling

  1. Pod 생성

  2. Pod 상태 확인

  3. 위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.

  4. Pod 상태를 모니터링

  5. 노드 목록 확인

  6. spec.nodeName에 위의 명령어의 결과로 나온 첫번째 노드 이름을 넣고 Pod를 생성

  7. Pod 상태 확인

  8. spec.nodeName을 명시하지 않고 Pod 생성

  9. spec.nodeName을 명시하지 않고 생성한 Pod에 발생한 Event 확인

  10. spec.nodeName을 명시하고 생성한 Pod에 발생한 Event 확인

  11. Pod 삭제

Node Selector

  1. Pod 생성

  2. Pod 상태 확인

  3. 위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.

  4. 아래의 명령어를 사용해서 Pod가 배포되지 않는 이유를 찾으세요.

  5. Node에 부여된 Label 확인

  6. 두번째 노드에 키(Key)는 env 이고 값(Value)은 dev 인 Label 부여

  7. Pending 상태였던 Pod가 배포됐는지 확인

  8. Pod에 발생한 Event 확인

  9. Node에 부여한 Label 삭제

  10. Node에 Label이 삭제되었는지 확인

  11. Pod 상태 확인

  12. Pod 삭제

Spread Pod Across Cluster

  1. Node에 부여된 Label을 통해서 Node가 생성된 가용영역 확인

  2. nodeSelector를 명시한 Pod 생성

  3. 각 Pod가 배포된 Node 확인

  4. 각 Node별로 배포된 Pod 갯수 확인

  5. nodeSelector를 명시하지 않은 Pod 생성

  6. 각 Pod가 배포된 Node 확인

  7. 각 Node별로 배포된 Pod 갯수 확인

  8. 위에서 nodeSelector를 명시하지 않고 생성한 Pod 삭제

  9. 각 Node별로 배포된 Pod 갯수 확인

  10. Deployment 생성

  11. Deployment를 통해서 생성된 Pod들이 배포된 Node 확인

  12. EKS 설정창에서 Scheduler의 로깅을 활성화하면 CloudWatch를 통해서 아래와 같은 구성으로 kube-scheduler가 구동되는 것을 확인 가능

  13. Deployment 삭제

  14. 각 Node별로 배포된 Pod 갯수 확인

  15. podAntiAffinity를 명시하고 Pod 생성

  16. 위에서 생성한 Pod들이 배포된 Node 확인

  17. 위에서 생성한 Pod 삭제

  18. topologySpreadConstraints를 명시하고 Pod 생성

  19. 위에서 생성한 Pod들이 배포된 Node 확인

  20. 리소스 삭제

Scaling

HPA (Horizontal Pod Autoscaler)

  1. Pod의 리소스 사용량 확인

  2. Metrics Server 설치 확인

  3. API 서버에 등록된 API 목록 확인

  4. v1beta1.metrics.k8s.io API의 상세 내용 확인

  5. 모든 Pod의 리소스 사용량 확인

  6. 모든 Node의 리소스 사용량 확인

  7. Metrics Server 로그 확인

  8. Metrics Server 로그 레벨 변경

  9. Metrics Server 로그 확인 - 새로운 Pod가 뜬 다음에 확인

  10. kubelet에서 제공하는 지표에 대한 접근 권한을 가진 Pod 생성

  11. 위에서 생성한 Pod에서 Metrics Server가 지표를 수집할때 호출하는 Endpoint 호출 - https://github.com/kubernetes-sigs/metrics-server/blob/4436807eec6b07ea649444529eb3b46ddbbd8914/pkg/scraper/client/resource/client.go#L77arrow-up-right

  12. kubelet에서 제공하는 모든 지표 확인

  13. kubelet에서 제공하는 지표중에서 CPU 및 Memory에 대한 지표만 확인

  14. API 서버를 통해서 Metrics Server가 지표를 수집할때 호출하는 Endpoint 호출

  15. Autoscaling (HPA)설정

  16. 위에서 생성한 HPA 상태 확인

  17. 데모 애플리케이션에 부하를 발생시키는 Pod 생성

  18. HPA 상태 모니터링

  19. Ctrl+C를 입력해서 HPA 모니터링을 중지하고 실제로 Pod가 생겼는지 확인

  20. Pod의 리소스 사용량 확인

  21. 데모 애플리케이션에 부하를 발생시키는 Pod 삭제

  22. HPA 상태 모니터링

  23. Ctrl+C를 입력해서 HPA 모니터링을 중지하고 HPA 상세 내용 확인

  24. Pod의 리소스 사용량 확인

  25. stabilizationWindowSeconds의 기본값 확인

  26. stabilizationWindowSeconds의 값을 60으로 조정

  27. HPA 상태 확인

  28. Pod 갯수 확인

  29. 데모 애플리케이션 및 리소스 삭제

Cluster Autoscaler

  1. Deployment 생성

  2. 생성된 Deployment 및 Pod 확인

  3. Pending 상태의 Pod가 있다면 아래의 명령어를 통해서 그 이유를 확인

  4. Cluster Autoscaler에게 부여할 IAM 정책 생성

  5. IAM OIDC 제공자 활성화

  6. ServiceAccount 생성

  7. ServiceAccount가 생성되었는지 확인 - Annotations 확인

  8. ServiceAccount와 연동된 IAM 역할에 부여된 IAM 정책 확인

  9. ServiceAccount와 연동된 IAM 역할에 부여된 신뢰관계 정책 확인

  10. Cluster Autoscaler 설치

  11. Cluster Autoscaler 로그 확인 - ASG map 확인

  12. Cluster Autoscaler 설정값 확인

  13. EKS 노드그룹와 연동된 오토스케일링 그룹의 인스턴스 현황 확인

  14. 오토스케일링 그룹에 부여된 태그 확인

  15. Node 갯수 확인

  16. Cluster Autoscaler 설정값 수정

  17. Cluster Autoscaler 로그 확인 - 오토스케일링그룹이 정상 등록되었는지 확인

  18. Pending 상태였던 Pod가 생성 되었는지 확인

  19. Node 갯수 확인

  20. 오토스케일링 그룹의 인스턴스 현황 확인

  21. 오토스케일링 그룹의 활동 로그 확인

  22. Deployment 삭제

  23. Pod 목록 확인

  24. Node가 삭제 되는지 확인

  25. Cluster Autoscaler 로그 확인

Exposing

Service

  1. Deployment 생성

  2. Service 생성

  3. 생성된 Service 확인

  4. 생성된 Endpoint 확인

  5. 생성된 Pod의 IP주소 확인

  6. Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인

  7. 생성된 Deployment의 Replica 갯수를 6개로 조정

  8. 생성된 Pod의 IP주소 확인

  9. Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인

  10. Pod를 생성하고 Pod에서 위에서 생성한 Service 호출

  11. 새로운 터미널을 열고 AWS Workshop Studio 콘솔에서 AWS 자격증명을 환경변수로 지정하는 명령어를 복사해서 실행

  12. kube-proxy 로그 확인 - 아래의 명령어를 입력하고 엔터키를 몇번 입력해서 간격을 만들어두면 새로운 로그를 좀 더 쉽게 알아볼수 있음

  13. 기존 터미널로 돌아와서 생성된 Deployment의 Replica 갯수를 3개로 조정

  14. 다른 터미널로 이동해서 kube-proxy 로그를 확인하고 Ctrl+C를 입력해서 프로세스 종료

  15. 한개의 Node로 Session Manager 연결

  16. Iptable의 모든 규칙 확인

  17. Iptable의 NAT 규칙 확인

  18. KUBE-SERVICES 규칙 확인

  19. 위에서 생성한 Service의 Cluster IP로 연결된 규칙의 상세내용 확인

  20. 위의 명령어로 나온 결과중의 한개의 Chain 규칙 확인

  21. 첫번째 터미널로 이동해서 생성된 Pod의 IP주소 확인

  22. Deployment의 Replica 갯수를 6개로 조정

  23. 두번째 터미널로 이동해서 19번 명령어 재실행

  24. 첫번째 터미널로 이동해서 Service를 ClusterIP에서 LoadBalancer로 변경

  25. Service가 변경되었는지 확인

  26. Service 객체에 발생한 Event 확인

  27. 웹 브라우저를 열고 Service의 External IP 주소로 접속 - 아래의 명령어로 주소 확인 가능

  28. Service 상세 내용 확인 - 포트 정보 확인

  29. Service를 통해서 생성된 ELB 상세 내용 확인

  30. ELB의 Listener 설정 확인

  31. ELB의 보안그룹 확인

  32. 노드에 부여된 보안그룹에 ELB 보안그룹에 대한 새로운 인바운드 규칙이 추가 됐는지 확인

  33. 두번째 터미널로 이동해서 Iptable 규칙 확인

  34. KUBE-SERVICES 규칙 확인

  35. KUBE-NODEPORTS 규칙 확인

  36. NodePort 호출

  37. 첫번째 터미널로 이동해서 Service를 LoadBalancer에서 ClusterIP로 변경

  38. ELB가 삭제되었는지 확인

  39. 데모 애플리케이션 삭제

Ingress

  1. AWS Load Balancer Controller에 부여할 IAM 정책 생성

  2. ServiceAccount 생성

  3. EKS 리포지토리 추가

  4. 위에서 추가한 리포지토리가 추가되었는지 확인

  5. 위에서 추가한 리포지토리에 있는 Helm 차트 목록 확인

  6. AWS Load Balancer Controller 설치

  7. AWS Load Balancer Controller 로그 확인

  8. 데모 웹사이트 배포

  9. 생성된 리소스 확인

  10. Ingress 생성

  11. 생성된 Ingress 확인

  12. 위에서 생성한 Ingress에 발생한 Event 확인

  13. AWS Load Balancer Controller 로그 확인

  14. Ingress 수정

  15. Ingress 상태 확인

  16. Ingress에 발생한 Event 확인

  17. AWS Load Balancer Controller 로그 확인

  18. 아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인

  19. 생성된 ALB의 상세 내용 확인 - Scheme 확인

  20. ALB가 생성된 서브넷 확인

  21. ALB가 생성된 서브넷에 부여된 태그 확인

  22. AWS Load Balancer Controller가 ALB를 생성한 서브넷을 선택하는 방법 확인 - https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.13/deploy/subnet_discovery/arrow-up-right

  23. AWS Load Balancer Controller로 Ingress 생성할때 요구되는 파라미터 및 기본값 확인 - https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.13/guide/ingress/annotations/arrow-up-right

  24. Ingress 수정

  25. Ingress에 발생한 Event 확인

  26. Ingress 상태 모니터링

  27. AWS Load Balancer Controller 로그 확인

  28. 아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인

  29. 기존에 생성된 ALB가 존재하는지 확인

  30. 새롭게 생성된 ALB의 ARN를 확인하고 환경변수로 저장

  31. 아파치 웹서버 배포

  32. Ingress 수정

  33. 아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인

  34. cURL 명령어로 Host 값을 nginx.example.com으로 명시하고 ALB 엔드포인트 호출

  35. cURL 명령어로 Host 값을 httpd.example.com으로 명시하고 ALB 엔드포인트 호출

  36. ALB 리스너 확인

  37. ALB 리스너 규칙 확인

  38. ALB에 연동된 대상그룹 확인

  39. 대상그룹에 포함된 대상 목록 확인

  40. Pod 목록 확인

  41. 아파치 Pod 갯수를 3개로 조정

  42. Pod 목록 확인

  43. 대상그룹에 포함된 대상 목록 확인

  44. Ingress 객체에 명시된 Finalizer 확인

  45. Ingress 삭제

  46. AWS Load Balancer Controller 로그 확인

  47. ALB가 삭제되었는지 확인

  48. 리소스 삭제

Last updated