Kubernetes

[ Kans 3 Study - 6w ] 3. Host 기반 라우팅 / 카나리 업그레이드

su''@ 2024. 10. 13. 00:08
CloudNetaStudy - Kubernets Networtk 3기 실습 스터디 게시글입니다.

 

Host 기반 라우팅
  • ingress2.yaml
    출처 : https://kschoi728.tistory.com/266

    cat <<EOT> ingress2.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-2
    spec:
      ingressClassName: nginx
      rules:
      - host: kans.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc3-admin
                port:
                  number: 8080
      - host: "*.kans.com"
        http:
          paths:
          - path: /echo
            pathType: Prefix
            backend:
              service:
                name: svc3-admin
                port:
                  number: 8080
    EOT
  • 인그레스 생성 및 확인

  • 인그레스(Nginx 인그레스 컨트롤러)를 통한 접속(HTTP 인입) 확인 오브젝트 삭제 kubectl delete deployments,svc,ingress --all

svc1 접속 확인 svc3-admin 접속 > 결과 확인 : 왜 접속이 되지 않는가? HTTP 헤더에 Host 필드를 잘 확인해보자!

 

  • 오브젝트 삭제 kubectl delete deployments,svc,ingress --all

 

카나리 업그레이드

카나리 업데이트
블루-그린 업데이트

 

  • canary-svc1-pod.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dp-v1
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: svc-v1
      template:
        metadata:
          labels:
            app: svc-v1
        spec:
          containers:
          - name: pod-v1
            image: k8s.gcr.io/echoserver:1.5
            ports:
            - containerPort: 8080
          terminationGracePeriodSeconds: 0
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-v1
    spec:
      ports:
        - name: web-port
          port: 9001
          targetPort: 8080
      selector:
        app: svc-v1
  • canary-svc2-pod.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dp-v2
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: svc-v2
      template:
        metadata:
          labels:
            app: svc-v2
        spec:
          containers:
          - name: pod-v2
            image: k8s.gcr.io/echoserver:1.6
            ports:
            - containerPort: 8080
          terminationGracePeriodSeconds: 0
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: svc-v2
    spec:
      ports:
        - name: web-port
          port: 9001
          targetPort: 8080
      selector:
        app: svc-v2
  • 생성 및 확인
    # 터미널1
    watch -d 'kubectl get ingress,svc,ep,pod -owide'
    
    # 생성
    curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/7/canary-svc1-pod.yaml
    curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/7/canary-svc2-pod.yaml
    kubectl apply -f canary-svc1-pod.yaml,canary-svc2-pod.yaml
    
    # 확인
    kubectl get svc,ep,pod
    
    # 파드 버전 확인: 1.13.0 vs 1.13.1
    for pod in $(kubectl get pod -o wide -l app=svc-v1 |awk 'NR>1 {print $6}'); do curl -s $pod:8080 | egrep '(Hostname|nginx)'; done
    	Hostname: dp-v1-cdd8dc687-gcgsz
    		server_version=nginx: 1.13.0 - lua: 10008
    for pod in $(kubectl get pod -o wide -l app=svc-v2 |awk 'NR>1 {print $6}'); do curl -s $pod:8080 | egrep '(Hostname|nginx)'; done
    	Hostname: dp-v2-785f69bd6-hh624
    		server_version=nginx: 1.13.1 - lua: 10008
  • 오브젝트 삭제 kubectl delete deployments,svc,ingress --all