도커엔진과 달리 쿠버네티스는 사용 환경과 목적에 따라 설치하는 방법이 매우 다양하다
개발 용도의 설치
- Minikube
- Docker Desktop for Mac/Windows 에 내장된 쿠버네티스
서비스 테스트 또는 운영 용도의 설치
- Kops
- Kubespray
- kubeadm
- EKS, GKE 등의 매니지드 서비스
실제 서비스 또는 운영 용도 쿠버네티스 환경 종류
1. 클라우드 플랫폼 환경
- ex) AWS, GKE
- 매니지드 서비스를 사용해 설치할 지 또는 서버 인스턴스만을 사용해 설치할 지 선택
2. 자체적으로 보유한 온프레미스(on-premis) 서버 환경
- 장점: 쿠버네티스와 서버 인프라의 세밀한 부분까지 원하는 대로 구성 가능
- 단점: 쿠버네티스를 포함한 모든 인프라 직접 관리하여 운영 및 유지보수 복잡해짐
- 설치 툴: kubespray, kubeadm
쿠버네티스의 특징
- 모든 리소스는 오브젝트 형태로 관리된다.
- 쿠버네티스는 명령어로도 사용할 수 있지만 YAML 파일을 더 많이 사용한다.
- 쿠버네티스는 여러 개의 컴포넌트로 구성돼 있다.
- 마스터 노드 - API 서버, 컨트롤러 매니저, 스케줄러, DNS 서버 등 실행
- 모든 노드 - proxy, 네트워크 플러그인 (calico, flannel 등) 실행
쿠버네티스를 잘 사용하는 방법은 YAML 파일을 잘 작성하는 것!
kublet
: 컨테이너 생성, 삭제와 마스터와 워커 노드 간의 통실 역할을 담당하는 매우 중요한 에이전트
- 모든 노드에서 기본적으로 실행되며, 마스터 노드에는 API 서버 등이 컨테이너로 실행된다
- 정상적으로 실행되지 않으면 해당 노드는 쿠버네티스와 연결되지 않을 수 있다
컨테이너 애플리케이션을 구동하기 위해 반드시 알아야 할 오브젝트
-> 포드(Pod), 레플리카셋(Replica Set), 서비스(Service), 디플로이먼트(Deployment)
6.2 포드(Pod)
* 쿠버네티스에서 가장 기초적이고 중요한 개념
도커 엔진의 기본 단위 - 도커 컨테이너
스웜 모드의 기본 단위 - 여러개의 컨테이너로 구성된 서비스(service)
쿠버네티스의 기본 단위 - 포드
쿠버네티스와 도커의 차이점
: 도커는 컨테이너를 만들지만, 쿠버네티스는 컨테이너 대신 Pod을 만든다. (Pod는 한 개 또는 여러 개의 컨테이너를 포함한다.)
포드
: 1개 이상의 컨테이너로 구성된 컨테이너의 집합
ex) Nginx 웹 서비스를 쿠버네티스에서 생성할 때, 포드 1개에 Nginx 컨테이너 1개 포함해 생성한다.
ex) 동일한 Nginx 컨테이너를 여러개 생성하고 싶다면 1개의 Nginx 컨테이너가 들어 있는 동일한 포드를 여러개 생성하면 된다.
-> Nginx 컨테이너로 구성된 포드 yaml 생성
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
책의 git yaml 예제 참고: https://github.com/alicek106/start-docker-kubernetes/tree/master/chapter6
YAML 파일 구성
1. apiVersion
: YAML 파일에서 정의한 오브젝트의 API 버전
2. kind
: 해당 리소스의 종류
- 사용할 수 있는 리소스 오브젝트 종류 확인 명령어: kubectl api-resources 의 KIND 항목
3. metadata
: 라벨, 주석, 이름과 같은 리소스의 부가 정보
4. spec
: 리소스를 생성하기 위한 자세한 정보
- containers: 포드에서 실행될 컨테이너 정보
- image: 사용할 도커 이미지
- name: 컨테이너의 이름
- ports: 컨테이너가 사용할 포트
- command, args: 컨테이너 내부에서 가장 먼저 실행될 프로세스 지정
작성한 YAML 파일을 쿠버네티스에 생성하기
kubectl apply -f nginx-pod.yaml
특정 오브젝트의 목록 확인
kubectl get [오브젝트명]
kubectl get pods
리소스의 자세한 정보 확인
kubectl describe
kubectl describe pods my-nginx-pod
포드의 컨테이너 내부에 들어가 명령어 전달도 가능하다
kubectl exec -it my-nginx-pod bash
root@my-nginx-pod:/# ls /etc/nginx
...
쿠버네티스 로그 확인
kubectl logs
kubectl logs my-nginx-pod
쿠버네티스 오브젝트 삭제
kubectl delete -f
kubectl delete -f nginx-pod.yaml
* 포드와 도커 컨테이너의 개념이 비슷하다. 그렇지만, 쿠버네티스가 포드를 사용하는 이유
-> 여러 리눅스 네임스페이스를 공유하는 여러 컨테이너들을 추상화된 집합으로 사용하기 위해서! (?)
네트워크 네임스페이스의 역할: 컨테이너의 고유한 네트워크 환경을 제공해준다.
포드 내부의 컨테이너들은 네트워크와 같은 리눅스 네임스페이스를 공유한다
* 실제 쿠버네티스 환경에서는 1개의 컨테이너로 구성된 포드를 사용하는 경우가 많다.
사이드카 컨테이너
: 포드에 정의된 부가적인 컨테이너
- 포드 내의 다른 컨테이너와 네트워크 환경 공유 -> 포드에 포함된 컨테이너들은 모두 같은 워커 노드에서 함께 실행된다
포드 VS 도커 컨테이너
- 포드에 정의된 여러개의 컨테이너는 하나의 완전한 애플리케이션으로 동작하게된다.
6.3 레플리카셋(Replica Set)
레플리카셋 역할
- 정해진 수의 동일한 포드가 항상 실행되도록 관리
- 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성
레플리카셋 목적은 일정 개수의 포드를 유지하는 것
ex) Nginx 포드를 생성하는 레플리카셋
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
- spec.replicas: 동일한 포드를 몇 개 유지시킬 것인지 설정
- spec.template: 포드를 사용할 때 사용할 템플릿 정의 (포드 스펙, 포드 템플릿)
레플리카셋 목록 확인
kubectl get rs
6.4 디플로이먼트(Deployment)
레플리카셋 상위 오브젝트 이므로 디플로이먼트를 생성하면 레플리카셋도 함께 생성된다
-> 디플로이먼트를 사용하면 포드와 레플리카셋을 직접 생성할 필요 없다.
ex) 디플로이먼트 생성
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
디플로이먼트 목록 확인
kubectl get deployment
디플로이먼트를 사용하는 이유? 애플리케이션의 업데이트와 배포를 편하게 하기 위해
- 업데이트할 때 레플리카셋 변경사항을 저장하는 리비전을 남겨 롤백 가능
- 무중단 서비스를 위해 포드의 롤링 업데이트 전략을 지정 가능
6.5 서비스(Service)
도커 컨테이너 외부 노출 방법
- 컨테이너 생성과 동시에 외부 노출 방법: -p 옵션
- 컨테이너들이 서로의 이름으로 접근하는 방법: docker run --link 옵션
쿠버네티스의 포드에 접근하는 방법
- 서비스 오브젝트 생성
서비스의 기능
- 여러개의 pod에 쉽게 접근할 수 있도록 고유한 도메인 이름 부여
- 여러개의 pod에 접근할 때 요철을 분산하는 로드 밸런서 기능 수행
- 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포드 등을 통해 포드를 외부로 노출
포드의 IP 확인
kubectl get pods -o wide
서비스 종류
목적에 맞는 적절한 서비스 종류 선택
1. ClusterIP 타입
- 쿠버네티스 내부에서만 포드 접근할 때 사용
- ex) k8s 대시보드 관리, 각 포드의 서비스 상태 디버깅, 프론트엔드 or 벡엔드 서비스 아키텍처 계획
2. NodePort 타입
- 포드에 접근할 수 있는 포트를 클러스터의 모든 노드에 개방 -> 외부에서 포드에 접근 가능
- ex) 내부에서 개발하다가 외부에 대모를 하는 경우
3. LoadBalancer 타입
- 로드밸런서를 동적으로 포드에 연결 -> 외부에서 포드에 접근 가능
- 클라우드 환경에서만 작동 가능 ex) aws, google cloud
- ex) 외부에 시스템을 노출시키는 경우
'도커&쿠버네티스' 카테고리의 다른 글
[도커/쿠버네티스] 8장 인그레스 (0) | 2022.02.28 |
---|---|
[도커/쿠버네티스] 7장 쿠버네티스 리소스의 관리와 설정(네임스페이스, 컨피그맵, 시크릿) (0) | 2022.02.23 |
쿠버네티스 설치 minikube (0) | 2022.01.31 |
[도커/쿠버네티스] 4장 도커 컴포즈 (0) | 2022.01.25 |
[도커/쿠버네티스] 3장 도커 스웜 (0) | 2022.01.18 |
댓글