Istio λ νν K8S ν΄λ¬μ€ν° λ΄μμ μλΉμ€ λ©μ μν μ ν΄μ€λλ€. μλΉμ€ λ©μ λΏλ§ μλλΌ Nginx Ingress, ELB Ingress μ²λΌ Ingress μν λν ν΄μ€λλ€.
Istio Ingress Gateway κ° μ μ λͺ μΉμ΄λ μ½κ² Istio Ingress λ‘ μ§μΉνλλ‘ νμ£ π€
EKS μ κ°μ νΌλΈλ¦ ν΄λΌμ°λλ₯Ό μ΄μ©ν΄μ Load Balancer Service λ₯Ό μμ±ν΄μ£Όλ©΄ μλμΌλ‘ CLB κ° ν λΉλ©λλ€. λ°λΌμ Istio Ingress λν CLB λ‘ ν λΉμ΄ λ©λλ€.
CLB λ μμΌλ‘ AWS μμ deprecated λκΈ° λλ¬Έμ Network Load Balancer(μ΄ν NLB) λ Application Load Balancer(μ΄ν ALB) λ‘ λ체λμ΄μΌ ν©λλ€.
κ·Έλμ μ΄λ² κΈμμλ Istio κ° CLB κ° μλ Elastic Load Balancer(μ΄ν ELB) μ€ νλμΈ ALB λ₯Ό μ¬μ©ν μ μλλ‘ νκ² μ΅λλ€.
Istio λ λκΉ?
λ€μ΄κ°κΈ° μμ Istio μ λν΄ μμλ³΄μ£ .
Istio λ AWS App Mesh μ κ°μ μλΉμ€ λ©μλ₯Ό μ 곡ν μ μλλ‘ λμμ€λλ€.
Istio λ μ¬μ€ Envoy λΌλ μλΉμ€λ₯Ό μΏ λ²λ€ν°μ€ νκ²½μμ μ¬μ©μλ€μ΄ μ‘°κΈ λ μ½κ² Envoy λ₯Ό μ¬μ©ν μ μλλ‘ ν΄μ£Όλ CNCF μ‘Έμ
μνμ
λλ€.
μ¦, Envoy == Istio μ λλ€. λ€λ§ Envoy λ C++ λ‘ λμ΄μκ³ , λ§€μ° μ μμ€μ ν΄μ΄λΌμ μ§μ μ₯λ²½μ΄ μ΄λ ΅μ΅λλ€. λ°λΌμ μ΄λ₯Ό μ½κ² ꡬννκ³ μ ν΄μ£Όλ κ²μ΄ λ°λ‘ Istio λΌκ³ μ΄ν΄νλ©΄ λ©λλ€.
100% λ§λ λ§μ μλμ§λ§ Istio λ Envoy μμ μλ μΆμν λ μ΄μ΄λΌκ³ μκ°ν μ μμ΅λλ€. π
λν Istio λ νλ λμμΈ ν¨ν΄ μ€ SideCar Container Pattern μ μ¬μ©ν©λλ€.
νλ μμ SideCar λ‘ Proxy κ° μκΈ°κ² λλ λ° μ΄ Proxy κ° κ³§ Istio μ λλ€. κ·Έλ¦¬κ³ Proxy λ Istiod μ μν΄ κ΄λ¦¬λ©λλ€.
Istio λ₯Ό μ΄μ©νλ©΄ λ€μκ³Ό κ°μ κΈ°λ₯λ€μ μ¬μ©ν μ μμ΅λλ€.
- νλ‘μλ‘λΆν° μ격 μΈ‘μ κ²°κ³Ό μμ§
- νλ‘μλ₯Ό μ΄μ©ν μ μ± μ ꡬν
- μΉ΄λ리μ λ°°ν¬, A/B λ°°ν¬, λ€ν¬ λ°°ν¬ λ± μ¬λ¬κ°μ§ λ°°ν¬ λ°©λ²μ΄ κ°λ₯
- ν μ€νΈ μννΈμ¨μ΄λ₯Ό λΌμ΄λΈ νλ‘λμ νκ²½μ λ°°ν¬ κ°λ₯
- μ΄μΈ κ²°ν© μ£Όμ , μν· λΈλ μ΄νΉ, mTLS λ±μ΄ κ°λ₯
μ΄μΈμλ μ¬λ¬κ°μ§ κΈ°λ₯μ΄ μμ§λ§ μ΄μ λν΄μλ λ€λ₯Έ κΈμμ λ€λ£¨λλ‘ νκ² μ΅λλ€.
Istio λ₯Ό μ€μΉν΄λ³΄μ
MAC m1 κΈ°μ€μ
λλ€ π
- brew λ₯Ό μ΄μ©νμ¬ istioctl μ μ€μΉν©λλ€
$ brew install istioctl
2. νλ‘νμ μ§μ ν΄μ istio λ₯Ό μ€μΉν©λλ€.
Istio λ λ€μν νλ‘νμ μ 곡νλ λ° μ¬κΈ°μ default λ‘ μ€μΉνκ² μ΅λλ€.
$ istioctl install --set profile=default
νλ‘νμ λν μΆκ°μ μΈ μ 보λ₯Ό λ리μλ©΄...
- default μ demo κ° κ°μ₯ λ§μ΄ μ¬μ©λλ νλ‘νμ λλ€. (λλ¨Έμ§ λ±ν..)
- production νκ²½μ΄λΌλ©΄ default κ° κ°μ₯ μ ν©ν©λλ€.
- demo λ mini kube μ κ°μ΄ μΆμ μ΄ λ§μ΄ νμν κ³³μ νμν©λλ€.
3. μ€μΉκ° μλ£λ©λλ€. λͺ λ Ήμ΄λ₯Ό ν΅ν΄ νμΈν΄λ΄ μλ€!!
$ kubectl get all -n istio-system
NAME READY STATUS RESTARTS AGE
pod/istio-ingressgateway 1/1 Running 0 3d4h
pod/istiod 1/1 Running 0 3d4h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-ingressgateway LoadBalancer 172.20.147.69 xxxxx.ap-northeast-2.elb.amazonaws.com 15021:30098/TCP,80:30361/TCP,443:31567/TCP 3d4h
service/istiod ClusterIP 172.20.131.157 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 3d4h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/istio-ingressgateway 1/1 1 1 3d4h
deployment.apps/istiod 1/1 1 1 3d4h
NAME DESIRED CURRENT READY AGE
replicaset.apps/istio-ingressgateway 1 1 1 3d4h
replicaset.apps/istiod 1 1 1 3d4h
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/istio-ingressgateway Deployment/istio-ingressgateway <unknown>/80% 1 5 1 3d4h
horizontalpodautoscaler.autoscaling/istiod Deployment/istiod <unknown>/80% 1 5 1 3d4h
μ±κ³΅μ μΌλ‘ μ€μΉλ₯Ό λ§μ³€μ΅λλ€.
κ°λ¨ν μ§κ³ λμ΄κ°λ³΄μ!
pods λ₯Ό 보면 istio-ingressgateway μ istiod κ° μμ±λ κ±Έ νμΈν μ μλλ°μ, μκΉ νλ‘νμ default λ₯Ό μ£ΌμκΈ° λλ¬Έμ λλ€.
Tip.
νλ‘νμ default λ‘ νλ€κ³ egress λ₯Ό μ€μΉ λͺ»νλ κ²μ μλλλ€.
$ kubectl edit istiooperators.install.istio.io -n istio-system
λͺ λ Ήμ΄λ₯Ό μ¬μ©ν΄ μ€μ μ λ°κΏ μ μμ΅λλ€.
κ·Έλ¦¬κ³ κ°μ₯ μ£Όλͺ©ν κ²μ΄ λ°λ‘ service/istio-ingressgateway μ λλ€. λ€μ EXTERNAL-IP λ₯Ό 보μλ©΄ AWS Domain μ΄ ν λΉλ κ²μ νμΈν μ μλλ° μ΄κ²μ΄ λ°λ‘ CLB μ λλ€.
aws elb describe-load-balancers
μμ±λ LB κ° μΆλ ₯λλ κ²μ νμΈν μ μμ΅λλ€.
μ¬μ€ μ΄λ κ²λ§ ꡬμ±λμ΄λ μΆ©λΆν Ingress μν μ ν μ μμ΅λλ€.
Istio μ CRD μΈ Gateway, VirtualService, DestinationRule λ₯Ό μ΄μ©ν΄μ λ§μ΄μ£ π
νμ§λ§ CLB λ μμμλ λ§μλλ Έλ€μνΌ λ μ΄μ μλΉμ€λμ§ μκΈ° λλ¬Έμ NLB, ALB λ‘ λ°κΎΈμ΄μΌ ν©λλ€.
ALB λ‘ λ°κΎΈμ΄λ³΄μ !
CLB λ‘ ALB λ‘ λ°κΎΈλ κ²μ κ·Έλ¦Όμμ 보μ΄λ κ²μ²λΌ CLB λμ ALB λ‘ κ΅μ²΄νλ©΄ λ©λλ€. νμ§λ§ ALB λ CLB μ λ€λ₯΄κ² AWS Load Balancer Controller λΌλ κ²μ νμλ‘ ν©λλ€.
AWS Load Balancer Controller λ₯Ό μ€μΉνλ κ²λ§μΌλ‘λ λ§μ λΆλμ΄ νμνλ μ¬κΈ°μ λ€λ£¨μ§ μκ² μ΅λλ€. λΆλμ΄ λ§μ λΏ μ¬μ€ AWS 곡μλ¬Έμλ₯Ό 보면 μ½κ² λ°λΌνμ€ μ μμ κ²λλ€.
AWS Load Balancer Controller λ Nginx Ingress Controller μ μμ ν λκ°μ μν μ ν©λλ€. λ€λ§ AWS μμ μ 곡ν΄μ£Όλ κ²μ΄λΌκ³ 보μλ©΄ λ©λλ€.
κ·ΈλΌ AWS LB Controller κ° μ μ€μΉλμλμ§ νμΈν΄λ³΄μ£ ! π
$ kubectl get all -n kube-system
NAME READY STATUS RESTARTS AGE
pod/aws-load-balancer-controller-794f85d67-6jncw 1/1 Running 0 176m
pod/aws-load-balancer-controller-794f85d67-bhlmq 1/1 Running 0 176m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/aws-load-balancer-webhook-service ClusterIP 172.20.82.65 <none> 443/TCP 176m
λ¬Έμ μμ΄ μ μλνλ€μ π
κ·ΈλΌ νλ² μ°κ²°ν΄λ³΄μ£ !
- service/istio-ingressgateway λ₯Ό μμ ν©λλ€.
$ kubectl edit -n istio-system service istio-ingressgateway
μλμ κ°μ΄ μμ ν΄μ€λλ€.
spec:
...
type: NodePort
...
μ΄λ κ² νλ μ΄μ λ CLB λ₯Ό μ¬μ©νμ§ μκΈ° μν΄μμ λλ€. type: Loadbalancer λ‘ λμ΄μμΌλ©΄ μλμΌλ‘ CLB κ° μμ±λκ³ , μ°λ¦¬λ μ΄κ²μ μ¬μ©νμ§ μμ κ±°κΈ° λλ¬Έμ type μ NodePort λ₯Ό λ°κΏμ€λλ€. (μ°Έκ³ )
κ·Έλ¬λ©΄ μ΄μ μ Istio μμ μμ±ν CLB λ μμ λκ³ , ALB λ§ λ¨μμμ΅λλ€.
Tip.
ClusterIP λ‘λ κ°λ₯ν κ±°λΌ μκ°ν΄μ λ°κΏλ΄€λλ°.. μλνμ§ μμμ΅λλ€. μκ°ν΄λ³΄λ©΄ λΉμ°ν©λλ€.
ALB μ μ₯μμ νκ²κ·Έλ£ΉμΌλ‘ κ° μΈμ€ν΄μ€μκ² ν΅μ μ 보λ΄μ£Όκ² λλλ° ALB λ EKS Cluster λ΄μ μ‘΄μ¬νλ κ²μ΄ μλλ λΉμ°ν λ Έλ ν¬νΈλ‘ μ κ·Όμ ν μ λ°μ μμ΅λλ€.
2. Ingress λ₯Ό μμ±ν©λλ€.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: common-external-ingress
namespace: istio-system
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/actions.ssl-redirect: '443'
alb.ingress.kubernetes.io/load-balancer-name: common-external-ingress
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/subnets: subnet-031c06XXXXXXXXXXX, subnet-03444dXXXXXXXXXXX, subnet-0360f0XXXXXXXXXXX
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:123456789011:certificate/26cec536-5d01-4140-890d-XXXXXXXXXXXX
alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:us-west-2:123456789011:regional/webacl/prod-common-alb-acl/ae2e63f9-02f4-44b8-9d25-XXXXXXXXXXXX
labels:
app: common-external-ingress
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: istio-ingressgateway
port:
number: 443
μ΄λ Έν μ΄μ λ€μ΄ λ§μλ° λ§€μ° μ§κ΄μ μ΄λΌ 보μλ©΄ μ΄λ κ²μΈμ§ μ½κ² νμ νμ€ μ μμ΅λλ€.
κ·Έλλ κ·Έ μ€ μ€μν κ²λ€μ λν΄ λ§μλλ¦¬κ² μ΅λλ€.
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/actions.ssl-redirect: '443'
"http, https 리μ€λλ₯Ό μ¬μ©νκ³ , http λ‘ ν΅μ μ΄ μ¨λ€λ©΄ https λ‘ λ¦¬λ€μ΄λ μ νλΌ!"
alb.ingress.kubernetes.io/target-type: instance
"ip mode μ instance κ° μλ λ° instance λ₯Ό μ¬μ©νκ² λ€! μ°Έκ³ "
alb.ingress.kubernetes.io/scheme: internet-facing
"ALB λ₯Ό νΌλΈλ¦μΌλ‘ μ§μ νλΌ! λ§μ½ νλΌμ΄λΉμΌλ‘ νκ³ μΆλ€λ©΄ internal μ μ£Όκ±°λΌ"
μ΄ μ λκ° μμ κ±° κ°κ³ , λ μμΈν μκ³ μΆλ€λ©΄ μ¬κΈ°λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!
μ΄λ‘μ¨ λͺ¨λ μ€μ μ΄ λμ΄ λ¬μ΅λλ€.
λλ΅ μλμ κ°μ΄ λμνλ€κ³ 보μλ©΄ λ κ² κ°μ΅λλ€ π
κΈ΄ κΈ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€ π
'DevOps > Istio' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Istio] μΏ! μ°λ¦¬λ§μ λΉλ°μ΄μΌ - mTLS (κ²μ¦νΈ) (9) | 2023.08.17 |
---|---|
[Istio] μΏ! μ°λ¦¬λ§μ λΉλ°μ΄μΌ - mTLS (νμΈνΈ) (0) | 2023.07.02 |
[Istio] IngressGateway μ TLS λ₯Ό μ μ©ν΄λ³΄μ! (1) | 2023.05.18 |