次のポッドhello-abc
とhello-def
があります。
そして、hello-abc
からhello-def
にデータを送信したいと思います。
ポッドhello-abc
はどのようにしてhello-def
のIPアドレスを知るのでしょうか?
そして、私はこれをプログラムでやりたいと思っています。
hello-abc
がhello-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
まえがき
各デプロイにルーティングするサービスを定義したため、サービスとデプロイの両方を同じ名前空間にデプロイした場合、多くの最新の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
ここで指定されているように、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を見つけることができます。文書化されているように ここ 。