istio + NLB 삽질기
회사에서 Kubernetes 를 적용하기로 결정했고, 모든 인프라를 AWS 위에서 구축하기 위해 EKS 를 사용하기로 했다.
EKS 를 적용하면서 istio 와 NLB 를 적용하는데 어려워서 헤맸던 내용을 대략적으로만 정리한다.
istio, NLB 에 대한 상세한 내용은 다른 포스트에서 정리할 예정이므로 여기서는 가장 삽질 했던 부분만 다룰 예정이다.
EKS 에서 ELB 를 사용하는 방법
CLB, NLB 를 사용하여 서비스 노출
EKS 에서는 ELB 를 사용하려면 Service 를 LoadBalancer 로 지정하면 된다.
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
복사
Service 에 annotation 을 추가하면 NLB 가 Instance Target 으로 자동으로 생성된다.
ALB 를 사용하여 서비스 노출
CLB 와 NLB 는 별다른 설정 없이 가능했지만 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 Controller 가 AWS 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
복사