Kubernetes Ingress로 외부 리소스 노출

다른 날 밤에 저는 홈랩을 돌아다니다가 새로운 홈 어시스턴트 인스턴스를 인터넷에 올바르게 노출하지 않았다는 것을 알게 되었습니다. 몇 달 전에 홈 어시스턴트(지금부터 HA)는 새로운 영구 집인 Rasperry PI 4 4GB를 찾았습니다. 우리가 잠겨 있기 때문에 로컬 네트워크 외부의 HA에 연결할 필요가 없었습니다.

저는 여전히 재택근무를 하고 있지만(좋아합니다), 이제 이 문제를 해결할 시간입니다. 노출하는 데 가장 적합한 방법을 선택하는 동안 Kubernetes 클러스터에서 Ingress를 사용하지 않는 이유가 무엇인지 생각했습니다.

조금 이상하게 보일 수 있지만 내 말을 들어보십시오.
  • 이미 Kubernetes 클러스터가 있고 cert-manager 구성 및 작동 중입니다
  • .
  • 일부 서비스를 클러스터로 이동할 계획이며 어쨌든 HA에 도달해야 합니다.
  • 쿠버네티스에 대해 최대한 배우고 싶은데 좋은 기회가 될 것 같았습니다

  • 따라서 목표를 달성하려면 한 가지가 필요합니다. Kubernetes 서비스가 외부 리소스를 가리키도록 하려면 어떻게 해야 할까요?

    잠깐, 왜 서비스야? 이전에 Ingress에 대해 언급하지 않았습니까? 네, 맞습니다.

    Kubernetes에서 Ingress는 수신하는 모든 요청을 리디렉션하는 서비스가 필요하므로 Ingress로 HA를 적절하게 노출하려면 이를 가리킬 수 있는 서비스를 만들어야 합니다.

    일반적으로 서비스는 파드 세트를 노출하는 데 사용됩니다. 이런 식으로 서로 다른 애플리케이션이 서로 통신해야 하는 경우 포드 이름(다양하게 변경될 수 있음)을 사용할 필요가 없지만 서비스 이름은 사용할 수 있습니다.

    서비스를 생성할 때 다른 리소스인 엔드포인트가 자동으로 생성됩니다. 이 엔드포인트에는 서비스 선택기 사양에서 지정한 선택기와 일치하는 파드의 참조(모든 IP 주소)가 포함됩니다.

    이러한 방식으로 생성된 엔드포인트는 우리가 생성한 서비스와 동일한 이름을 갖게 됩니다.

    하지만 여기 문제가 있습니다. 선택기 없이 서비스를 생성할 수 있으며 그렇게 하면 엔드포인트도 직접 생성해야 하며 이 엔드포인트는 Kubernetes 클러스터 외부의 IP를 가리킬 수 있습니다.

    Kubernetes Ingress를 사용하여 HA를 노출하기 위해 생성해야 하는 YAML을 살펴보겠습니다.

    끝점.yml

    apiVersion: v1
    kind: Endpoints
    metadata:
      name: home-assistant
    subsets:
    - addresses:
      - ip: 1.1.1.1 # Insert your home-assistant IP here
      ports:
      - name: ha
        port: 8123
        protocol: TCP
    


    서비스.yml

    apiVersion: v1
    kind: Service
    metadata:
      name: home-assistant
    spec:
      ports:
      - name: ha
        port: 80
        protocol: TCP
        targetPort: 8123
      type: ClusterIP
      clusterIP: None
    


    참고: clusterIP 속성을 의도적으로 None로 설정했습니다. 이는 Kubernetes에 이 서비스에 IP를 제공하지 않도록 지시합니다. 우리는 그것을 필요로하지 않습니다. 이와 같은 서비스를 헤드리스 서비스라고도 합니다.

    ingress.yml

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        cert-manager.io/cluster-issuer: "letsencrypt-prod"
      name: home-assistant
    spec:
      rules:
      - host: ha.awesome-domain.com # insert your domain here
        http:
          paths:
          - backend:
              serviceName: home-assistant
              servicePort: ha
            path: /
      tls:
      - hosts:
        - ha.awesome-domain.com # insert your domain here
        secretName: home-assistant-tls
    


    이제 cert-manager가 작업을 마친 후 이 세 파일 모두에 대해 kubectl apply -f ...를 실행하면 Kubernetes 외부의 Home Assistant 인스턴스를 가리키는 유효한 인증서가 있는 도메인으로 끝납니다.

    그리고 k8s 클러스터 내에서 HA를 사용하는 일부 서비스를 이동하고 싶다고 말한 것을 기억하십니까? 이제 IP 주소를 사용하는 대신 배포하고 HA의 URL로 `home-assistant'를 사용하기만 하면 됩니다.

    완료를 위해 이미 HA 인스턴스에 대한 로컬 도메인이 있는 경우 엔드포인트 생성을 건너뛰고 Service's externalName property 직접 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기