본문 바로가기

kubernetes, helm, rancher

kubernetes ReplicaSet, Deployment, Daemon set

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

  • ReplicationController은 old한 기술이여서, 이와 같은 역할을 하지만, 보다 다양한 selector를 제공해주는 ReplicaSet 컨트롤러를 쓴다.

 

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # 케이스에 따라 레플리카를 수정한다.
  replicas: 3
  selector:
    matchLabels:
      component: redis 
    matchExpressions:
    - {key: tire, operator: In, values: ["1.1", "1,2"]} # tire라는 key에 1.1 혹은 1.2가 있어야함
    - {key: environment, operator: NotIn, values: [a,b]}# environment에 a,b가 들어있으면 안됨.
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
# In: key, value가 일치하는 pod만 연결.
# NotIn: key는 일치하고 value는 일치하지 않는 pod만 연결
# Exists: key에 맞는 label의 pod를 연결
# DoesNotExist: key와 다른 label의 pod를 연결
# replicationController는 여러 selector가 있으면 and조건, matchLabels도 같은 의미.

 

  • template이 있는데 selector가 왜 필요한지 궁금할 텐데 그건, replicaset은 그 전에 만들어진 즉, 모든 pod들을 관찰하기 때문에, 이미 selector에 해당하는 label을 가지고 있는 pod가 존재하면 더이상 생성 x.
  • kubectl get rs(replicaset)
  • kubectl scale rs [replicaset name] --replicas=[num] # replicaset 개수 조정
  • kubectl scale --replicas=[num] -f [file name] 도 가능
  • kubectl replace -f [rs file name]으로 replace 가능
  • kubectl delete rs [rs_name] --cascade=false # relicaset controller만 삭제하고 pod는 그대로 남겨둬서 독립된 pod로 바뀜.
  • deployment가 replicaset을 컨트롤하고 replicaset은 pod들을 컨트롤한다. 
  • deployment는 rolling update, rolling back을 수행하며, 새로운 replicaset을 만들어 서비스 중단없이 update, back하는 것.
  • deployment는 replicaset이랑 kind만 다르고 같은 yaml형식을 띄며 역시나 version은 apps/v1이다.
  • kubectl get deploy,rs,pod
  • kubectl delete rs [rs name]해도 다시 deployment가 replicaset을 생성한다.
  • rollout update는 apply와 set, edit명령을 쓸 수 있다. -> kubectl apply, set, edit으로 update 가능. 하지만 특정 field만 update가능. ex) image, name
  • --record는 기록을 위한 용도로 kubectl rollout history명령어에서 기록된 버전으로 되돌아 가기 위해서 써야한다.
  • --record 대신 metadata.annotation에 써도 된다.
  • annotations -> kubernetes에게 특정 정보를 전달할 용도로 사용. ex) deployment의 rolling update 정보 저장. 혹은 release, logging, monitoring
...
metadata:
  name: [name]
  annotations:
    [key]: [value]
  • kubectl create -f deployment.yaml --record
  • kubectl set image deployment app-deploy web=nginx:1.15 --record
  • kubectl rollout status deployment [deployment name] -> 업데이트 과정 상태
  • kubectl rollout pause deployment [deployment name] -> 업데이트 일시정지
  • kubectl rollout resume deployment [deployment name] -> 업데이트 다시 시작
  • kubectl rollout history deployment [deployment name] -> 업데이트 history
  • kubectl rollout undo deployment [deployment name] -> 업데이트 바로 전 단계로
  • kubectl rollout history deployment [deployment name] --to-revision=[num] -> 업데이트 to-revision 단계로
  • kubectl apply -f [deployment.yaml] -> 위의 명령어가 너무 길면 yaml파일의 version을 바꿔서 실행하면 된다.
  • 카나리 업데이트는 기존 버전을 유지한 채로 일부 버전만 신규버전으로 올려서 버그나 이상이 없는지 확인 후 배포.
  • 올드 버전과 뉴 버전의 중복 label을 이용해 selector로 배포한다음 올드 버전의 replicas의 개수를 줄이고 뉴 버전의 replicas 수를 늘려 배포한다.
  • kubectl create -f old-canary.yaml -> kubectl create -f new-canary.yaml -> 이상없음 -> kubectl scale deployment new-canary --replicas=2 -> kubectl delete deployments.apps old-canary

 

# replicaset or deployment
metadata:
  name: deploy-nginx
  annotations:
    kubernetes.io/change-cause: version 1.14 # record
spec:
  progressDeadlineSeconds: 600 # 10분동안 업데이트가 진행되지 않으면 취소시킨다.
  revisionHistoryLimit: 10 # history 기록을 10개로 한정
  strategy:
    rollingUpdate:
      maxSurge: 25% # update할때 running pod를 몇개로 유지할 것인가. 높을수록 update빠르다.
      masUnavailable: 25% # terminating되는 pod 비율
  type: RollingUpdate
  replicas: 3
  ...

 

  • Daemonset이란 전체 노드에서 pod가 한개씩 실행되도록 보장. -> 로그, 모니터링 에이전트와 같은 프로그램 실행시 쓰인다. (kube scheduler에 의해 무시된다.)

 

apiVersion: apps/v1
kind: DaemonSet
metadata:
...
spec:
  selector:
    ...
  template:
    ...

# replicaset과 비슷하지만 replicas 개수 정보가 없다. -> 각노드당 1개씩 이니까

 

  • kubectl get daemonsets.apps
  • kubectl create -f [daemonset.yaml]를 하면 중간에 노드가 삭제되거나 추가되거나, pod가 삭제되더라도 1개 보장.
  • kubectl edit damonsets.apps [damonset name]을 통해 version을 바꾸고 저장하면 rolling update된다.
  • kubectl rollout undo도 지원해준다.