쿠버네티스 클러스터 내에서 실행되는 애플리케이션, 서비스 배포의 단위

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: hello-world
image: hello-world:latest
ports:
- containerPort: 80
Downtime이 없는 안정적인 서비스를 위해 동시 구동되는 파드들의 집합을 관리💡즉, 레플리카 셋은 동일한 스펙과 규격을 가진 복제본 파드를 가지고, 파드 다운 시 바로 복제본으로 대체하는 리소스다.

replicaset-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f replicaset-example.yaml # 배포
kubectl get replicaset # 조회
kubectl get pods -l app=nginx # matchLabels 조회
kubectl delete pod [name] # 삭제하면 새로운 Pod가 생성되서 실행되는 것을 확인 가능

deployment-example.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80$ kubectl set image deployment/nginx-deployment nginx=nginx:1.16 # 1.16 버전으로 재배포
$ kubectl rollout status deployment/nginx-deployment # 상태 확인
$ kubectl get pods -l app=nginx
$ kubectl describe pods nginx-deploymentstatefulset-example.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
설명
apiVersion, kind, metadata: 기본적인 리소스 정의와 이름을 설정selector: StatefulSet에서 관리할 Pod를 선택하는 조건을 정의 app: nginx라는 레이블을 가진 Pod들을 선택serviceName: StatefulSet에 의해 생성되는 서비스의 이름을 정의.nginx라는 이름의 서비스가 생성replicas: 생성할 Pod의 수를 정의Pod를 생성template: 실제로 생성될 Pod의 템플릿을 정의.Pod는 nginx:latest 이미지를 사용하고, containerPort: 80을 열며, volumeMounts를 통해 www 볼륨을 /usr/share/nginx/html에 마운트volumeClaimTemplates: 각 Pod에 대한 동적 PVC(PersistentVolumeClaim)를 생성각 Pod는 1Gi의 스토리지를 요청하고, ReadWriteOnce 액세스 모드를 설정
$ vi pv-example.yaml # PersistenceVolume 정의(추후 설명)
$ kubectl apply -f pv-example.yaml
$ kubectl get pv
$ vi statefulset-example.yaml
$ kubectl apply -f statefulset-example.yaml
pv-example.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-web-0
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data-web-0"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-web-1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/data-web-1"
kubectl delete pod web-1 실행 후에 get pvc를 해보면 그대로 유지 중인 것을 확인 가능

데몬셋의 특성을 확인하기 위해선 2개 이상의 노드가 필요
daemonset-example.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
namespace: default
spec:
selector:
matchLabels:
name: daemonset-example
template:
metadata:
labels:
name: daemonset-example
spec:
containers:
- name: hello
image: busybox
command:
- "/bin/sh"
- "-c"
- "while true; do echo DaemonSet running on $(hostname); sleep 10; done"