→ 컨테이너화된 어플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈 소스 시스템
컨테이너화
→ 어플리케이션 코드를 모든 환경에서 실행시 필요한 파일 / 라이브러리와 함께 제공하는 배포 프로세스
배포
→ 자체 IP 주소를 사용하여 컨테이너 노출
→ 시크릿을 통해 시크릿 및 애플리케이션의 구성을 배포 및 업데이트
확장
→ 특정 컨테이너에 대한 트래픽이 많으면 로드밸런싱을 통해 확장을 통해 배포 가능
관리
→ 실패한 컨테이너는 다시 시작 및 컨테이너 교체하여 자동화된 복구
→ 배포된 컨테이너의 상태를 서술가능하며 현재 상태를 배포 상태에서 순차적으로 적용
Pod ( 컨테이너를 다루는 기본 단위 )
→ 1개 이상의 컨테이너로 구성된 컨테이너 집합
도커 컨테이너와의 차이점
- 여러 Namespace를 공유하는 컨테이너들을 추상화된 집합으로 사용하기 위해
apiVersion: v1 kind: Pod metadata: name: my-nginx-pod spec: containers: - name: my-nginx-container image: nginx:latest ports: - containerPort: 80 protocol: TCP - name: ubuntu-sidecar-container image: alicek106/rr-test:curl command: ["tail"] args: ["-f", "/dev/null"] # 포드가 종료되지 않도록 유지합니다
→ 1개의 pod 안에 2개의 컨테이너가 존재
Replica Set ( 일정 개수의 파드를 유지하는 컨트롤러 )
→ 정해진 수의 동일한 파드가 항상 실행 되도록 관리
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nginx spec: ### 레플리카 정의 ### replicas: 3 # 동일한 파드를 몇 개 유지할지 결정 selector: matchLabels: app: my-nginx-pods-label ### 파드 정의 ### template: metadata: name: my-nginx-pod labels: app: my-nginx-pods-label spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
→ 'app: my-nginx-pods-label' 라벨을 가진 파드를 3개 유지하며 각 파드 안에는 Nginx 컨테이너를 실행하고 80번 포트를 열어서 트래픽을 처리
Deployment ( Replica Set, Pod 배포 관리 )
→ 레플리카셋의 상위 오브젝트여서 파드와 레플리카셋을 자동 생성
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: replicas: 3 selector: matchLabels: app: my-nginx template: metadata: name: my-nginx-pod labels: app: my-nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80
→ 'app: my-nginx' 라벨을 가진 파드를 3개 유지하며, 각 파드는 Nginx 1.10 버전의 컨테이너를 실행하고 80번 포트를 열어서 트래픽을 처리
Deployment, ReplicaSet, Pod 관계
Service ( Pod를 연결하고 외부에 노출 )
→ Deployment 통해 생성된 Pod 어떻게 접근할 수 있는 방법
apiVersion: v1 kind: Service metadata: name: hostname-svc-clusterip spec: ports: - name: web-port port: 8080 # 내부에서만 사용할 고유한 IP 할당 targetPort: 80 # 접근 대상의 내부적으로 사용할 포드 (파드 탬플릿에 정의된 포트) selector: # selector : 어떠한 라벨을 가지는 파드에서 접근 할 것인지 결정 app: webserver type: ClusterIP
ClusterIP 타입
→ 쿠버네티스 내부에서 파드들에 접근할 떄 사용
→ 클러스터 내부에서만 사용하는 파드
NodePort 타입
→ 파드에 접근 할 수 있는 포드를 클러스터의 모든 노드에 동일하게 개방
→ 접근 할 수 있는 포트는 랜덤
LoadBalancer 타입
→ 클라우드 플랫폼에서 제공하는 로드 밸런서를 동적으로 파드에 연결
→ AWS, GCP 플랫폼 환경에서만 사용