참고 문서 :
EKS Hands-On 학습 가이드
필요 선행 과정 :
Kubernetes's Objects Detail
Kubernetes를 이루는 기본적인 오브젝트들에 관한 설명이다. EKS를 이해하는데 많은 도움이 될 것 같다.
- Pod - A thin wrapper around one or more containers
- DaemonSet - Implements a single instance of a pod on a worker node
- Deployment - Details how to roll out (or roll back) across versions of your application
- ReplicaSet - Ensures a defined number of pods are always running
- Job - Ensures a pod properly runs to completion
- Service - Maps a fixed IP address to a logical group of pods
- Label - Key/Value pairs used for association and filtering
파악해본 EKS 생성 과정
1. eksctl을 사용하여 Cluster를 생성한다. 생성하는 커맨드에서 간략한 Task Definition같은 것을 볼 수 있다.(ec2는 무슨타입이고 node의 min,max 갯수 및 버젼, 이름 등등을 지정)
2. Cluster 생성과정에서 Cloudformation이 생성되고 이 Cloudformation은 EKS Stack을 구성하기 위한 인프라 정의서 개념이다. 여기에 정의된대로 AWS가 인프라를 구축한다.
3. 이렇게 Cluster와 Node가 생기고 Cluster안에 EC2 형태로 Node라는 Worker가 생긴다. 이 Node안에 Docker 컨테이너를 띄우는 작업은 kubectl을 사용한다.
4. Node안에 컨테이너를 띄울 때 아래와 같은 명령어를 사용한다.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook-go/guestbook-service.json |
저 코드안의 json 파일을 따라가는 url을 열어보면 어떤 명세서같고 이 명세서를 통해 어딘가 Docker hub같은 곳에서 Docker image를 찾아 컨테이너를 띄우는 것 같다.
5. Node안에 Docker 컨테이너를 띄울 수 있는데 이 컨테이너를 각각 pod라고 부르고 이 pod는 고유한 port를 가진다. 이 port를 부여받으면 외부와 통신할 수 있는 통로가 필요하므로 AWS는 로드밸런서를 생성한다. 그리고 pod에 부여한 port를 위에서 언급한 명세서에 정의된 port에 바인딩하여 외부와 통신할 때 명세서의 port로 사용할 수 있도록 한다. 이러한 방식이 Dynamic port binding이라는 건데 각 pod마다 임의로 배정된 다양한 포트를 로드밸런서의 하나의 포트로 매핑하는 것이다. 이로서 로드밸런서에서는 각 pod에 알맞게 로드밸런싱 할 수 있게된다.
그리고 EKS에서 Cluster를 삭제하면 EKS 생성 과정에서 만들어졌던 모든 인프라들이 삭제된다
EKS Cluster의 Node Worker로 사용된 EC2 인스턴스와 로드밸런서, Security Group 그리고 이 모든것을 생성하기 위해 만들어졌던 Cloudformation 까지 모두 삭제된다.
만약 AWS EKS를 사용하여 서비스를 배포하게 된다면 CI/CD 전략을 어떻게 가져가야할지 고민해봐야할 것 같다.
AWS ECS에서는 ECR이라는 Repository가 있어서
Jenkins를 사용하여 새로운 코드로 빌드한 후 이 빌드파일로 Docker image를 만들어 ECR에 push하고,
ECS Cluster를 update하기만 하면 새로운 Docker image로 배포했었다.
그리고 ECS에는 Task Definition이라는게 있어서 이 안에서 Cluster가 어떻게 컨테이너를 띄울것이고 최소, 최대 컨테이너를 얼마나 띄울것이며,
각 컨테이너마다 port는 어떻게 가져갈 것이고 cpu core와 메모리를 얼마나 할당해줄 것인지도 명시할 수 있었다.
그래서 Cluster는 이 Task Definition대로 Container를 Ochestration 할 수 있었다.
분명 EKS도 이런 비슷한 프로세스를 거쳐서 동작할텐데 세부적인 부분은 어떻게 설정하는지 더 알아봐야겠다.
'개발관련 > Kubernetes' 카테고리의 다른 글
Dockerfile 여러개 두고 골라서 쓰는 방법 (0) | 2020.01.16 |
---|---|
AWS EKS에 ALB Ingress Controller 한큐에 세팅하는 스크립트 (0) | 2019.12.24 |
Kubernetes 환경 구성하기 (0) | 2019.11.15 |
Kubernetes 네트워킹 이해하기 (0) | 2019.11.15 |
Kubernetes에서 AWS ECR의 이미지를 내려받을 때 rpc error: code = Unknown desc = failed to pull and unpack image 에러 발생 경우 해결방법 (0) | 2019.11.12 |