티스토리 뷰
istio gateway는 클러스터 외부에서 발생하는 트래픽으로부터 클러스터에 대한 액세스를 보호하고 제어하는 역할을 합니다. 또한 istio gateway는 로드 밸런싱 및 가상 호스트 라우팅의 역할을 담당합니다.
아래 그림처럼 client 1이 svc-a.foo.com으로 외부에서 요청이 들어오면 맨 먼저 istio gateway에 도달하게 되고 미리 정의해둔 gateway에 svc-A -> 1.1.1.1/2.2.2.2 처럼 hostname과 path의 규칙을 따라 svc-A로 트래픽을 전달하게 됩니다. 제가 생각하는 흐름은 간단하게 client -> istio-ingressgateway -> gateway -> virtual service -> svc -> pod
처음 istio를 설치하면 istio-system namespace에서 kubernetes pod를 보게되면 istio-ingressgateway가 보입니다. READY 열에서 1/1가 정상적인 상태이며 일부는 service proxy(envoy)가 함께 주입되어 있는것을 확인할 수 있습니다. istio-egressgateway는 클러스터 외부로 트래픽을 라우팅하는 역할을 합니다.
-bash-4.2$ kc get -n istio-system pod
NAME READY STATUS RESTARTS AGE
istio-egressgateway-7c8c5cbcc4-h7ph9 1/1 Running 7 45d
istio-ingressgateway-f8c8cb86c-5mlqm 1/1 Running 11 52d
istiod-765bb7b9f5-tmkw5 1/1 Running 25 88d
jaeger-5c7675974-4bs8q 1/1 Running 75 88d
kiali-5b64c5f549-h6drj 1/1 Running 19 45d
prometheus-7d76687994-4bpld 2/2 Running 53 88d
kiali dashboard를 예시로 한번 보면 아래 처럼 gateway를 정의할수있습니다. kiali-gateway 이름을 가지면서 istio-system namespace에 생성되게 정의하고 spec.selector에 "istio: ingressgateway" 를 설정하면서 istio-ingressgateway에 적용합니다. 또한 port 및 hosts를 80과 kiali.hskimdemo.test.com으로 지정합니다.
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: kiali-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http-kiali
protocol: HTTP
hosts:
- "kiali.hskimdemo.test.com"
위에 처럼 gateway를 지정해놓았으면 해당 트래픽을 받을 virtualservice를 아레와 같이 정의합니다. virtualservice에 위에서 정의한 gateway의 name인 kiali-gateway를 정의하고 kiali svc로 트래픽을 보내게 됩니다.
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: kiali-vs
namespace: istio-system
spec:
hosts:
- "kiali.hskimdemo.test.com"
gateways:
- kiali-gateway
http:
- route:
- destination:
host: kiali
port:
number: 20001
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: kiali
namespace: istio-system
spec:
host: kiali
trafficPolicy:
tls:
mode: DISABLE
아래서보면 클러스터 외부의 클라이언트가 요청을 보내면 istio ingressgateway를 통해 service mesh cluster 내부로의 트래픽 흐름도를 보여줍니다. 그림을 보면 istio gateway에 configuers edge gateway가 있는걸 볼 수 있는데요, gateway를 정의하면서 selector에 istio: ingressgateway를 추가해주시면 됩니다.
이제 gateway에 tls를 적용해 외부에서 들어올때 HTTS로 트래픽이 들어올 수 있게 구성해보겠습니다. 일단 위의 kiali dashboard를 기준으로 kiali.hskimdemo.test.com 도메인의 인증서를 준비합니다.
cert1.pem chain1.pem fullchain1.pem privkey1.pem
istio-system secret를 위의 준비한 인증서 pem를 가지고 생성해줍니다. 아래와같이 istio-ingressgateway-certs / istio-ca-secret를 만들어줍니다.
kc create -n istio-system secret tls istio-ingressgateway-certs --key=privkey1.pem --cert=fullchain1.pem
kc create -n istio-system secret tls istio-ca-secret --key=privkey1.pem --cert=fullchain1.pem
그렇다면 아래처럼 secret이 정상적으로 만들어집니다.
-bash-4.2$ kc get -n istio-system secret
NAME TYPE DATA AGE
default-token-9p6sh kubernetes.io/service-account-token 3 91d
istio-ca-secret kubernetes.io/tls 2 2d5h
istio-ingressgateway-certs kubernetes.io/tls 2 2d5h
위에서 만든 secret은 istio-ingressgateway pod로 아래처럼 들어가서 확인해보면 위에서 만든 secret이 해당 경로에 정상적으로 등록되어 있는걸 확인할 수 있습니다.
-bash-4.2$ kc exec -it -n istio-system istio-ingressgateway-f8c8cb86c-5mlqm -- bash
istio-proxy@istio-ingressgateway-f8c8cb86c-5mlqm:/$
istio-proxy@istio-ingressgateway-f8c8cb86c-5mlqm:/$ cd /etc/istio
istio-proxy@istio-ingressgateway-f8c8cb86c-5mlqm:/etc/istio$ cd ingressgateway-certs/
istio-proxy@istio-ingressgateway-f8c8cb86c-5mlqm:/etc/istio/ingressgateway-certs$ ls
tls.crt tls.key
이제 gateway쪽에 아래처럼 tls 설정을 추가해줍니다. 80포트로 들어오면 HTTPS로 갈수있도록 httpRedirect true를 적용해주고 443포트로 들어왔을때 tls를 적용하는 설정을 추가해줍니다. 위에서 istio-system에 istio-ingressgateway에 tls를 적용했으므로 아래처럼 적용해 줍니다.
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: kiali-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http-kiali
protocol: HTTP
hosts:
- "kiali.hskimdemo.test.com"
tls:
httpsRedirect: true
- port:
number: 443
name: https-kiali
protocol: HTTPS
tls:
mode: SIMPLE
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
privateKey: /etc/istio/ingressgateway-certs/tls.key
hosts:
- "kiali.hskimdemo.test.com"
'DevOps > kubernetes' 카테고리의 다른 글
kubernetes 배포 (배포전략) / Rolling Blue-Green Canary (0) | 2022.10.29 |
---|---|
Kubernetes Pod 고급 스케줄링 총정리 (0) | 2022.10.28 |
Kubernetes & Gitlab Runner 연동 (.gitlab-ci.yml 스크립트) (3) | 2021.05.24 |
Kubernetes Service Mesh (istio / kiali / jaeger) (0) | 2021.05.10 |
kubernetes Taint & Toleration (0) | 2021.04.08 |