Kubernetes for application developers(LFD459)
2. 빌드
2-1. 컨테이너 옵션
2-1-1. 도커
-
도커는 서버를 구동하기 위한 환경을 이미지 형태로 구성해 컨테이너에 설치해 준다.
도커를 사용하면 한 컴퓨터에 다양한 환경을 구축할 수 있다. -
가상화와 다른 점은 가상화는 새로운 PC 를 구축하는 것과 같아 OS 기능이 중복되어 설치되고
PC 자원을 정해진 만큼만 할당 받아 사용할 수 있다. -
하지만 도커로 구성하면 PC 자원을 필요한 만큼 동적으로 요청해 사용할 수 있고 OS 위에 프로세스 처럼
올라가는 형식이라 가상화에 비해 가볍고 성능이 좋다. -
쿠버네티스에서 도커는 컨테이너화 되어 동작하는 애플리케이션과 같은 의미로 쓰이며,
컨테이너를 동작하는데 도커 엔진을 기본으로 사용하고 있다. -
https://hub.docker.com 에서 필요한 이미지를 다운 받아 사용할 수 있다.
2-1-2. Container Runtime Interface (CRI)
-
컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파일하지 않아도 Kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스다.
-
Kubelet은 gRPC 프레임워크를 사용하여 Unix 소켓을 통해 컨테이너 런타임과 통신한다.
-
주로 cri-o, rklet, frakti 를 사용한다.
2-2. 애플리케이션 컨테이너화 하기
-
애플리케이션을 컨테이너로 만들기 위해 stateless 하고 결합도가 낮은 투명한 애플리케이션을 만든다.
-
ConfigMaps, 와 Secret 을 애플리케이션의 환경 변수 대신으로 사용할 수 있다.
애플리케이션을 직접 수정할 필요 없이 ConfigMaps, Secret 을 사용해 다양한 환경에 배포할 수 있다. -
도커를 사용해 컨테이너로 만드는 것이 보편적이며 buildah 나 podman 을 사용해 컨테이너를 만들 수 있다.
2-3. 도커파일 만들기
2-4. 로컬 레포지토리
2-5. Deployment 만들기
-
Deployment 는 애플리케이션 단위를 관리하는 컨트롤러 이며, Pod 에 대한 스펙을 정의한 오브젝트 이다.
-
Pod 의 스케일 인/아웃을 정의하고 Pod 의 배포, 업데이트 버전을 추적할 수 있다. 그리고 Pod 에 대한 롤백을 수행한다.
-
Deployment = ReplicaSet + Pod + history
-
ReplicaSet 은 라벨 선택자를 통해 노드 상의 여러 Pod 의 생성/복제/삭제 등 라이프 사이클을 관리한다.
-
Deployment 를 정의한 yaml 파일을 작성하거나 명령어 실행으로 만들 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx-container
image: nginx
imagePullPolicy: Always
ports:
- containerPort: 80
또는
kubectl create deployment time-date --image=<repo>/<app-name>:<version>
2.6. 컨테이너에서 명령 실행하기
-
kubectl exec -it
-- /bin/bash 명령어로 Pod 에 접속해 명령어를 실행할 수 있다. -
이미지가 만들어진 환경에 따라 실행할 수 있는 명령어가 다를 수 있다.
2-7. Multi-Container Pod
-
하나의 Pod 에 하나의 애플리케이션이 올라가는 것을 권장한다. 애플리케이션은 하나가 올라가지만 애플리케이션에 필요한 컨테이너는 여러 개가 될 수 있기 때문에 하나의 Pod 에 여러 컨테이너가 올라갈 수 있다.
-
Pod 내 각각의 컨테이너는 투명하고 결합도가 낮아야 한다. 결합도가 높거나 투명하지 않다면 확장성이 낮아 컨테이너가 변경될 때 마다 Pod 를 매번 빌드해야 할 수 있다.
-
Pod 내 컨테이너들은 하나의 고유한 IP 와 네임스페이스를 공유한다. 그리고 Pod 의 스토리지에 대한 동일한 접근 권한을 가진다.
-
ambassador : 이 타입의 추가 컨테이너는 외부의 리소스와 통신하는데 사용한다.
-
adaptor : 이 타입의 추가 컨테이너는 주요 애플리케이션 컨테이너가 만든 데이터를 수정한다. 예를 들어 다른 곳에서 사용할 수 없는 ASCII 형식으로 데이터가 만들어 지면, 다른 형식의 데이터로 수정하는 역할을 한다.
-
sidecar : 로깅, 보안 등 주요 애플리케이션 컨테이너를 보조하는 역할을 한다.
2-8. readinessProbe
-
컨테이너가 서비스가 가능한 상태인지 확인하는 방법이다. Command, HTTP, TCP probe 세 가지 방법을 제공한다.
-
HTTP probe : HTTP GET 을 사용해 컨테이너 상태를 확인한다. 200~300 사이 응답코드를 받으면 서비스가 가능한 상태로 판단하고 그 외의 경우 비정상 상태로 판단한다.
metadata:
name: readiness-rc
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
name: readiness-pod
labels:
app: readiness
spec:
containers:
- name: readiness
image: k8s.gcr.io/goproxy:0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /readiness
- Command probe : 쉘 명령을 사용해 컨테이너 상태를 확인한다. 결과가 0 이면 서비스 가능한 상태로 판단하고 그 외의 경우 비정상 상태로 판단한다.
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness
image: k8s.gcr.io/goproxy:0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
2-9. livenessProbe
-
컨테이너 상태를 주기적으로 확인해 응답이 없으면 kubelet 을 통해 컨테이너를 자동으로 재시작해 준다.
-
initialDelaySecond 설정된 값 만큼 대기를 했다가 periodSecond 에 정해진 주기로 컨테이너의 상태를 확인한다.
-
상태 확인 방법으로 Command, HTTP, TCP probe 방법을 사용한다.
-
TCP probe : 지정된 포트에 TCP 연결을 시도해 컨테이너 상태를 확인한다. 연결에 성공하면 서비스가 가능한 상태로 판단한다.
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod-tcp
spec:
containers:
- name: liveness
image: k8s.gcr.io/goproxy:0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
2-10. startupProbe
- 컨테이너 내 애플리케이션이 시작 되었는지 확인한다. startupProbe 를 사용하는 경우 애플리케이션 시작이 확인되기 전까지 다른 프로브를 활성화하지 않는다.