실습
해당 실습을 AWS CloudShell에서 진행한다고 가정하고 작성되었습니다.
실습환경 구성
CLI 도구 설치
바이너리를 저장할 디렉토리 생성
kubectl 설치
eksctl 설치
helm 설치
yq 설치
Krew 설치
EKS 클러스터 생성
ClusterConfig 생성
EKS 클러스터 생성
클러스터 생성 확인
Authentication
kubeconfig 파일 리뷰
kubeconfig에 명시된 users 확인 - https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
user에 명시된 명령어 실행
토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐
Base64URL 유틸리티 설치
토큰값을 디코딩해서 환경변수로 지정
디코딩한 URL 호출
Node에 부여된 Label을 통해서 EKS 클러스터 이름 확인하고 환경변수로 저장
디코딩한 URL 호출 - HTTP 헤더에 클러스터 이름 추가
현재 설정된 AWS 자격증명을 확인
API 서버 주소를 확인하고 환경변수로 지정
Node 목록을 보는 API 호출
토큰값을 환경변수로 지정
Node 목록을 보는 API 호출
IAM 유저 생성
위에서 생성한 IAM 유저의 Access Key 생성
Access Key가 정상적으로 생성되었는지 확인
위에서 생성한 Access Key를 AWS CLI 자격증명 파일에 반영
위에서 명시한 프로필을 통해서 AWS API 호출
kubeconfig 파일 삭제
쿠버네티스 API 호출 시도
새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성
IAM 유저에서 eks:DescribeCluster 권한 부여
IAM 정책이 부여되었는지 확인
새로 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 생성 - 정책 적용까지 시간이 걸릴수 있음
새로 생성된 kubeconfig 파일 리뷰
쿠버네티스 API 호출 시도
인증 토큰 검증
EKS 클러스터를 생성한 IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트
Authorization
EKS 클러스터에 설정된 Access Entry 확인
EKS 클러스터를 생성한 IAM 유저의 Access Entry 확인
AWS Workshop Studio를 통해서 로그인할 경우에는 IAM 역할을 사용하므로 아래의 명령어 실행
EKS 클러스터를 생성한 IAM 유저에 부여된 Access Policy 확인
AWS Workshop Studio를 통해서 로그인할 경우에는 IAM 역할을 사용하므로 아래의 명령어 실행
EKS Access Policy 목록 확인 - https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions
현재 kubeconfig에 설정된 유저의 자격증명으로 수행할수 있는 API 목록 확인
EKS 클러스터에 설정된 Access Entry 확인
한개의 Node의 인스턴스 ID를 확인하고 환경변수로 지정
Node에 부여된 IAM 인스턴스 프로필을 확인하고 환경변수로 지정
위에서 확인한 인스턴스 프로필에 연동된 IAM 역할 확인
Node에 부여된 IAM 역할의 Access Entry 확인
Node에 부여된 IAM 역할에 부여된 Access Policy 확인
Kubernetes RBAC을 쉽게 확인할수 있는 플러그인 설치
Node에 부여된 IAM 역할에 연동된 쿠버네티스 그룹에 부여된 권한 확인
ClusterRole 목록 확인
eks:node-bootstrapper ClusterRole 리뷰
ClusterRoleBinding 목록 확인
eks:node-bootstrapper ClusterRoleBinding 리뷰
EKS 클러스터가 생성되어 있는 AWS 계정번호 확인하고 환경변수로 저장
위에서 새로 생성한 IAM 유저에 EKS Access Entry 생성
IAM 유저에서 kube-system 네임스페이스에 대한 읽기 권한을 부여
IAM 유저의 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트
클러스터에 생성된 모든 Pod 목록 확인
kube-system 네임스페이스에 생성된 모든 Pod 목록 확인
kube-system 네임스페이스에 Pod 생성 시도
IAM 역할 생성
위에서 새로 생성한 IAM 역할에 EKS Access Entry 생성
IAM 역할에 EKS 클러스터 어드민 권한 부여
IAM 유저의 자격증명으로 위에서 생성한 IAM 역할 전환하는 설정 추가해서 kubeconfig 파일 업데이트
새로 생성된 kubeconfig 파일 리뷰
쿠버네티스 API 호출 시도
IAM 유저에서 sts:AssumeRole 권한 부여
IAM 정책이 부여되었는지 확인
쿠버네티스 API 호출 시도 - 정책 적용까지 시간이 걸릴수 있음
user에 명시된 명령어 실행
토큰값을 환경변수로 지정 - Base64로 인코딩된 부분만 캡쳐
토큰값을 디코딩해서 환경변수로 지정
디코딩한 URL 호출
AWS 관리콘솔에 로그인된 IAM 자격증명으로 AWS CLI를 이용해서 kubeconfig 파일 업데이트
리소스 삭제
Scheduling
Manual Scheduling
Pod 생성
Pod 상태 확인
위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.
1분 정도 시간이 지난후에 Pod 상태를 확인
Kubernetes 공식문서 리뷰 - https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename
Pod Garbage Collector 코드 리뷰 - https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/podgc/gc_controller.go#L223
노드 목록 확인
spec.nodeName에 위의 명령어의 결과로 나온 첫번째 노드 이름을 넣고 Pod를 생성
Pod 상태 확인
spec.nodeName을 명시하지 않고 Pod 생성
spec.nodeName을 명시하지 않고 생성한 Pod에 발생한 Event 확인
spec.nodeName을 명시하고 생성한 Pod에 발생한 Event 확인
Pod 삭제
kube-scheduler 코드 리뷰 - https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/schedule_one.go#L64
Node Selector
Pod 생성
Pod 상태 확인
위의 명령어를 실행하면 아래와 같은 결과를 확인할수 있습니다.
아래의 명령어를 사용해서 Pod가 배포되지 않는 이유를 찾으세요.
Node에 부여된 Label 확인
두번째 노드에 키(Key)는 env 이고 값(Value)은 dev 인 Label 부여
Node에 Label이 부여되었는지 확인
Pending 상태였던 Pod가 배포됐는지 확인
Pod에 발생한 Event 확인
Node에 부여한 Label 삭제
Node에 Label이 삭제되었는지 확인
Pod 상태 확인
Pod 삭제
Spread Pod Across Cluster
Node에 부여된 Label을 통해서 Node가 생성된 가용영역 확인
첫번째 Node의 가용영역 확인
nodeSelector를 명시한 Pod 생성
각 Pod가 배포된 Node 확인
각 Node별로 배포된 Pod 갯수 확인
nodeSelector를 명시하지 않은 Pod 생성
각 Pod가 배포된 Node 확인
각 Node별로 배포된 Pod 갯수 확인
위에서 nodeSelector를 명시하지 않고 생성한 Pod 삭제
각 Pod가 배포된 Node 확인
각 Node별로 배포된 Pod 갯수 확인
Deployment 생성
Deployment를 통해서 생성된 Pod들이 배포된 Node 확인
EKS 설정창에서 Scheduler의 로깅을 활성화하면 CloudWatch를 통해서 아래와 같은 구성으로 kube-scheduler가 구동되는 것을 확인 가능
Deployment 삭제
각 Node별로 배포된 Pod 갯수 확인
podAntiAffinity를 명시하고 Pod 생성
위에서 생성한 Pod들이 배포된 Node 확인
위에서 생성한 Pod 삭제
topologySpreadConstraints를 명시하고 Pod 생성
위에서 생성한 Pod들이 배포된 Node 확인
리소스 삭제
Scaling
Manual Scaling
Deployment 생성
Pod 갯수 확인
Deployment의 replica를 3개로 수정
Pod 갯수 확인
ReplicaSet 확인
Deployment의 replica를 2개로 수정
Deployment의 replica가 1개라면 replica를 3개로 변경
새로운 Deployment 생성
Deployment 중에서 replica가 1개인 Deployment가 있으면 replica를 3개로 변경
Pod 갯수 확인
모든 Deployment의 replica를 5개로 변경
Pod 갯수 확인
모든 Deployment 삭제
HPA (Horizontal Pod Autoscaler)
Pod의 리소스 사용량 확인
Metrics Server 설치 - https://github.com/kubernetes-sigs/metrics-server#kubernetes-metrics-server
API 서버에 등록된 API 목록 확인
v1beta1.metrics.k8s.io API의 상세 내용 확인
모든 Pod의 리소스 사용량 확인
모든 Node의 리소스 사용량 확인
Metrics Server 로그 확인
Metrics Server 로그 레벨 변경
Metrics Server 로그 확인 - 새로운 Pod가 뜬 다음에 확인
kubelet에서 제공하는 지표에 대한 접근 권한을 가진 Pod 생성
위에서 생성한 Pod에서 Metrics Server가 지표를 수집할때 호출하는 Endpoint 호출 - https://github.com/kubernetes-sigs/metrics-server/blob/4436807eec6b07ea649444529eb3b46ddbbd8914/pkg/scraper/client/resource/client.go#L77
kubelet에서 제공하는 모든 지표 확인
kubelet에서 제공하는 지표중에서 CPU 및 Memory에 대한 지표만 확인
API 서버를 통해서 Metrics Server가 지표를 수집할때 호출하는 Endpoint 호출
Autoscaling (HPA)설정
위에서 생성한 HPA 상태 확인
데모 애플리케이션에 부하를 발생시키는 Pod 생성
HPA 상태 모니터링
Ctrl+C를 입력해서 HPA 모니터링을 중지하고 실제로 Pod가 생겼는지 확인
Pod의 리소스 사용량 확인
데모 애플리케이션에 부하를 발생시키는 Pod 삭제
HPA 상태 모니터링
Ctrl+C를 입력해서 HPA 모니터링을 중지하고 HPA 상세 내용 확인
Pod의 리소스 사용량 확인
HPA 상태 확인
Pod 갯수 확인
데모 애플리케이션 및 리소스 삭제
Cluster Autoscaler
Deployment 생성
생성된 Deployment 및 Pod 확인
Pending 상태의 Pod가 있다면 아래의 명령어를 통해서 그 이유를 확인
Cluster Autoscaler에게 부여할 IAM 정책 JSON 파일 생성
IAM 정책 생성
Node에 부여된 Label을 통해서 EKS 클러스터 이름 확인하고 환경변수로 저장
EKS 클러스터가 생성되어 있는 AWS 계정번호 확인하고 환경변수로 저장
IAM OIDC 제공자 활성화
ServiceAccount 생성
ServiceAccount가 생성되었는지 확인
ServiceAccount에 명시된 IAM 역할 이름을 확인하고 환경변수로 지정
ServiceAccount와 연동된 IAM 역할에 부여된 IAM 정책 확인
ServiceAccount와 연동된 IAM 역할에 부여된 신뢰관계 정책 확인
Cluster Autoscaler 설치
Cluster Autoscaler 로그 확인 - ASG map 확인
Cluster Autoscaler 설정값 확인
EKS 노드그룹와 연동된 오토스케일링 그룹 이름을 확인하고 환경변수로 지정
오토스케일링 그룹의 인스턴스 현황 확인
오토스케일링 그룹에 부여된 태그 확인 - https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html
Node 갯수 확인
Cluster Autoscaler 설정값 수정
Cluster Autoscaler 설정값 확인
Cluster Autoscaler 로그 확인 - ASG map 확인
Pending 상태였던 Pod가 생성 되었는지 확인
Node 갯수 확인
오토스케일링 그룹의 인스턴스 현황 확인
오토스케일링 그룹의 활동 로그 확인
Cluster Autoscaler에 의해서 삭제 되지 않는 Node 확인 - https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node
Deployment 삭제
Pod 목록 확인
Node가 삭제 되는지 확인
Cluster Autoscaler 로그 확인
Cluster Autoscaler 스케일 다운 동작방식 리뷰 - https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-scale-down-work
리소스 삭제
Exposing
Service
Deployment 생성
Service 생성
생성된 Service 확인
생성된 Endpoint 확인
생성된 Pod의 IP주소 확인
Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인
생성된 Deployment의 Replica 갯수를 6개로 조정
생성된 Pod의 IP주소 확인
Endpoint에 타겟으로 등록되어 있는 Pod 목록 확인
Pod 생성
위에서 생성한 Pod에서 Service 호출
새로운 터미널을 열고 kube-proxy 로그 확인 - 아래의 명령어를 입력하고 엔터키를 몇번 입력해서 간격을 만들어두면 새로운 로그를 좀 더 쉽게 알아볼수 있음
기존 터미널로 돌아와서 생성된 Deployment의 Replica 갯수를 3개로 조정
다른 터미널로 이동해서 kube-proxy 로그를 확인하고 Ctrl+C를 입력해서 프로세스 종료
Session Manager 플러그인 설치
한개의 Node로 Session Manager 연결
Iptable의 모든 규칙 확인
Iptable의 NAT 규칙 확인
KUBE-SERVICES 규칙 확인
생성된 Service의 Cluster IP로 연결된 규칙 값을 환경변수로 저장
Service의 Cluster IP로 연결된 규칙의 상세내용 확인
위의 명령어로 나온 결과중의 한개의 Chain 규칙 확인
첫번째 터미널로 이동해서 생성된 Pod의 IP주소 확인
생성된 Deployment의 Replica 갯수를 6개로 조정
두번째 터미널로 이동해서 21번 명령어 재실행
첫번째 터미널로 이동해서 Service를 ClusterIP에서 LoadBalancer로 변경
Service가 변경되었는지 확인
Service 객체에 발생한 Event 확인
웹 브라우저를 열고 Service의 External IP 주소로 접속 - 아래의 명령어로 주소 확인 가능
생성된 Service 상세 내용 확인
생성된 ELB 이름 확인
ELB 상세 내용 확인
ELB의 Listener 설정 확인
ELB의 보안그룹 확인
노드에 부여된 보안그룹에 ELB 보안그룹에 대한 새로운 인바운드 규칙이 추가 됐는지 확인
두번째 터미널로 이동해서 Iptable 규칙 확인
KUBE-SERVICES 규칙 확인
KUBE-NODEPORTS 규칙 확인
NodePort 호출
첫번째 터미널로 이동해서 Service를 LoadBalancer에서 ClusterIP로 변경
ELB가 삭제되었는지 확인
데모 애플리케이션 삭제
Ingress
EKS 클러스터가 생성되어 있는 AWS 계정번호 확인하고 환경변수로 저장
Node에 부여된 Label을 통해서 EKS 클러스터 이름 확인하고 환경변수로 저장
IAM OIDC 제공자 생성
AWS Load Balancer Controller에 부여할 IAM 권한이 명시된 JSON 파일 다운로드
다운받은 IAM 정책 JSON 파일 리뷰
IAM 정책 생성
ServiceAccount 생성
EKS 리포지토리 추가
위에서 추가한 리포지토리가 추가되었는지 확인
위에서 추가한 리포지토리에 있는 Helm 차트 목록 확인
AWS Load Balancer Controller 설치
AWS Load Balancer Controller 로그 확인
데모 웹사이트 배포
생성된 리소스 확인
Ingress 생성
생성된 Ingress 확인
위에서 생성한 Ingress에 발생한 Event 확인
AWS Load Balancer Controller 로그 확인
Ingress 수정
Ingress 상태 확인
Ingress에 발생한 Event 확인
AWS Load Balancer Controller 로그 확인
아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인
생성된 ALB 이름을 확인하고 환경변수로 저장
ALB의 상세 내용 확인
ALB의 Scheme 확인
ALB가 생성된 서브넷 확인
ALB가 생성된 서브넷에 부여된 태그 확인
AWS Load Balancer Controller가 ALB를 생성한 서브넷을 선택하는 방법 확인 - https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.8/deploy/subnet_discovery
AWS Load Balancer Controller로 Ingress 생성할때 요구되는 파라미터 및 기본값 확인 - https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.8/guide/ingress/annotations/
Ingress 수정
Ingress에 발생한 Event 확인
AWS Load Balancer Controller 로그 확인
아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인
기존에 생성된 ALB가 존재하는지 확인
새롭게 생성된 ALB의 ARN를 확인하고 환경변수로 저장
아파치 웹서버 배포
Ingress 수정
아래의 명령어를 실행해서 생성된 ALB 엔드포인트를 확인하고 웹브라우저를 통해서 접근이 되는지 확인
cURL 명령어로 Host 값을 nginx.example.com으로 명시하고 ALB 엔드포인트 호출
cURL 명령어로 Host 값을 httpd.example.com으로 명시하고 ALB 엔드포인트 호출
ALB의 리스너 ARN를 확인하고 환경변수로 저장
ALB 리스너 확인
ALB 리스너 규칙 확인
ALB에 연동된 대상그룹들의 ARN을 확인하고 환경변수로 저장
대상그룹 확인
대상그룹에 포함된 대상 목록 확인
Pod 목록 확인
아파치 Deployment의 Replica 갯수를 3개로 조정
Pod 목록 확인
대상그룹에 포함된 대상 목록 확인
Ingress 삭제
AWS Load Balancer Controller 로그 확인
ALB가 삭제되었는지 확인
리소스 삭제
Last updated