Blog

[EKS] istio + NLB 삽질기

istio + NLB 삽질기

회사에서 Kubernetes 를 적용하기로 결정했고, 모든 인프라를 AWS 위에서 구축하기 위해 EKS 를 사용하기로 했다.
EKS 를 적용하면서 istioNLB 를 적용하는데 어려워서 헤맸던 내용을 대략적으로만 정리한다.
istio, NLB 에 대한 상세한 내용은 다른 포스트에서 정리할 예정이므로 여기서는 가장 삽질 했던 부분만 다룰 예정이다.

EKS 에서 ELB 를 사용하는 방법

CLB, NLB 를 사용하여 서비스 노출

EKS 에서는 ELB 를 사용하려면 ServiceLoadBalancer 로 지정하면 된다.
apiVersion: v1 kind: Service metadata: name: sample-svc spec: selector: app: sample ports: - port: 8080 targetPort: 8080 type: LoadBalancer
YAML
이렇게 간단하게 설정하면 자동으로 CLB 가 생성된다.
하지만, 원했던건 CLB 가 아닌 NLB 이기 때문에 설정을 조금 수정했다
apiVersion: v1 kind: Service metadata: name: sample-svc annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb spec: selector: app: sample ports: - port: 8080 targetPort: 8080 type: LoadBalancer
YAML
Serviceannotation 을 추가하면 NLB 가 Instance Target 으로 자동으로 생성된다.

ALB 를 사용하여 서비스 노출

CLBNLB 는 별다른 설정 없이 가능했지만 ALB 는 aws-load-balancer-controller (구 AWS ALB Ingress Controller) 를 사용해야 한다.
apiVersion: v1 kind: Service metadata: name: sample-svc spec: selector: app: sample ports: - port: 8080 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: sample-ing annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing spec: rules: - http: paths: /* backend: serviceName: service-svc servicePort: 80
YAML

NLB 와 istio 를 적용하는 방법

AWS ALB Ingress ControllerAWS Load Balancer Controller 로 변경되면서 nlb-ip 모드를 지원하기 시작했다.
Target Group 에 모든 노드를 넣는것보다는 Ingress Gateway IP 만 대상 그룹에 적용되어 있는게 더 효율적이지 않을까 라는 생각이 들어서 적용했다.
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istiocontrolplane namespace: istio-system spec: profile: default components: ingressGateways: - name: istio-ingressgateway enabled: true - name: simple-ingressgateway enabled: true label: service.istio.io/canonical-name: simple-ingressgateway k8s: service: externalTrafficPolicy: Local hpaSpec: minReplicas: 2 maxReplicas: 10 service: ports: - name: http port: 80 targetPort: 8080 - name: https port: 443 targetPort: 8080 - name: helath port: 15020 targetPort: 15020 type: NodePort serviceAnnotations: service.beta.kubernetes.io/aws-load-balancer-type: 'nlb-ip' service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "{REDACTED}" values: sidecarInjectorWebhook: rewriteAppHTTPProbe: true gateways: istio-ingressgateway: type: ClusterIP
YAML
istio-operator.yaml 파일을 정의한 아래의 명령어를 수행하면 istio-ingressgateway 와 simple-ingressgateway 가 생성되면서 nlb-ip 가 생성된다.
$ istioctl install -f istio-operator.yaml
Bash

SOURCE IP

nlb-ip 모드를 사용하게 될 경우 내부 POD 에서는 Source IP 를 얻을 수 없고, POD 의 IP 정보가 넘어온다.
사용자의 IP 를 서비스에서 알아야 할 경우가 생길 수 있는 이런 경우 envoy-filter 만 추가하면 된다
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: proxy-protocol namespace: istio-system spec: workloadSelector: labels: istio: ingressgateway configPatches: - applyTo: LISTENER patch: operation: MERGE value: listener_filters: - name: envoy.filters.listener.proxy_protocol - name: envoy.filters.listener.tls_inspector
YAML

참고