Kubernetesの侵入で外部リソースを公開する


他の夜、私は私のhomelabの周りを徘徊し、私は正しく私の新しいホームアシスタントのインスタンスをインターネットに公開しなかったことに気づいた.数ヶ月前、家のアシスタント(今のHA)は、その新しい恒久的な家を発見した.我々はロックダウンしているので、私は私のローカルネットワークの外にHAに到達する必要はありませんでした.
私はまだ家から働いています.どの方法がそれを露出するのがベストだったかを選択している間、私はアイデアを持っていました、なぜ私のKubernetesクラスタで侵入を使用しない?
それは少し奇妙に思えるかもしれないが、私の声:
  • 私は既にKaybernetesクラスタを持っており、cert-managerが構成され、
  • に取り組んでいます
  • 私はクラスタにいくつかのサービスを移動する予定です、そして、彼らはどうしてもHAに達する必要があります
  • 私はKubernetesについて私ができるだけ多くを学びたいです、そして、これは良い機会242479182のようでした
    それで、私のゴールを達成するために、私は1つのことを必要とします:どのように、私は外部リソースにKubernetesサービスを指し示すことができますか?
    待って、なぜサービス?あなたは、侵入を前に言及しませんでした?はい、あなたは正しいが、私と一緒に耐える.
    Kubernetesでは、侵入者は受信したすべてのリクエストをリダイレクトするサービスを必要とします.したがって、適切にHAをイングルで公開するには、それを指すサービスを作成する必要があります.
    通常、サービスは、セットのポップスを露出するのに用いられます;このように、異なったアプリケーションが互いに話をする必要があるならば、彼らは彼らのpod名前(いろいろに変わることができました)を使用する必要はありません、しかし、彼らはサービス名を使用することができます.
    サービスを作成するとき、別のリソースが自動的に作成されます.このエンドポイントは、サービスセレクタ仕様で指定したセレクタにマッチするPODの参照(すべてのIPアドレス)を含みます.
    この方法で作成したエンドポイントは、作成したサービスと同じ名前になります.
    しかし、ここでは、我々はセレクタなしでサービスを作成することができますし、我々はそれを行う場合、我々はまた、自分自身をエンドポイントを作成する必要があります、このエンドポイントはKubernetesクラスタの外のIPを指す可能性があります.
    それで、我々がKubernetes侵入を使ってHAを露出させるために我々が作成する必要があるYAMLを見ましょう.
    エンドポイント.気象研
    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
    
    サービス気象研
    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を提供しないように指示します我々はそれを必要としない.このようなサービスもヘッドレスサービスとして知られています.
    インドレス気象研
    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マネージャーがその仕事を終えた後に、これらの3つのファイルのためにkubectl apply -f ...を走らせるならば、我々はKubernetesの外で我々のホームアシスタントインスタンスを指す有効な証明書でドメインで終わります.
    そして、私は私が私のK 8 Sクラスタの中でHAを使用する若干のサービスを動かしたいとあなたに話したのを思い出してください?今、私がしなければならないすべては、それらを展開して、IPアドレスを使用するのではなく、HAのためのURLとしてホームアシスタントを使用することです.
    完了のために、すでにあなたのHAインスタンスのためにローカルドメインがあるならば、あなたはエンドポイントの作成をスキップして、直接Service's externalName propertyを使うことができます.