Sprint-3.0에서 2.0으로 롤백하기(쿠버네티스)

cch_chan·2022년 4월 22일
0

DevOps

목록 보기
13/19

minikube Basic controls

Start a cluster by running :
minikube start

minikube 클러스터 내에서 실행되는 Kubernetes 대시보드에 액세스
minikube dashboard

서버 시작 (이미지 필요)
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4

서비스를 NodePort로 노출:
kubectl expose deployment hello-minikube --type=NodePort --port=8080

minikube를 이용한 서비스 열기
minikube service hello-minikube

모든 로컬 클러스터 및 프로필 삭제
minikube delete --all

쿠버네티스 실행중인 서비스, pod, deployment 확인
kubectl get all

yaml형식 yaml작성후
pod apply
kubectl apply -f <pod.yml>

디플로이먼트 apply:
kubectl apply -f <디플로이먼트.yml>

서비스 apply:
kubectl apply -f <서비스파일.yml>

그외 치트시트 : https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/

sprint 3.0 -> 2.0으로 롤백해보기

STEP 1: 파드 생성

sebcontents/cozserver:1.0 이미지를 바탕으로 파드를 만들어봅시다.
pod.yaml작성

apiVersion: v1
kind: Pod
metadata:
  name: cozserver
spec:
  containers:
  - name: cozserver
    image: sebcontents/cozserver:1.0
    ports:
    - containerPort: 80

pod 추가
kubectl apply -f pod.yaml

STEP 2: 디플로이먼트를 이용한 1.0 배포

deployment.yaml작성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cozserver
  labels:
    app: cozserver
spec:
  replicas: 2
  selector:
    matchLabels:
      app: cozserver
  template:
    # 여기서부터 파드 템플릿
    metadata:
      labels:
        app: cozserver
    spec:
      containers:
      - name: cozserver
        image: sebcontents/cozserver:1.0
        ports:
        - containerPort: 80

kubectl apply -f deployment.yaml

step 3: 서비스 노출(추가)

apiVersion: v1
kind: Service
metadata:
  name: cozserver
  namespace: default
spec:
  selector:
    app: cozserver # 배포하려는 파드를 지정 당연히 파드가 실행중이어야 합니다.
  type: LoadBalancer
  ports:
  - name: cozserver
    protocol: TCP
    port: 80
    targetPort: 8080

kubectl apply -f service.yaml
서비스 추가 완료 후 로컬 테스트를 위한 터널 생성
minikube tunnel 이후 http://localhost 에 접속했을때 cozserver에 정상적으로 접속이 된다면 성공

step4 : 2.0 배포, 롤 아웃

롤링업데이트 방식을 사용 - 디폴트 값이기 때문에 원래의 deployment.yaml에서 이미지 버전 2.0으로 변경 후 deployment-v2.yaml 생성
후 똑같이 v2를 배포하면 자동으로 새로운 버전으로 배포됨
이후 로그확인이 하고 싶으면 아래 명령어로 확인 가능
kubectl rollout history deployment <metadata name>

step5 : 3.0배포 후 2.0으로 롤백

최신 버전에서 오류가 생겨서 이전 버전으로 롤백 하고 싶을때 사용하는 명령어
kubectl rollout undo deployment <metadata name>
롤백 이후 롤아웃 히스토리를 확인 해보면
이전 REVISION이 마지막 REVISION으로 변경됨


Advanced

1. 3.0 버전의 CozServer 파드가 탐침기(probe)에 의해 문제가 있음을 스스로 발견하게 하고, 자동으로 롤백 -> readiness probe 사용

  • probe
    kubelet에 의해 주기적으로 수행되는 진단 도구
  • readiness probe
    트래픽을 수용할 준비가 되어 있는지 확인하고 준비되지 않았다고 보고하는 컨테이너가 있는 포드는 Kubernetes 서비스를 통해 트래픽을 수신하지 않도록 도와줌
  • liveness probe
    애플리케이션이 정상적으로 실행 중인지 확인
    • 두 probe에 차이 liveness probe는 running상태면 패스
      readiness는 준비상태여도 최소 준비시간이 끝날때까지 추가 확인
spec:
  minReadySeconds: 15
  replicas: 2
  selector:
    matchLabels:
      app: cozserver
  template:
    # 여기서부터 파드 템플릿이다
    metadata:
      labels:
        app: cozserver
    spec:
      containers:
      - name: cozserver
        image: sebcontents/cozserver:3.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 1
          periodSeconds: 1

2. service를 ClusterIP로 변경했을때 외부와 연결하는법 -> 인그레스 사용

  • 인그레스
    인그레스는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 게이트웨이입니다. 일반적으로 HTTP를 관리하며 로드 밸런서, SSL Termination (클러스터 내에서는 HTTP로만 통신하게 하는 전환 과정), 가상 호스팅을 제공합니다.
    • 추가로 minikube에서 실습을 해보기 위해선 ingress 컨트롤러를 활성화 시켜야함
      minikube addons enable ingress
    • 추가로 YAML 파일에서 spec.rules.host 에 별도의 호스트를 지정하여 Web Server는 www.mydomain.click, WAS는 api.mydomain.click으로 설정하는 것도 가능하다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

3. helm으로 패키징

  • helm
    하나의 애플리케이션 구성이 최소 하나 이상의 파드와 서비스로 구성되어있음을 생각해봤을 때, 별개의 워크로드를 하나하나 적용하기 보다는, 한번에 여러 개의 워크로드가 즉시 배포할 수 있도록 도와주는 패키지 매니저
    • helm에서는 패키지를 차트라고 부릅니다.
    • helm에서는 패키지가 저장되어 있는 공간을 저장소라고 부릅니다.
    • 차트를 설치하여, 쿠버네티스 클러스터에 구동될 때, 차트의 인스턴스를 릴리즈라고 부릅니다.
profile
꾸준히 새로운 기술을 배워나가는중입니다.

0개의 댓글