Kubernetes 수신 리소스는 클러스터 외부에서 클러스터 내부의 하나 이상의 서비스로 HTTP 또는 HTTPS 라우팅을 제공합니다. TKG 클러스터는 Contour와 같은 타사 컨트롤러를 통한 수신을 지원합니다.

이 자습서에서는 외부 트래픽을 TKG 클러스터의 서비스로 라우팅하기 위해 Contour 수신 컨트롤러를 배포하는 방법을 보여줍니다. Contour는 VMware에서 기여하는 오픈 소스 프로젝트입니다.

사전 요구 사항

  • Kubernetes 설명서에서 수신 리소스를 검토합니다.
  • Contour 수신 컨트롤러를 검토합니다.
  • TKG 클러스터를 프로비저닝합니다.
  • TKG 클러스터에 연결합니다.

프로시저

  1. 서비스 계정을 통해 클러스터의 모든 리소스를 관리할 수 있도록 ClusterRoleBinding을 생성합니다.
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding 
    --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    참고: 보안을 강화해야 하는 경우에는 projectcontour 네임스페이스에 RoleBinding을 사용합니다. TKG 서비스 클러스터에 기본 포드 보안 정책 적용의 내용을 참조하십시오.
  2. projectcontour라는 네임스페이스를 생성합니다.
    이것은 Contour 수신 컨트롤러 배포의 기본 네임스페이스입니다.
    kubectl create ns projectcontour
  3. Contour 수신 컨트롤러 YAML Contour 수신 배포를 다운로드합니다.
  4. 텍스트 편집기를 사용하여 contour.yaml 파일을 엽니다.
  5. 다음 두 줄을 주석 처리합니다. 각 줄 앞에 # 기호를 추가하면 됩니다.
    줄 1632:
    # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    
    줄 1634:
    # externalTrafficPolicy: Local
    
  6. contour.yaml 파일을 적용하여 Contour를 배포합니다.
    kubectl apply -f contour.yaml
  7. Contour 수신 컨트롤러 및 엔보이 로드 밸런서 서비스가 배포되었는지 확인합니다.
    kubectl get services -n projectcontour
    NAME      TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    contour   ClusterIP      198.63.146.166   <none>          8001/TCP                     120m
    envoy     LoadBalancer   198.48.52.47     192.168.123.5   80:30501/TCP,443:30173/TCP   120m
  8. Contour 및 엔보이 포드가 실행 중인지 확인합니다.
    kubectl get pods -n projectcontour
    NAME                       READY   STATUS      RESTARTS   AGE
    contour-7966d6cdbf-skqfl   1/1     Running     1          21h
    contour-7966d6cdbf-vc8c7   1/1     Running     1          21h
    contour-certgen-77m2n      0/1     Completed   0          21h
    envoy-fsltp                1/1     Running     0          20h
  9. 외부 IP 주소를 사용하여 로드 밸런서를 Ping합니다.
    ping 192.168.123.5
    PING 192.168.123.5 (192.168.123.5) 56(84) bytes of data.
    64 bytes from 192.168.123.5: icmp_seq=1 ttl=62 time=3.50 ms
    
  10. ingress-nihao.yaml이라는 수신 리소스를 생성합니다.
    YAML을 생성합니다.
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-nihao
    spec:
      rules:
      - http:
          paths:
          - path: /nihao
            backend:
              serviceName: nihao
              servicePort: 80
    
    YAML을 적용합니다.
    kubectl apply -f ingress-nihao.yaml
    수신 리소스가 생성되었는지 확인합니다.
    kubectl get ingress
    엔보이 로드 밸런서의 외부 IP 주소(이 예에서는 192.168.123.5)는 수신 개체에서 사용됩니다.
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       192.168.123.5     80      17s
  11. 백엔드 애플리케이션으로 테스트 서비스를 배포합니다.
    ingress-nihao-test.yaml이라는 다음 YAML 파일을 만듭니다.
    kind: Service
    apiVersion: v1
    metadata:
      name: nihao
    spec:
      selector:
        app: nihao
        tier: backend
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nihao
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nihao
          tier: backend
          track: stable
      template:
        metadata:
          labels:
            app: nihao
            tier: backend
            track: stable
        spec:
          containers:
            - name: nihao
              image: "gcr.io/google-samples/hello-go-gke:1.0"
              ports:
                - name: http
                  containerPort: 80
    
    YAML을 적용합니다.
    kubectl apply -f ingress-nihao-test.yaml
    nihao 서비스가 생성되었는지 확인합니다.
    kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    nihao        ClusterIP   10.14.21.22     <none>        80/TCP     15s
    
    백엔드 배포가 생성되었는지 확인합니다.
    kubectl get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nihao   3/3     3            3           2m25s
    
    백엔드 포드가 존재하는지 확인합니다.
    kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nihao-8646584495-9nm8x   1/1     Running   0          106s
    nihao-8646584495-vscm5   1/1     Running   0          106s
    nihao-8646584495-zcsdq   1/1     Running   0          106s
  12. Contour 수신 컨트롤러에서 사용하는 로드 밸런서의 공용 IP 주소를 가져옵니다.
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       10.19.14.76     80      13m
  13. 브라우저를 사용하여 공용 IP로 이동하고 수신 경로를 포함합니다.
    http://10.19.14.76/nihao
    "hello" 메시지가 반환됩니다.
    {"message":"Hello"}

결과

클러스터 내에서 실행되는 서비스가 앞에 있는 백엔드 앱은 로드 밸런서의 외부 IP 주소를 사용하여 수신 컨트롤러를 통해 외부에서 브라우저로 액세스합니다.