web-dev-qa-db-ja.com

AWS route53ドメイン名をK8s LoadBalancer Serviceに接続します

私がやろうとしていること
DNSアドレスにマッピングされた単一のAPIゲートウェイサービスを使用してKubernetes環境を作成します。

私がやったこと:
1)AWS Route53サービスに行き、サブドメインを作成しました。
2)そのサブドメインには静的IPがあるようです。ドメイン名をpingしてこのIPを取得しました。
3) AWSにkopsを使用したKubernetesクラスター を設定しました。
4)エンドポイントのエンドポイントがk8sインフラストラクチャ内のマイクロサービスにヒットするゲートウェイサービスがあります。
このサービスのタイプはLoadBalancerで、loadBalancerIPは上記の静的IPと同じです。

問題:
上記の設定では、サービスはFailed to ensure load balancer for service default/gateway-service: LoadBalancerIP cannot be specified for AWS ELBで作成できません。

それで、私は K8s IngressAlso )と Nginxリバースプロキシサービス についてかなり良いリソースのように見えるものを読んでいきます。 ( そしてこれは最後に )( これも )。

私のエラー 以前にも尋ねられたことがあります と答えは、私のAPIゲートウェイと外部の世界の間に別のレイヤーを置くようです。
それからNginx Ingressコントローラについてたくさん読んだ後、私は本当に混乱しています。

私の質問
a)互換性とは別に、ゲートウェイと外界の間に別の層を設ける大きな理由はありますか?
b)私が試したものはGoogle Cloud Platformで機能しますか(これはAWSデプロイメント固有の問題ですか)
c)Nginx ingress controller... NginxリバースプロキシとKubernetes Ingressサービスの違いは何ですか?私にとって言葉はここでは同じ意味で使われているようです。
d)これを行うには非常に多くの方法があるようですが、現在最良の(そして最も簡単な)方法は何ですか?

編集:

ジョナの回答のオプション1を実装しました。誰かが何かをコピーして貼り付けたい場合の設定は次のとおりです。

gateway-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: gateway-service
spec:
  ports:
    - name: "gateway"
      port: 80
      targetPort: 5000
  selector:
    app: "gateway"
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: "gateway"
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: "gateway"
    spec:
      containers:
        - image: <account_nr>.dkr.ecr.us-east-1.amazonaws.com/gateway
          imagePullPolicy: Always
          name: "gateway"
          ports:
            - containerPort: 5000
              protocol: "TCP"

次に、AWS Route53にサブドメインを作成します:

1)ドメインを作成する
2)New Record Set
3)タイプA(IPv 4)
4)エイリアスyes
5)サービスの外部エンドポイントと一致するエイリアスターゲットを選択します。 (kubectl describe services gateway-service | grep LoadBalancer

6
Roman

インフラストラクチャの自動化には、5つの異なる部分があります。

  • ノード割り当てへのIP
  • dNS名からIPへのマッピング
  • メンバーマッピングへのロードバランシング
  • kubernetesサービスのIPからポッドメンバーへのマッピング、場合によってはロードバランサー
  • kubernetes Ingress

それらのいくつかは他のいくつかを運転することができます。それらはすべて一緒にうまくいくとは限らず、お互いに競争することができます。

私は実際にはAmazonのkubernetesランタイムを確認していませんが、それ以外に、やりたいことを簡単にするために、少なくとも3つのオプションを知っています。

  • kubernetesから始めて、サービスtype = LoadBalancerを作成してELBを作成します。これにより、route53でCNAMEレコードを作成してサブドメインをマッピングできる一意のドメイン名が得られます。 ELBメンバーシップは、ポッドIPでサービスを更新するのと同様の自動化を使用して更新されます。レイヤ4とレイヤ7のリクエストバランシングにはいくつかの制限があります。
  • eLBから開始し、EL8のメンバーとしてk8s EC2ノードを追加し、デーモンセットとして入力を実行します。これには多くのバリエーションがありますが、これは、ELBのメンバーシップが正しいことを確認する責任が、自動または手動に関係なく、EC2のk8の管理に関連付けられていることを意味します。ただし、これにより、レイヤー7トラフィックルーティングを制御する他のポイントが提供されます。
  • kubernetesから開始して、route53-mapperと呼ばれるツールを使用して、サービスリソースのアノテーションからroute53構成を駆動します。

https://github.com/kubernetes/kops/tree/master/addons/route53-mapper

これはTLSを含む最初のバージョンのシンプルなバージョンですが、証明書をサービスのアノテーションではなく、秘密に保持する必要があるため、TLSに使用するのは少しおかしいようです。

反応:

互換性とは別に、ゲートウェイと外界の間に別の層を設ける大きな理由はありますか?

要件はありません。このアプローチは、ELBとk8の両方がオートメーションを所有することで解決します。一般に、競合するオートメーションの所有者は必要ありません。

Google Cloud Platformで何を試しましたか(これはAWSデプロイメント固有の問題ですか)

gcloud自動化は異なり、ロードバランサーにはIPを割り当てることができます。これは、IP割り当てを個別に管理しているためです。したがって、これはAWS固有の問題です。

Nginx ingress controller ... NginxリバースプロキシとKubernetes Ingressサービスの違いは何ですか?私にとって言葉はここでは同じ意味で使われているようです。

それらは交換可能です。 1つは抽象化で、もう1つは具象です。

Kubernetes Ingressは、さまざまな方法で実装できる抽象化です。 Ingressは、Ingressリソース、コントローラー、構成を行うプロキシで構成されます。コントローラは、クラスタで入力リソースの変更を監視し、それらをプロキシ固有の構成に変換してから、プロキシをリロードします。

Nginxイングレスコントローラーは、nginxを使用したこの機構の実装です。他にも、haproxyやその他のプロキシを使用するものがたくさんあります。

これを行うには非常に多くの方法があるようですが、現在の最善の(そして最も簡単な)方法は何ですか?

上記を参照。おそらく他の方法もあるでしょう。

9
Jonah Benton