실습

해당 실습은 AWS 환경에서 t3.small 타입의 EC2 인스턴스에 Ubuntu Server 20.04 LTS 에서 실습을 진행하다고 가정하고 작성되었습니다.

Minikube

EC2 인스턴스 1개를 생성하세요.

  1. Docker 설치

    sudo apt update && sudo apt install -y docker.io
  2. Docker 권한 설정

    sudo usermod -aG docker $USER
    sudo su - $USER
  3. Minikube 설치

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
  4. Minikube 실행

    minikube start
  5. 실행중인 Pod 확인

    minikube kubectl -- get pod --all-namespaces
  6. 데모 애플리케이션 배포

    minikube kubectl -- run nginx --image=nginx
  7. 서비스 엔드포인트 생성

    minikube kubectl -- expose pod nginx --port=80 --type=NodePort
  8. 서비스 엔드포인트 및 포트 확인

    minikube service nginx
  9. 서비스 엔드포인트로 접속되는지 확인

    curl $(minikube service nginx --url)
  10. EC2 인스턴스 삭제

Single Master Cluster

EC2 인스턴스 2개를 생성하세요.

마스터 노드 구성

  1. 마스터 노드로 사용할 EC2 인스턴스에 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 확인

  9. CRI-O CNI 설정 삭제

  10. CRI-O 서비스 재기동

  11. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  12. 리눅스 호스트네임 설정

  13. 컨트롤 플레인(마스터 노드) 구성

  14. kubeconfig 설정

  15. kubeconfig 파일 확인

  16. 마스터 노드의 사설 IP 확인

  17. 노드 목록 확인

  18. 마스터 노드 상태 확인

  19. 배포된 Pod 확인

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

  21. CNI 플러그인 설치

  22. 마스터 노드 상태 확인

  23. 배포된 Pod 확인

  24. 정적 Pod 생성 경로에 있는 파일 확인

  25. Manifest 파일 생성

  26. 위에서 생성한 Manifest 파일을 정적 Pod 생성 경로로 복사

  27. 새로운 Pod가 생성되었는지 확인

  28. kubectl 명령어로 위에서 생성한 Pod 삭제

  29. Pod가 삭제되었는지 확인

  30. 정적 Pod 생성 경로에 있는 파일 삭제

  31. Pod가 삭제되었는지 확인

  32. kubectl 명령어로 새로운 Pod 생성

  33. 새로운 Pod가 생성되었는지 확인

  34. Pod가 Pending 상태인 이유 확인

  35. 마스터 노드에 부여된 Taint 확인

워커 노드 구성

  1. 워커 노드로 사용할 EC2 인스턴스에 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 삭제

  9. CRI-O 서비스 재기동

  10. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  11. 리눅스 호스트네임 설정

  12. 마스터 노드에 연결된 터미널로 이동해서 워커 노드 조인 명령어 생성

  13. 워커 노드에서 위의 명령어를 실행하고 나온 명령어를 실행

클러스터 구성 확인

  1. 마스터 노드 SSH 세션으로 이동

  2. 노드 상태 확인

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

  4. Service 생성

  5. 서비스 엔드포인트 및 포트 확인

  6. 웹브라우저에서 ANY_NODE_IP:SERVICE_NODE_PORT 로 접속되는지 확인 - 아래 명령어로 주소 확인 가능

실습에 사용한 인스턴스들을 삭제하세요.

Multi Master Cluster

EC2 인스턴스 5개를 생성하세요.

HAProxy 구성

  1. 로드밸런서로 사용할 EC2 인스턴스에 SSH 접속

  2. 리눅스 호스트네임 설정

  3. HAProxy 설치

  4. HAProxy 설정파일을 /etc/haproxy/haproxy.cfg 아래와 같이 수정

  5. HAProxy 데몬을 재시작하고 상태 확인

  6. 웹 브라우저를 열고 HAPROXY_IP:9999/stats 주소로 접속 - 아래 명령어로 주소 확인 가능

마스터 노드 구성

첫번째 마스터 노드 구성

  1. 마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 삭제

  9. CRI-O 서비스 재기동

  10. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  11. 리눅스 호스트네임 설정

  12. 첫번째 컨트롤 플레인(마스터 노드) 구성

  13. 위의 명령어를 실행하고 나온 Outputs에서 컨트롤 플레인 노드 조인 명령어를 메모장에 복사

  14. kubeconfig 설정

  15. 마스터 노드 상태 확인

  16. CNI 플러그인 설치

  17. 마스터 노드 상태 확인

두번째 마스터 노드 구성

  1. 마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 삭제

  9. CRI-O 서비스 재기동

  10. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  11. 리눅스 호스트네임 설정

  12. [첫번째 마스터 노드 구성] 13번 단계에서 메모한 명령어를 실행

세번째 마스터 노드 구성

  1. 마스터 노드로 사용한 인스턴스중에 하나로 SSH 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 삭제

  9. CRI-O 서비스 재기동

  10. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  11. 리눅스 호스트네임 설정

  12. [첫번째 마스터 노드 구성] 13번 단계에서 메모한 명령어를 실행

워커 노드 구성

  1. 워커 노드로 사용할 EC2 인스턴스에 접속

  2. Root 유저로 전환

  3. 시스템 구동에 필요한 라이브러리 설치

  4. CRI-O 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

  5. CRI-O 구동에 필요한 커널 파라미터 설정파일 생성

  6. 위에서 생성한 설정파일 반영

  7. CRI-O 설치

  8. CRI-O CNI 설정 삭제

  9. CRI-O 서비스 재기동

  10. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

  11. 리눅스 호스트네임 설정

  12. 첫번째 마스터 노드에 연결된 터미널로 이동해서 워커 노드 조인 명령어 생성

  13. 워커 노드에서 위의 명령어를 실행하고 나온 명령어를 실행

클러스터 구성 확인

  1. 첫번째 마스터 노드에 연결된 터미널로 이동

  2. 노드 상태 확인

  3. 배포된 Pod 확인

  4. HAProxy에 연결된 터미널로 이동

  5. 웹 브라우저를 열고 HAPROXY_IP:9999/stats 주소로 접속 - 아래 명령어로 주소 확인 가능

컨트롤 플레인 고가용성 테스트

  1. 첫번째 마스터 노드에 연결된 터미널로 이동

  2. 실행중인 ETCD Pod 확인

  3. ETCD Pod 로그 확인

  4. 실행중인 ETCD Pod의 IP 주소 확인

  5. ETCD 클러스터 상태 확인

  6. ETCD 클러스터의 리더 Pod가 배포된 노드에 가서 컨테이너 런타임 정지 - 첫번째 마스터 노드의 ETCD가 가장 먼저 구성되었기 때문에 일반적으로 첫번째 마스터 노드에 배포된 ETCD가 리더

  7. 첫번째 마스터 노드에 연결된 터미널로 이동해서 ETCD Pod 로그 확인

  8. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 노드들의 연결 상태 확인

  9. ETCD 클러스터 상태 확인 - 리더가 변경된 것을 확인

  10. 실행중인 ETCD Pod의 IP 주소 확인

  11. ETCD 클러스터의 리더가 아닌 Pod가 배포된 노드에 가서 컨테이너 런타임 정지

  12. HAProxy 상태 페이지에 들어가서 노드들의 연결 상태 확인

  13. 첫번째 마스터 노드에 연결된 터미널로 이동해서 노드 상태 확인

  14. 컨테이너 런타임을 정지한 노드들에서 컨테이너 런타임 실행

  15. HAProxy 상태 페이지에 들어가서 노드들의 연결 상태 확인

  16. 첫번째 마스터 노드에 연결된 터미널로 이동해서 노드 상태 확인

  17. 모든 Pod가 정상적으로 실행되고 있는지 확인

  18. ETCD 클러스터 상태 확인

ETCD

  1. ETCD에 저장된 데이터 확인

  2. Deployment 생성

  3. ETCD에 업데이트된 데이터 확인

  4. 위에서 생성한 Deployment 객체의 데이터 확인

  5. 컨테이너 이미지 변경

  6. 위에서 생성한 Deployment 객체 정보를 YAML 형식으로 확인

  7. ETCD에 업데이트된 데이터 확인

  8. 새로 생성된 ReplicaSet 확인

EKS Cluster

  1. eksctl 설치

  2. eksctl 버전 확인

  3. ClusterConfig 생성

  4. kubeconfig 삭제

  5. 현재 로그인된 IAM 자격증명 확인

  6. EKS 클러스터 생성

  7. Deployment 생성

  8. 생성된 Pod 확인

  9. Service 생성

  10. 생성된 Service 확인

  11. 생성된 ELB 주소 확인

  12. 웹브라우저에서 위에서 확인한 URL로 접속

  13. EKS 콘솔에서 Control Plane Logging 활성화

  14. CloudWatch에서 로그 확인

  15. 리소스 삭제

  16. EKS 클러스터 삭제 (다른 실습을 계속 진행할 경우에는 클러스터를 삭제하지 않습니다)

Last updated