web-dev-qa-db-ja.com

Kubernetesのポート名を使用する方法

Kubernetes deploymentでは、次のようにポートを指定します。

 containers:
 - name: nginx
   image: nginx:latest
   ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

これでserviceでそのようにそのポートを参照できます(サービスで外部ポートのみを指定できます):

spec:
  type: ClusterIP
  ports:
  - name: nginx-port
    port: 80
    targetPort: nginx-port
    protocol: TCP

質問ですが、次の構文nginx-service.default.svc.cluster.local:nginx-portを使用して他の場所でサービスとポートを参照できますか?私はこの特別な名前を使用してサービスを参照できることを知っていますが、私はポート番号をnginx-service.default.svc.cluster.local:80のようにハードコーディングしていることに気づきました。

7
soosap

kube-dnsは、すべての通常のDNSサーバーと同じプロトコルを使用するDNSサービスです。この意味で、DNSは「ポート名」を解決するようには設計されていませんが、ドメイン名(IPアドレスにマップされる)を解決するように設計されています。

複数の人が行うことは、あるポートから別のポートにトラフィックをProxyPassするリバースプロキシを用意することです(ただし、HTTP/HTTPSトラフィックについて話している場合) https://serverfault.com/questions/85078/how-to -forward-dns-alias-to-hostnameport またはiptablesルールを使用 https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway -with-iptables 。ただし、これらは、最初に特定のポート(80など)にトラフィックを転送することを前提としています。

あなたがコメントで書いたように、環境変数を使用することはあなたのケースに合うオプションです。

2
Javier Salmeron

いいえ。ポート番号の代わりにポート名を使用することはできません。 ServicePortの名前フィールドの目的は異なります。

ServiceSpec内のすべてのポートには一意の名前が必要です。この名前は、EndpointPortオブジェクトの「名前」フィールドにマップされます。

サービスごとに、1つのエンドポイントオブジェクトが生成されます。そのエンドポイントのすべてのポートは、サービスポートに対応しています。この照合には、ServicePortとEndpointPortの両方の名前フィールドが使用されます。

8