K8s/K3s Ingress & Gateway API

Ingress & Gateway API

식사법 2024. 10. 12. 21:39

6주차 k3s Ingress & Gateway API

k3s 환경 설치

  • k3s pod 확인

image.png

image.png

  • kube-config 확인

Ingress(L7 Layer) 란?

  • 수신에 대한 컨트롤은 하지 못하고 앞단에서 라우팅 할 수 있는 애플리케이션이 필요합니다.
    ex) nginx, HA-proxy, AWS ALB등
  • k8s에서 ingress에 역할은 트래픽이 ingress까지 들어왔을 때 어떤식으로 라우팅 방식을 해주어야 할지 정의합니다.
    ex) path 기반, URL 기반, tls 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: "gasida.com"
    http:
      paths:
      - path: /gasida1
        pathType: Prefix
        backend:
          service:
            name: gasida-app1-service
            port:
              number: 80
      - path: /gasida2
        pathType: Prefix
        backend:
          service:
            name: gasida-app2-service
            port:
              number: 80

image.png

Ingress Nginx controller Install

image.png

  • ingress nignx controller 설치 이후
  • externalTrafficPolicy: Local 설정 변경 처음 트래픽이 흘러간 node에 배치 된 pod로만 트래픽이 진행이 되고 해당 node가 down 되었을 경우 time out이 발생 됩니다.
  • ingress 정책

image.png

  • 배포한 pod 확인

image.png

  • 배포한 pod svc에 대한 ingress object 배포

image.png

  • nginx.conf에 대한 location 정보 확인

image.png

  • ingress path 및 backend 설정 확인

image.png

image.png

  • sv1-web

image.png

  • sv2-guest

image.png

⇒ 기본 적으로 라운드로빈으로 트래픽을 전달 해주는 것을 알 수 있습니다.

image.png

Client_address ⇒ 172.16.0.3 ⇒ ingress nginx controller IP

XFF 주소 ⇒ ec2 공인 IP

image.png

  • wireshark

image.png

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
  • host 기반으로 Ingress 정책 배포 yaml(gasida님 예제)

image.png

  • host 기반 ingress 설정 확인

image.png

  • host 기반 ingress 적용하여 실제 curl 확인

배포 자동화 지원

  • 롤링 업데이트
    • 하나 하나 씩 업그레이드 되는 형태
  • 카나리 업데이트
    • 설정 된 비율로 업그레이드 되는 형태
  • 블루/그린 업데이트
    • 기존 서버에서 신규 업그레이드 된 서버로 한번에 트래픽을 옮기는 작업이 되는 형태

카나리 업데이트

image.png

  • 카나리 업데이트 테스트를 위한 pod 배포

image.png

image.png

  • ingress 오브젝트에 카나리 설정 상 10%에 대한 비율로 오게 되는 설정으로 100번 호출 기준으로는 9:1로 트래픽이 들어오게 됩니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=**50**
  • ingress svc2에 대해 50%로 변경

image.png

  • 50%로 변경 이후 svc에 대해 호출 되는 빈도수가 많아지는 것을 확인 할 수 있습니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=100
  • ingress svc2에 대해 100%로 변경

image.png

  • 모든 트래픽이 svc2로 들어오는 것을 확인 할 수 있습니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=0
  • ingress svc2에 대해 0%로 변경

image.png

  • 모든 트래픽이 svc1로 들어오는 것을 확인 할 수 있습니다.

HTTPS 처리 (TLS Termination)

# test-user.com 기반에 인증서를 k8s secret으로 생성
kubectl create secret tls secret-https --key tls.key --cert tls.crt

image.png

image.png

  • 30443으로 통신이 되는지 확인

image.png