Pod은 Self-Healing이 되지 않아 Pod나 Node가 이상이 생겨 종료됩니다.
해당 문제를 해결하기 위해 사용자가 선언한 수 만큼 Pod 수를 유지해주는 ReplicaSet 오브젝트를 도입합니다.
Pod ip는 외부에서 접근할 수 없고 생성할 때마다 ip는 변경됩니다.
클러스터 외부에서 접근할 수 있는 고정적인 단일 엔드포인트가 필요했고 Pod 집합을 클러스터 외부로 노출하기 위해 Service 오브젝트를 도입합니다.
apiVersion: v1 # Kubernetes API 버전
kind: Pod # Object 타입
metadata: # Object를 식별하기 위한 정보
name: kube-basic # Object 이름
labels: # Object 집합을 구할 때 사용할 이름표
app: kube-basic
project: example-project
spec: # 사용자가 원하는 Object의 상태
nodeSelector: # Pod을 배포할 Node 선택
gpu: "true" # Node 집합을 구하기 위한 식별자 (key-value)
containers: # Pod 안에서 실행할 컨테이너 목록
- name: kube-basic # 컨테이너 이름
image: kube-basic:1.0 # 이미지 주소
imagePullPolicy: "Always" # 이미지 다운로드 정책(Always, IfNotPresent - 로컬에 있다면 다운로드, Never)
env: # 컨테이너에 설정할 환경변수 목록
- name: PROFILE # 환경변수 key
value: prod # 환경변수 value
- name: LOG_DIRECTORY
value: /logs
- name: MESSAGE
value: this application is running on $(PROFILE) # 환경변수 참조 가능
ports:
- containerPort: 80 # 통신에 사용할 컨테이너 포트
volumeMounts: # 컨테이너에서 사용할 Pod 볼륨 목록(여러개 설정 가능)
- name: html # Pod 볼륨 이름
mountPath: /var/html # 마운트할 컨테이너 경로
readOnly: true # 볼륨 readOnly 설정
volumes: # 컨테이너가 사용할 수 있는 볼륨 목록
- name: host-volume # 볼륨 이름
hostPath: # 볼륨 타입, 노드에 있는 파일이나 디렉토리를 마운트 할 때
path: /data/mysql
kubectl run {pod 명} --image={image 명} --port={port}
파드를 생성하고 실행할 수 있습니다.
kubectl describe {조회할 대상 종류} {조회할 대상 이름}
명령어를 이용하여 상세 정보를 조회할 수 있고
Events: 해당 부분을 확인하여 상태변화 등 체크를 할 수 있습니다.
kubectl delete pod/{pod 명}
pod를 삭제할 수 있습니다.
kubectl logs {pod 명} -c {container 명}
kubectl exec {pod 명} -- ifconfig eth0
kubectl exec {pod 명} -- netstat -an
kubectl port-foward pod/{pod 명} {포트}:{대상 포트}
pod는 원래 직접 접근할 수 없지만 해당 명령어로 포트포워딩을 해준다면 접근할 수 있게 됩니다.
kubectl exec {pod 명} -- ifconfig eth0
kubectl exec {pod 명} -- env
kubectl create deployment {deployment 명} --image={image 명}
deployment를 생성할 수 있습니다.
kubectl describe {조회할 대상 종류} {조회할 대상 이름}
명령어를 이용하여 상세 정보를 조회할 수 있고
Events: 해당 부분을 확인하여 상태변화 등 체크를 할 수 있습니다.
kubectl scale deployment {deployment 명} --replicas={replica 갯수, pod 갯수}
방법으로 deployment를 이용하여 pod를 scale out할 수 있습니다.
deployment로 관리되고 있는 pod는 replica 갯수가 정해져 있기 때문에 pod를 삭제 하더라도 곧바로 replica 갯수에 맞춰 다시 생성됩니다.
replica의 갯수를 다시 줄일수도 있습니다.
위에서 kubectl 명령어로 deployment를 생성했던 내용과 같은 yml 파일을 작성해줬습니다.
kubectl apply -f {yml 파일 경로}
명령어로 yml 파일을 실행해주면 위에서 kubectl로 했던 실행과 같은 방식으로 deployment를 생성할 수 있습니다.
reference:
Jenkins를 이용한 CI/CD Pipeline 구축 - 이도원,
Kubernetes와 Docker로 한 번에 끝내는 컨테이너 기반 MSA