osm-edge 서비스 메시와 함께 FSM 인그레스 컨트롤러 사용

배경



Kubernetes Ingress API는 Ingress 구현이 운영 직원이 관리하는 엔트리 기능 인프라를 제공하는 분리된 관심사로 설계되었습니다. 또한 애플리케이션 소유자가 규칙을 통해 백엔드로의 요청 라우팅을 제어할 수 있습니다.

osm-edge은 수신 트래픽을 관리하기 위해 여러 수신 구현을 지원하고 IngressBackend API를 제공하여 신뢰할 수 있는 수신 지점에서 액세스를 수신하도록 백엔드 서비스를 구성합니다. 이 문서는 수신 트래픽을 관리하기 위해 osm-edge와 FSM의 통합에 중점을 둡니다.



FSM 소개



FSM은 Kubernetes 남북 트래픽, 게이트웨이 API 컨트롤러 및 다중 클러스터 관리를 위한 Flomesh의 또 다른 오픈 소스 제품입니다. FSM은 코어에서 프로그래밍 가능한 프록시인 Pipy을 사용하고 수신 컨트롤러, 게이트웨이 API 컨트롤러, 로드 밸런서, 클러스터 간 서비스 등록 검색 등을 제공합니다.

FSM과 통합



FSM은 이미 osm-edge 내부에 통합되어 있으며 osm-edge 설치 중에 활성화할 수 있습니다. 또한 기존 osm-edge 메쉬에 대해 helm을 통해 독립적으로 설치할 수도 있습니다.

전제 조건


  • Kubernetes 클러스터, 버전 1.19.0 이상
  • FSM의 독립 실행형 설치용 Helm 3 CLI

  • 다음 위치에서 osm-edge CLI를 다운로드합니다.

    system=$(uname -s | tr [:upper:] [:lower:])
    arch=$(dpkg --print-architecture)
    release=v1.1.1
    curl -L https://github.com/flomesh-io/osm-edge/releases/download/${release}/osm-edge-${release}-${system}-${arch}.tar.gz | tar -vxzf -
    . /${system}-${arch}/osm version
    cp . /${system}-${arch}/osm /usr/local/bin/
    


    통합 설치




    export osm_namespace=osm-system 
    export osm_mesh_name=osm 
    
    osm install --set fsm.enabled=true \
        --mesh-name "$osm_mesh_name" \
        --osm-namespace "$osm_namespace" 
    


    독립형 설치



    FSM을 활성화하지 않고 osm-edge를 설치한 경우 독립 실행형 설치를 사용하여 설치할 수 있습니다.

    helm repo add fsm https://charts.flomesh.io
    
    export fsm_namespace=osm-system 
    helm install fsm fsm/fsm --namespace "$fsm_namespace" --create-namespace
    


    모든 팟(Pod)이 제대로 작동하고 실행 중인지 확인하십시오.

    kubectl get pods -n osm-system
    NAME READY STATUS RESTARTS AGE
    repo-8756f76fb-2f78g 1/1 Running 0 5m53s
    manager-866585bbd5-pbg7q 1/1 Running 0 5m53s
    osm-bootstrap-7c6689ff57-47ksk 1/1 Running 0 5m53s
    osm-controller-57888cfc7c-tnqxl 2/2 Running 0 5m52s
    osm-injector-5f77898899-45f65 1/1 Running 0 5m53s
    bootstrap-fd5894bcc-nr7hf 1/1 Running 0 5m53s
    cluster-connector-local-68c7584c8b-qf7xm 1/1 Running 0 2m43s
    ingress-pipy-6fb8c8b794-pgthl 1/1 Running 0 5m53s
    


    구성



    백엔드 트래픽에 대한 액세스를 제한하여 클라이언트에 권한을 부여하기 위해 IngressBackend 엔드포인트의 수신 트래픽만 백엔드 서비스로 라우팅될 수 있도록 ingress-pipy-controller를 구성합니다. ingress-pipy-controller 엔드포인트를 검색하려면 osm-edge controller 및 이를 모니터링할 해당 네임스페이스가 필요합니다. 그러나 FSM이 제대로 작동하는지 확인하기 위해 사이드카로 주입할 수 없습니다.

    kubectl label namespace "$osm_namespace" openservicemesh.io/monitored-by="$osm_mesh_name"
    


    나중에 백엔드 애플리케이션에 대한 액세스를 테스트하는 데 사용할 항목 게이트웨이의 외부 IP 주소와 포트를 저장합니다.

    export ingress_host="$(kubectl -n "$osm_namespace" get service ingress-pipy-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}') "
    export ingress_port="$(kubectl -n "$osm_namespace" get service ingress-pipy-controller -o jsonpath='{.spec.ports[? (@.name=="http")].port}')"
    echo $ingress_host:$ingress_port
    


    샘플 서비스 배포



    다음 단계는 샘플httpbin 서비스를 배포하는 것입니다.

    ## Create namespace kubectl create ns httpbin
    kubectl create ns httpbin
    
    # Add the namespace to the grid
    osm namespace add httpbin
    
    # Deploy the application
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
      namespace: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      namespace: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 14001
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      namespace: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
        spec:
          serviceAccountName: httpbin
          containers:
          - image: kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            command: ["gunicorn", "-b", "0.0.0.0:14001", "httpbin:app", "-k", "gevent"]
            ports:
            - containerPort: 14001
    EOF
    


    팟(Pod)과 서비스가 작성되었고 애플리케이션이 성공적으로 실행 중인지 확인하십시오.

    kubectl get pods,services -n httpbin
    NAME READY STATUS RESTARTS AGE
    pod/httpbin-54cc8cf5d-7vclc 2/2 Running 0 14s
    
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    service/httpbin ClusterIP 10.43.105.166 <none> 14001/TCP 14s
    


    입력 규칙 구성



    다음으로 클러스터 외부에서 배포된httpbin 서비스에 액세스하고 수신 구성 규칙을 제공해야 합니다.

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: httpbin
      namespace: httpbin
      annotations:
        pipy.ingress.kubernetes.io/rewrite-target-from: /httpbin
        pipy.ingress.kubernetes.io/rewrite-target-to: /httpbin
    spec:
      ingressClassName: pipy
      rules:
      - host: httpbin.org
        http:
          paths:
          - path: /httpbin
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 14001
    EOF
    


    위에 기록된 IP 주소와 포트를 사용하여 httpbin 서비스에 액세스하면 다음과 같은 502 Bad Gateway 오류 응답이 발생합니다. 이는 FSM의 인그레스를 신뢰할 수 있는 포털로 설정하지 않았기 때문입니다.

    curl -sI http://"$ingress_host":"$ingress_port"/httpbin/get -H "Host: httpbin.org"
    HTTP/1.1 502 Bad Gateway
    content-length: 0
    connection: keep-alive
    


    다음 명령을 실행하여 FSM 수신을 신뢰할 수 있는 항목으로 설정합니다.

    kubectl apply -f - <<EOF
    kind: IngressBackend
    apiVersion: policy.openservicemesh.io/v1alpha1
    metadata:
      name: httpbin
      namespace: httpbin
    spec:
      backends:
      - name: httpbin
        port:
          number: 14001 # targetPort of httpbin service
          protocol: http
      sources:
      - kind: Service
        namespace: "$osm_namespace"
        name: ingress-pipy-controller
    EOF
    

    httpbin 서비스를 다시 요청하면 성공적으로 액세스할 수 있습니다.

    curl -sI http://"$ingress_host":"$ingress_port"/httpbin/get -H "Host: httpbin.org"
    HTTP/1.1 200 OK
    server: gunicorn/19.9.0
    date: Thu, 18 Aug 2022 05:18:50 GMT
    content-type: application/json
    content-length: 241
    access-control-allow-origin: *
    access-control-allow-credentials: true
    osm-stats-namespace: httpbin
    osm-stats-kind: Deployment
    osm-stats-name: httpbin
    osm-stats-pod: httpbin-54cc8cf5d-7vclc
    connection: keep-alive
    


    요약



    FSM Ingress는 포털 트래픽을 쉽게 관리할 수 있도록 Kubernetes 클러스터 내에서 애플리케이션 액세스 지점을 노출합니다. osm-edge의 IngressBackend API는 메시 내의 서비스를 대중에게 노출하여 우발적인 데이터 유출에 대한 추가 방어선을 제공합니다.

    좋은 웹페이지 즐겨찾기