질문) 외부에서 노멀 포트로 load balancer 타입에 접근하는 방법

알파로그·2023년 7월 23일
0

Error

목록 보기
33/37

✏️ 문제점

📍 목표

  • 외부의 요청을 istio 의 ingress gateway 가 받아서 cluster ip 로 띄운 service 로 라우팅 시키는 것이 목표입니다.

📍 metallb 도입

  • 하지만 외부에서 service 로 요청을 라우팅 시키기 위해선 ingress gateway 의 80 포트에 매핑된 포트를 사용해야만 했습니다.
    • 이 포트는 랜덤으로 부여되고, 변동이될 수 있기 때문에 클라이언트 입장에서 사용하기 좋지 않다고 생각 했습니다.
  • 매핑되는 포트를 사용하지 않고 노멀한 80 포트를 사용하기 위해서 metallb 를 도입했습니다.

📍 문제 해결 실패

  • 하지만 아직도 외부에서 ingress gateway 로 접근하기 위해선 매핑된 포트를 사용해야만 했습니다.
  • 아래 설정은 Cluster 의 세팅 상태입니다.
    • 아래 정보외에 다른 부분이 궁금하시다면 최대한 빠르게 답변하겠습니다.
    • 질문 외의 피드백도 환영입니다!

✏️ 서버 정보

📍 인프라 구조

📍 GCP 방화벽 현황

  • 비용 문제 때문에 GCP 의 VM 인스턴스를 사용중입니다.


✏️ Cluster Service 목록

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE     SELECTOR
bk-gateway   ClusterIP   10.99.188.1      <none>        9000/TCP   6h14m   app=gateway
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP    8d      <none>
member       ClusterIP   10.110.39.177    <none>        8081/TCP   25h     app=member
rule         ClusterIP   10.101.19.22     <none>        8083/TCP   27h     app=rule
solved       ClusterIP   10.105.158.104   <none>        8084/TCP   27h     app=solved
study        ClusterIP   10.104.234.199   <none>        8082/TCP   3h1m    app=study

✏️ Metallb

1. pool.yaml

💡세팅에선 address 를 내부 접속용 ip 로 설정했지만,
사용중인 서버의 public ip 를 열어도 되는건가요??

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: metallb-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.0.240-192.168.0.250

2. l2.yaml

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: metallb-l2
  namespace: metallb-system

3. metallb pod 목록

  • 총 4개의 node 사용중 입니다.
NAME                         READY   STATUS    RESTARTS   AGE
controller-8d9cf599f-fzdzn   1/1     Running   0          3h2m
speaker-72h7s                1/1     Running   0          3h2m
speaker-7frpz                1/1     Running   0          3h2m
speaker-8w7ck                1/1     Running   0          3h2m
speaker-f6zcv                1/1     Running   0          3h2m

✏️ Istio

1. service 목록

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                      AGE   SELECTOR
istio-egressgateway    ClusterIP      10.108.235.119   <none>         80/TCP,443/TCP                               14h   app=istio-egressgateway,istio=egressgateway
istio-ingressgateway   LoadBalancer   10.105.48.61     192.168.0.240  15021:30498/TCP,80:32436/TCP,443:30896/TCP   14h   app=istio-ingressgateway,istio=ingressgateway
istiod                 ClusterIP      10.108.230.28    <none>         15010/TCP,15012/TCP,443/TCP,15014/TCP        14h   app=istiod,istio=pilot

2. ingress gateway 의 라우팅 현황

NAME          VHOST NAME     DOMAINS     MATCH                  VIRTUAL SERVICE
http.8080     *:80           *           /*                     vs-gateway.default
              backend        *           /stats/prometheus*     
              backend        *           /healthz/ready*

3. gateway 설정

apiVersion: v1
items:
- apiVersion: networking.istio.io/v1beta1
  kind: Gateway
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"gt-gateway","namespace":"default"},"spec":{"selector":{"istio":"istio-ingressgateway"},"servers":[{"hosts":["*"],"port":{"name":"http","number":80,"protocol":"HTTP"}}]}}
    creationTimestamp: "2023-07-23T09:40:36Z"
    generation: 4
    name: gt-gateway
    namespace: default
    resourceVersion: "1785051"
    uid: 9f820efd-75ee-4e46-93a1-ad058af029af
  spec:
    selector:
      istio: ingressgateway
    servers:
    - hosts:
      - '*'
      port:
        name: http
        number: 80
        protocol: HTTP
kind: List
metadata:
  resourceVersion: ""

4. virtual service 설정

apiVersion: v1
items:
- apiVersion: networking.istio.io/v1beta1
  kind: VirtualService
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"vs-gateway","namespace":"default"},"spec":{"gateways":["gt-gateway"],"hosts":["*"],"http":[{"match":[{"uri":{"prefix":"/"}}],"route":[{"destination":{"host":"bk-gateway.default.svc.cluster.local","port":{"number":9000}}}]}]}}
    creationTimestamp: "2023-07-23T09:41:03Z"
    generation: 1
    name: vs-gateway
    namespace: default
    resourceVersion: "1784045"
    uid: 841c4eee-6699-4986-b4f7-2da154367755
  spec:
    gateways:
    - gt-gateway
    hosts:
    - '*'
    http:
    - match:
      - uri:
          prefix: /
      route:
      - destination:
          host: bk-gateway.default.svc.cluster.local
          port:
            number: 9000
kind: List
metadata:
  resourceVersion: ""

5. ingress gateway 설정

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"istio-ingressgateway","install.operator.istio.io/owning-resource":"istiocontrolplane","install.operator.istio.io/owning-resource-namespace":"istio-system","istio":"ingressgateway","istio.io/rev":"default","operator.istio.io/component":"IngressGateways","operator.istio.io/managed":"Reconcile","operator.istio.io/version":"1.18.1","release":"istio"},"name":"istio-ingressgateway","namespace":"istio-system"},"spec":{"ports":[{"name":"status-port","port":15021,"protocol":"TCP","targetPort":15021},{"name":"http2","port":80,"protocol":"TCP","targetPort":8080},{"name":"https","port":443,"protocol":"TCP","targetPort":8443}],"selector":{"app":"istio-ingressgateway","istio":"ingressgateway"},"type":"LoadBalancer"}}
  creationTimestamp: "2023-07-23T00:24:49Z"
  labels:
    app: istio-ingressgateway
    install.operator.istio.io/owning-resource: istiocontrolplane
    install.operator.istio.io/owning-resource-namespace: istio-system
    istio: ingressgateway
    istio.io/rev: default
    operator.istio.io/component: IngressGateways
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: 1.18.1
    release: istio
  name: istio-ingressgateway
  namespace: istio-system
  resourceVersion: "1838060"
  uid: 9861af91-52eb-4291-a122-4eb6c7e5ebb4
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.105.48.61
  clusterIPs:
  - 10.105.48.61
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  loadBalancerIP: 34.64.37.204
  ports:
  - name: status-port
    nodePort: 30498
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    nodePort: 32436
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    nodePort: 30896
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 34.64.37.204
profile
잘못된 내용 PR 환영

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

많은 도움이 되었습니다, 감사합니다.

답글 달기