apiVersion: v1
kind: Pod
metadata:
name: cmd
spec:
restartPolicy: OnFailure #echo 명령어는 실행 후 종료되기에, 실패시에만 재시작하도록
containers:
- name: nginx
image: nginx
command: ["/bin/echo"] #실행명령 지정
args: ["hello"] #실행명령에 넘겨줄 파라미터 지정
즉, echo hello를 하겠다는 뜻이다.
apiVersion: v1
kind: Pod
metadata:
name: env
spec:
containers:
- name: nginx
image: nginx
env: # env 속성으로 넘겨준다.
- name: hello # 환경변수 key 지정,
value: "world!" # 환경변수 value 지정,
kubectl apply -f env.yaml
: pod 생성
kubectl exec env -- printenv | grep hello
: hello=world! 확인
pod가 사라지면 데이터도 날라간다. 이를 지속적으로 저장하기 위해, 볼륨을 사용한다.
여러가지 볼륨타입이 존재하나, 기본인 host Volume을 사용한다. (호스트 서버에 저장)
# volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume
spec:
containers:
- name: nginx
image: nginx
# 컨테이너 내부의 연결 위치 지정
volumeMounts:
- mountPath: /container-volume # 컨테이너 내부 연결 위치
name: my-volume # 동일하게(연결하는 식별자로 사용됨)
# host 서버의 연결 위치 지정
volumes:
- name: my-volume #동일하게
hostPath:
path: /home # 호스트 서버 연결 위치
추가로, 호스트 서버 연결말고, 컨테이너끼리 파일 데이터를 주고 받을 때 사용되는 volumn도 존재한다.
apiVersion: v1
kind: Pod
metadata:
name: volume-empty
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /container-volume
name: my-volume
volumes:
- name: my-volume
emptyDir: {} # 해당 부분이 차이점이다.
pod의 생명주기를 따라가며, 기존과 다르지 않으나, 2개 이상의 컨테이너끼리 디렉터리 공간을 공유할 때 사용된다.
# requests.yaml
apiVersion: v1
kind: Pod
metadata:
name: requests
spec:
containers:
- name: nginx
image: nginx
resources:
requests: # 최소 사용량
cpu: "250m" # 0.25core. 1000m = 1core
memory: "500Mi" # Mi = 1MiB = 2^20 Bytes
limits: # 최대 사용량
cpu: "500m"
memory: "1Gi"
최대 메모리 사용량을 넘을 경우, 프로세스가 중단 됨 => 전체 서버에 영향을 주지 않음.
컨테이너의 상태를 주기적으로 체크해서, 문제가 있는 컨테이너를 자동으로 재시작하거나 삭제.
pod가 정상적으로 동작하는지 확인, 자가치유를 위한 판단기준으로 활용됨.
# live.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness
spec:
containers:
- name: nginx
image: nginx
livenessProbe: # 정상적으로 작동하는지
httpGet: # 뭘 기준으로? HTTP Get method를 사용해, 상태 확인!
path: /live # http 주소
port: 80 # http 포트 번호
기본적으로,nginx에서는 /live 라는 API가 없다. 그렇기에 계속 404에러를 받으며,
쿠버네티스는 Pod를 강제로 재시작(자가치유)한다.
실습해보자.
kubectl apply -f live.yaml
: pod 생성
kubectl logs -f liveness
: 로그 확인 ->사진과 같이 에러가 뜬다.
kubectl exec liveness -- touch /usr/share/nginx/html/live
: 에러를 해결해보자
kubectl logs -f liveness
: 로그 확인 ->사진과 같이 해결되었다!
kubectl get pod liveness
: restart를 3번한 것을 알 수 있다. 알아서 자가치유한 것이다
livenessProbe와 달리, pod가 살아있는지 확인하는게 아니라 트래픽을 받을 준비가 되었는지 확인한다.
웹서비스의 경우 구동이 다 된 후에, 트래픽을 받아야 한다.
준비가 되지 않았다면, kubectl get pod
에서 Ready가 1/1
이 아닌, 0/1
이 찍힌다.
즉, livenessProbe와 달리, 컨테이너를 재시작하는게 아닌, 해당 Pod를 사용할 수 없음으로 표시하고, 서비스에서 제외한다
# readiness.yaml
apiVersion: v1
kind: Pod
metadata:
name: readiness
spec:
containers:
- name: nginx
image: nginx
readinessProbe:
httpGet:
path: /ready
port: 80
다음과 같이 0/1
이 뜰 것이다.
kubectl get pod
# NAME READY STATUS RESTARTS AGE
# readiness 0/1 Running 0 2m
이 뒷내용은 추후에 실제로 쓰이게 될때 정리하겠다.