[k8s] Controller

이정훈·2023년 4월 26일
0

k8s

목록 보기
10/17
post-thumbnail
  • 그냥 파드를 사용하지 않고 컨트롤러로 생성한다.
  • 지정한 파드들이 알아서 만든다.
  • 말그대로 파드를 제어!

기능

Auto Healing

  • 컨트롤러에서 지정한 수의 파드를 유지하는 기능
  • 특정 노에서 파드가 다운되거나 특정 노드 자체가 다운되면 다운 된 노드를 다른 곳에 복구, 실행

Software Update

  • 버전을 업데이트 해주는 기능, 롤링업데이트 할 수 있따.

Job

  • 컨트롤러를 이용해 파드를 만들 때, 한번만 사용해야한다. 그때 사용해준다.
  • 예를 들어 우리가 장고 웹올리고 마이그레이트를 한번만 실행해도 될때 그때 한번만 수행해 준다.

Auto Scale

  • HPA: 수평적인 파드 오토스케일(파드의 개수를 늘려주는 역할 수행)
  • VPA: 수직적인 파드 오토스케일(파드의 사양을 늘려주는 역할 수행)
  • CA: 클러스트 오토스케일(노드 자체를 늘려주는 역하 수행)

종류

replicaset

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    type: web
spec:
  containers:
  - name: container
    image: 이미지이름
    ports:
    - containerPort: 8000
  terminationGracePeriodSeconds: 0 # 삭제시간 0초
  • pod1 하나를 먼저 만들어 준다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web
  template:
    metadata:
      name: pod1
      labels:
        type: web
    spec:
      containers:
      - name: container
        image: gugucone/hello:8000
        ports:
        - containerPort: 8000
      terminationGracePeriodSeconds: 0
  • replicaset: 파드를 몇개 유지할거냐? 설정해주는 친구
  • 레플리카생성시 '1'로 설정을 했고, 먼저 만들어 놓은 파드가 있기 때문에 파드를 더 이상 만들지 않는다.
  • 여기서 '2'로 수정을 하게 되면 그 때 새로운 파드를 하나 더 만들어 준다.
  • 이때, 파드이름을 지정해도 레플리카로 유지될 때 이름은 랜덤으로 지정된다.
  • 기존에 생성되어 있는 파드도 레플리카로 유지관리할 수 있다. (라벨로 묶어주면 된다.)

  • pod1을 지워주면 2로 계속 유지하기로 했으니깐 하나를 생성해 준다.
  • 만약 이미지를 변경했다. 도커허브에서 가져올 이미지를 레플리카에서 수정해주고, 기존 파드를 지워주면, 새로운 이미지를 사용해서 파드를 생성해준다. (수동으로 롤링업데이트를 하려면 이렇게, 근데 디플로이먼트로 설정할 수 있다.)
matchExpressions:
- {key: type, operator: In, values: [web]}
# 키: type이고 연산자의 값이 web이면 매치!
- {key: ver, operator: Exists}
# 키: ver이면 연사자가 존재하면 매치!

deployment

  • replicaset이랑 kind만 빼고 똑같아 근데 차이가 무엇이냐?
  • deployment는 배포를 하기위한 친구 그래서 strategy! 가 추가 되는 것이다.
  • 기본옵션은 롤링업데이트다

recreate

  • 8000번이 지워지고 9000번이 올라온다 중간에 서버가 다운되버릴 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  replicas: 2
  strategy:
    type: Recreate
  revisionHistoryLimit: 1
  # 업데이트내역 기록해주는 것! 이거는 명령어로 확인해보자
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
      - name: container
        image: gugucone/hello:8000
        ports:
        - containerPort: 8000
      terminationGracePeriodSeconds: 5
      

  • recreate전략으로 8000번 이미지 파일로 생성
  • 이미지 파일 9000번으로 업데이트 하면 8000번이 전부 지워지고
  • 9000번으로 실행되는 것을 확인

  • 이전버전으로 돌아갈 수 도 있다.
현재 업데이트 내역 확인
kubectl rollout history deployment [디플로이먼트이름]
이전 버전으로 돌아가기
kubectl rollout undo deployment [디플로이먼트이름] --to-revision=[위에서 확인한 숫자]

Rollingupdate

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  selector:
    matchLabels:
      type: app
  replicas: 4
  strategy:
    type: RollingUpdate
  minReadySeconds: 10
  # 10초동안 건들지말아줘! 트래픽이 오지 않도록
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
      - name: container
        image: gugucone/hello:8000
      terminationGracePeriodSeconds: 3

  • 하나가 생성되면서 하나는 지워지고 있는 것을 확인

bluegreen

blue

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-test-1
spec:
  selector:
    matchLabels:
      ver: v1
  replicas: 2
  strategy:
    type: RollingUpdate
  minReadySeconds: 10
  template:
    metadata:
      labels:
        ver: v1
    spec:
      containers:
      - name: container
        image: gugucone/hello:v1.1
      terminationGracePeriodSeconds: 3   

green

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-test-2
spec:
  selector:
    matchLabels:
      ver: v2
  replicas: 2
  strategy:
    type: RollingUpdate
  minReadySeconds: 10
  template:
    metadata:
      labels:
        ver: v2
    spec:
      containers:
      - name: container
        image: gugucone/hello:v2.1
      terminationGracePeriodSeconds: 3   

service

apiVersion: v1
kind: Service
metadata:
  name: test-svc
spec:
  selector:
    ver: v1 #이친구만 변경해주면 된다!
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer
  • while true; do curl http://192.168.181.102/; sleep 1; done
    이거 쓰면 지속적으로 값을 나오게 해주니깐 기억하자!
  • v1 친구를 일단 배포중, 그리고 v2를 만들어서 테스가 되었다. 그러면 그 때, 서비스를 v2로 변경해주면 한번에 변경 되는 것을 확인 할 수 있다.

  • 업데이트한 다음에 구 버전은 지워주는게 아니라 레플리가를 '0'으로 하고 나중에 업데이트된 이미지를 넣어서 살려주고 다시 서비스에서 셀렉터를 변경해서 업데이트 해주면 된다.
  • 지우지말고 계속 사용해도 된다!

HorizontalPodAutoscaler

  • 사전준비가 필요하다
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml
  • 설치해 주면
  • kube-system에 metrics-server 디플로이먼트가 설치되는데 이친구들은 https 통신을 하기 때문에 지금 에러가 나온 상태이다.
args:
  - '--cert-dir=/tmp'
  - '--secure-port=443'
  - '--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname'
  - '--kubelet-use-node-status-port'
  - '--metric-resolution=15s'
  - '--kubelet-insecure-tls'	# 이 친구를 추가
  • kube-system 네임스페이스에 추가된 metrics-server 디플로이먼트의 설정을 변경해줘야 한다.
  • 이런식으로 지금 사용량을 보고 있을 수 있다!

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
 name: cpu1
spec:
 selector:
   matchLabels:
      resource: cpu
 replicas: 2
 template:
   metadata:
     labels:
       resource: cpu
   spec:
     containers:
     - name: container
       image: gugucone/hello:v1.1
       resources:
         requests:
           cpu: 100m
         limits:
           cpu: 200m

service

apiVersion: v1
kind: Service
metadata:
  name: auto-svc
spec:
  selector:
    resource: cpu
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

autosaler

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-cpu
spec:
  maxReplicas: 10
  minReplicas: 2
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: cpu1
    # 누구를 target으로 할 것이냐!
  metrics:
  - type: Resource 
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 15
        # 사용량 설정
  • 이친구는 대쉬보드에서 확인할 수 없다... 명령어로 지웠다 설치해야한다.

  • kubectl get hpa -w 실시간으로 사용량을 확인할 수 있다.
  • cpu에 과부하를 걸었고, 제한을 15%로 주었다. 그럼 파드를 더 생성하게된다.
    사용량이 낮아지는 것을 볼 수 있는데 이는 파드가 더 생성이 되었기 떄문인다.
    그리고 5개에서 머물고 있는데 지금 상태는 5개가 적당한 수준이기 떄문에 파드의 수가 정해졌다고 생각하면 된다.
profile
싱숭생숭늉

0개의 댓글