K8s/K3s Ingress & Gateway API
Ingress & Gateway API
식사법
2024. 10. 12. 21:39
6주차 k3s Ingress & Gateway API
k3s 환경 설치
- k3s pod 확인
- 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
Ingress Nginx controller Install
- ingress nignx controller 설치 이후
- externalTrafficPolicy: Local 설정 변경 처음 트래픽이 흘러간 node에 배치 된 pod로만 트래픽이 진행이 되고 해당 node가 down 되었을 경우 time out이 발생 됩니다.
- ingress 정책
- 배포한 pod 확인
- 배포한 pod svc에 대한 ingress object 배포
- nginx.conf에 대한 location 정보 확인
- ingress path 및 backend 설정 확인
- sv1-web
- sv2-guest
⇒ 기본 적으로 라운드로빈으로 트래픽을 전달 해주는 것을 알 수 있습니다.
Client_address ⇒ 172.16.0.3 ⇒ ingress nginx controller IP
XFF 주소 ⇒ ec2 공인 IP
- wireshark
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님 예제)
- host 기반 ingress 설정 확인
- host 기반 ingress 적용하여 실제 curl 확인
배포 자동화 지원
- 롤링 업데이트
- 하나 하나 씩 업그레이드 되는 형태
- 카나리 업데이트
- 설정 된 비율로 업그레이드 되는 형태
- 블루/그린 업데이트
- 기존 서버에서 신규 업그레이드 된 서버로 한번에 트래픽을 옮기는 작업이 되는 형태
카나리 업데이트
- 카나리 업데이트 테스트를 위한 pod 배포
- test-user.com 도메인 접근 확인
- ingress 오브젝트에 카나리 설정 상 10%에 대한 비율로 오게 되는 설정으로 100번 호출 기준으로는 9:1로 트래픽이 들어오게 됩니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=**50**
- ingress svc2에 대해 50%로 변경
- 50%로 변경 이후 svc에 대해 호출 되는 빈도수가 많아지는 것을 확인 할 수 있습니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=100
- ingress svc2에 대해 100%로 변경
- 모든 트래픽이 svc2로 들어오는 것을 확인 할 수 있습니다.
kubectl annotate --overwrite ingress ingress-canary-v2 nginx.ingress.kubernetes.io/canary-weight=0
- ingress svc2에 대해 0%로 변경
- 모든 트래픽이 svc1로 들어오는 것을 확인 할 수 있습니다.
HTTPS 처리 (TLS Termination)
# test-user.com 기반에 인증서를 k8s secret으로 생성
kubectl create secret tls secret-https --key tls.key --cert tls.crt
- 30443으로 통신이 되는지 확인