K8S - POD 배포

반영환·2023년 8월 17일
0

k8s

목록 보기
4/14
post-thumbnail

K8S POD 배포

쿠버네티스는 POD의 배포를 단일 단위로 하지 않고 Kubernetes Controller 라는 것으로 배치처리한다.

Replication Controller

POD의 개수를 보장한다.
어떤 이유로든 POD가 Kill되면 재배포를 진행한다.

하지만 Template(yml파일)의 수정이 이미 배포된 POD들의 update를 보장하지 않는다.

삭제

kubectl delete rc <rc-name> --cascade=false

Replica Set

Replication Controller의 새로운 버전이며 더욱 풍부한 label selector 를 제공한다.

옵션

  • In : 라벨의 값이 지정된 값 중 하나와 일치해야 한다.

  • NotIn : 라벨의 값이 지정된 값과 일치해서는 안된다.

  • Exists : pod에는 지정된 키가 있는 라벨이 포함되어야 한다.

  • DoesNotExist : pod에는 지정된 키가 있는 라벨을 포함하면 안 된다.

Deployment

Stateless 앱 배포시 가장 기본이 되는 컨트롤러이다.
ReplicaSet을 이용해서 배포된 인스턴스들을 관리하고 이를 통해
Rolling Update , 배포 중단, Roll Back 등의 작업이 가능하다. ( 무중단 업데이트 )

Update

strategy:
  rollingUpdate:
    maxSurge: 25%
    maxUnavailable: 25%
  type: RollingUpdate
  • maxSurge : 기존 파드의 개수보다 25% 더 초과해서 새로운 버전의 파드를 올리겠다는 의미
  • maxUnavailable : 기존의 파드 중 25%까지만 파드를 죽이겠다는 의미

이 설정은 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

Daemon Set

특정 노드 혹은 모든 노드에 POD가 한 개씩 실행되도록 보장하는 컨트롤러이다.

모니터링툴, 로그수집기등의 배포에 사용된다.

특정 Node에 배치하고 싶을 때에는 node에 라벨을 붙인 뒤에, node selector를 이용해 배포한다.

참고: K8S - POD 관리

YML 모음집

POD.yml

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#컨테이너 이름

Replication Controller.yml

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

Replica Set.yml

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

Deployment.yml

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개의 리비전을 유지하도록 설정되었다.

Daemon Set.yml

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
profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글