web-dev-qa-db-ja.com

K8Sロードバランサを異なるネームスペースでポッドにポッドする方法

Kubernetes ClusterのScalewayでデプロイされている入力ポッドがあり、Kube-Systemネームスペースに存在します。誤ってdefaultネームスペースでロードバランササービスを作成し、kube-systemネームスペースで新しいものを削除して再作成したくないので、defaultネームスペースにロードバランサがエンドポッドとして入力ポッドを持つことができます。

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - port: 443
      targetPort: 443
  type: LoadBalancer

それは可能ですか?セレクタフィールドに追加する必要があるものはありますか?


入力ポッドと通信するkube-systemネームスペースでclusterIPサービスを作成しようとしました。

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
  namespace: kube-system
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - port: 443
      targetPort: 443
  type: ClusterIP

次に、そのサービスをそのようなデフォルトのネームスペースでloadbalancerに参照してみました。

apiVersion: v1
kind: Service
metadata:
  name: ecom-loadbalancer
spec:
  type: ExternalName
  externalName: ecom-loadbalancer.kube-system.svc.cluster.local
  ports:
    - port: 443
      targetPort: 443
  type: LoadBalancer

しかし結果はありません。 clusterIPは入力ポッドを指していますが、ロードバランサはエンドポイントなしで残ります。

3
joe1531

正しく再作成する必要がある理由(2テクニカルとアドバイス):

  1. ExternalName他のネームスペースの外部サービスまたはサービスにアクセスするために使用されます。それが機能する方法は、サービスの名前が発生するときに起こります、CNAMEが返されます。その他の言葉では、要求が他の場所に向けられるべきな場合、それは出力接続のために機能します。

    参照 service - externalname type とユースケース Kubernetesのヒント - Part 1 Blog Post - Alen Komljen .

    あなたのユースケースは異なります。 Kubernetesクラスタの外部からのリクエストを露出させて、ロードバランタを露出し、次にクラスタ内の別のサービスにトラフィックを直接送信します。サービスがLoadBalancerまたはExternalNameのどちらでもかまいませんでした。最後のマニフェストで見ることができます2つ2つ( - === - )タイプがあります。参照 サービスタイプ

  2. 不要な複雑さを避けます。もっと多くのサービスや他の部品があるため、すべてを追跡するのは難しくなります。

  3. ドキュメントに基づいて、一般的にExternalNameを使用して問題があるプロトコルを使用することが可能です。

    警告:HTTPとHTTPSなど、いくつかの一般的なプロトコルのためにexternalnameを使用するのに問題があるかもしれません。 externalNameを使用すると、クラスタ内のクライアントが使用するホスト名は、外部名参照が参照されている名前とは異なります。

    ホスト名を使用するプロトコルの場合、この違いはエラーまたは予期しない応答につながる可能性があります。 HTTPリクエストには、オリジンサーバーが認識していないホスト:ヘッダーがあります。 TLSサーバーは、クライアントが接続しているホスト名と一致する証明書を提供することはできません。

    参照 - 警告

1
moonkotte