쿠버네티스는 POD의 배포를 단일 단위로 하지 않고 Kubernetes Controller
라는 것으로 배치처리한다.
POD의 개수를 보장한다.
어떤 이유로든 POD가 Kill되면 재배포를 진행한다.
하지만 Template(yml파일)의 수정이 이미 배포된 POD들의 update를 보장하지 않는다.
kubectl delete rc <rc-name> --cascade=false
Replication Controller의 새로운 버전이며 더욱 풍부한 label selector
를 제공한다.
In : 라벨의 값이 지정된 값 중 하나와 일치해야 한다.
NotIn : 라벨의 값이 지정된 값과 일치해서는 안된다.
Exists : pod에는 지정된 키가 있는 라벨이 포함되어야 한다.
DoesNotExist : pod에는 지정된 키가 있는 라벨을 포함하면 안 된다.
Stateless 앱 배포시 가장 기본이 되는 컨트롤러이다.
ReplicaSet을 이용해서 배포된 인스턴스들을 관리하고 이를 통해
Rolling Update
, 배포 중단
, Roll Back
등의 작업이 가능하다. ( 무중단 업데이트 )
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
이 설정은 Deployment 업데이트 중에 최대 25%의 새 파드를 동시에 생성하고, 최대 25%의 파드가 일시적으로 사용 불가능할 수 있도록 허용하는 롤링 업데이트 전략을 정의한다. 이렇게 함으로써 애플리케이션의 안정성을 유지하면서 업데이트를 수행할 수 있다.
kubectl create -f deployment-nginx.yml
kubectl get all
# replicas update
kubectl scale deployment deployment-nginx --replicas = 2
# delete deployment
kubectl delete deployment.apps deployment-nginx
특정 노드 혹은 모든 노드에 POD가 한 개씩 실행되도록 보장하는 컨트롤러이다.
모니터링툴, 로그수집기등의 배포에 사용된다.
특정 Node에 배치하고 싶을 때에는 node에 라벨을 붙인 뒤에, node selector를 이용해 배포한다.
apiVersion: v1 #Kubernetes API Version
kind: Pod #Type of resources
metadata:
name:myapp-pod#Pod의 이름
labels:
app: myapp
version: "1.14"
spec:
containers:
- image:nginx:1.14#컨테이너 이미지 정보
name:nginx-container#컨테이너 이름
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
spec:
replicas: 3
selector:
app: myapp
version: "1.14"
template:
metadata:
labels:
app: myapp
version: "1.14"
spec:
containers:
- name: nginx-container
image: nginx:1.14
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: web
matchExpressions:
- {key: version, operator: In, values: ["1.14", "1.15"]}
template:
metadata:
name: nginx-pod
labels:
app: web
version: "1.14"
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: web
matchExpressions:
- {key: version, operator: In, values: ["1.14", "1.15"]}
progressDeadlineSeconds: 600
revisionHistoryLimit: 10
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
name: nginx-pod
labels:
app: web
version: "1.14"
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
progressDeadlineSeconds: 업데이트 작업의 진행 상황을 모니터링하는데 사용되는 시간 제한을 설정. 즉, 이 값이 설정된 시간 동안 업데이트 작업이 진행되지 않으면 업데이트는 실패한 것으로 간주. 여기서는 600초(약 10분) 동안 업데이트가 진행되지 않으면 업데이트가 실패한 것으로 처리.
revisionHistoryLimit: 저장되는 리비전(버전)의 최대 수를 설정.
쿠버네티스는 Deployment 업데이트를 수행할 때마다 새로운 리비전을 생성하고 이전 버전의 정보를 유지하는데, 이 설정은 총 몇 개의 리비전을 유지할 것인지를 결정한다. 여기서는 최대 10개의 리비전을 유지하도록 설정되었다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
spec:
selector:
matchLabels:
app: web
version: "1.14"
template:
metadata:
labels:
app: nginx
version: "1.14"
spec:
nodeSelector:
gpu: "true"
containers:
- name: nginx
image: nginx:1.14