티스토리 뷰

DevOps/kubernetes

istio gateway 흐름 / TLS

김한성 2021. 7. 27. 22:32

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

kubernetes manning 책 인용

처음 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를 추가해주시면 됩니다.

 

istio manning 책 인용

이제 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"

 

댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30