web-dev-qa-db-ja.com

Kubernetesが別のポッドからポッドIPを検索する

次のポッドhello-abchello-defがあります。

そして、hello-abcからhello-defにデータを送信したいと思います。

ポッドhello-abcはどのようにしてhello-defのIPアドレスを知るのでしょうか?

そして、私はこれをプログラムでやりたいと思っています。

hello-abchello-defの場所を見つける最も簡単な方法は何ですか?

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
name: hello-abc-deployment

spec:
replicas: 1

template:
    metadata:
    labels:
        app: hello-abc
    spec:
    containers:
    - name: hello-abc
        image: hello-abc:v0.0.1
        imagePullPolicy: Always
        args: ["/hello-abc"]
        ports:
        - containerPort: 5000

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
name: hello-def-deployment

spec:
replicas: 1

template:
    metadata:
    labels:
        app: hello-def
    spec:
    containers:
    - name: hello-def
        image: hello-def:v0.0.1
        imagePullPolicy: Always
        args: ["/hello-def"]
        ports:
        - containerPort: 5001

---
apiVersion: v1
kind: Service

metadata:
name: hello-abc-service

spec:
ports:
- port: 80
    targetPort: 5000
    protocol: TCP

selector:
    app: hello-abc
type: NodePort

---
apiVersion: v1
kind: Service

metadata:
name: hello-def-service

spec:
ports:
- port: 80
    targetPort: 5001
    protocol: TCP

selector:
    app: hello-def
type: NodePort
6
enerudfwqenq

まえがき

各デプロイにルーティングするサービスを定義したため、サービスとデプロイの両方を同じ名前空間にデプロイした場合、多くの最新のkubernetesクラスターでkube-dnsを利用して、サービスを名前で参照できます。

残念ながら、kube-dnsがクラスターで構成されていない場合(可能性は低いですが)、名前で参照することはできません。

サービスのDNSレコードについて詳しく読むことができます ここ

さらに、Kubernetesは、同じ名前空間にデプロイされている任意のコンテナにサービスのポートとIPを公開する「サービスディスカバリ」を備えています。

ソリューション

つまり、hello-defに到達するには、次のようにすることができます。

curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}

サービスディスカバリに基づく https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

警告:サービスポートが変更された場合、同じ名前空間での変更後に作成されたポッドのみが新しい環境変数を受け取る可能性が非常に高くなります。

外部アクセス

さらに、NodePort機能を使用しているため、NodePortの範囲に外部からアクセスできる限り、外部からこのサービスにアクセスすることもできます。

これには、node-ip:nodePortでサービスにアクセスする必要があります

kubectl describe svc/hello-def-serviceを使用して、サービスにランダムに割り当てられたNodePortを見つけることができます。

イングレス

外部からサービスにアクセスするには、nginx-ingressなどの入力サービスを実装する必要があります

https://github.com/helm/charts/tree/master/stable/nginx-ingresshttps://github.com/kubernetes/ingress-nginx

サイドカー

2つのサービスが緊密に結合されている場合は、KubernetesSidecar機能を使用して両方を同じポッドに含めることができます。この場合、ポッド内の両方のコンテナーは同じ仮想ネットワークアダプターを共有し、localhost:$portを介してアクセスできます。

https://kubernetes.io/docs/concepts/workloads/pods/pod/#uses-of-pods


サービスディスカバリ

ポッドがノードで実行されると、kubeletはアクティブなサービスごとに環境変数のセットを追加します。 Dockerリンク互換変数(makeLinkVariablesを参照)と、サービス名が大文字でダッシュがアンダースコアに変換される単純な{SVCNAME} _SERVICE_Host変数と{SVCNAME} _SERVICE_PORT変数の両方をサポートします。

サービスディスカバリの詳細については、こちらをご覧ください: https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

5
yosefrow

ここで指定されているように、DNSを介してhello-def-serviceのポッドからhello-abcに到達できるはずです: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service /#services

ただし、DNSレコードをクラスターで利用するには、kube-dnsまたはCoreDNSをk8sクラスターで構成/インストールする必要があります。

具体的には、hello-def-serviceと同じ名前空間で実行されているサービスのDNSレコードhttp://hello-def-serviceを介してhello-abc-serviceに到達する必要があります。

また、DNSレコードhello-def-serviceを介して別の名前空間ohter_namespaceで実行されているhello-def-service.other_namespace.svc.cluster.localに到達できるはずです。

何らかの理由で、クラスターにDNSアドオンがインストールされていない場合でも、hello-def-serviceポッドの環境変数を介してhello-abcの仮想IPを見つけることができます。文書化されているように ここ

2
Xiao Liang