ポッド内のコンテナー内からポッド自身のIPアドレスを知る方法は?


91

Kubernetesは各コンテナーにIPアドレスを割り当てますが、ポッドのコンテナーからIPアドレスを取得するにはどうすればよいですか?ドキュメンテーションからの道を見つけることができませんでした。

編集:KubernetesでAerospikeクラスターを実行します。設定ファイルには独自のIPアドレスが必要です。そして、私はconfdを使用してホスト名を設定しようとしています。環境変数が設定されている場合は、それを使用します。

回答:


166

最も簡単な答えは、ポッドまたはレプリケーションコントローラーのyaml / jsonファイルが、以下で定義されている構成ブロックを追加することにより、ポッドIPを環境変数として追加するようにすることです。(以下のブロックは、名前と名前空間をポッドで利用できるようにします)

env:
- name: MY_POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name
- name: MY_POD_NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace
- name: MY_POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

pod / rcを再作成してから、試してください

echo $MY_POD_IP

実行するenvと、他にkubernetesが提供するものを確認できます。

乾杯


1
私はあなたのソリューションをテストしました、そしてそれは超うまく機能します。printenv | grep '10.254.24.167'ユーザー定義の変数MY_POD_IP以外は何も返さないので、kubernetesにはそのような環境変数がないと100%確信しています。とにかく、私の投票を
お願いします

1
ホストのIPを取得しようとしたことがありますstatus.hostIPか?
ペドロアーサー2017年

@PEdroArthurいいえ、私はそうではありません、それは最近の追加です。プルリクエストはこちら-github.com/kubernetes/kubernetes/pull/42717
PiersyP

これは「DownwadのAPI」と呼ばれている:kubernetes.io/docs/tasks/inject-data-application/...
アレック・イストミン

どうもありがとうございました。この回答は本当に私を大きなお気に入りにしています。
Liping Huang

25

いくつかの説明(実際には回答ではありません)

kubernetesでは、すべてのポッドにIPアドレスが割り当てられ、ポッド内のすべてのコンテナに同じIPアドレスが割り当てられます。したがって、Alex Robinsonが彼の回答で述べたhostname -iように、ポッドのIPアドレスを取得するためにコンテナー内で使用できます。

2つのダムコンテナーを実行するポッドでテストしましたhostname -iが、実際には両方のコンテナー内で同じIPアドレスを出力していました。さらに、そのIPはkubectl describe pod外部から取得したものと同等であり、IMO全体を検証します。

しかし、PiersyPの答えは私にはよりクリーンに見えます。

出典

kubernetes docsから:

ポッド内のアプリケーションはすべて同じネットワーク名前空間(同じIPとポートスペース)を使用するため、相互に「検索」し、localhostを使用して通信できます。このため、ポッド内のアプリケーションは、ポートの使用を調整する必要があります。各ポッドのIPアドレスはフラットな共有ネットワーク空間にあり、ネットワーク全体で他の物理コンピューターやポッドと完全に通信します。

kubernetes docsからの別のピース:

これまで、このドキュメントではコンテナについて説明しました。実際には、KubernetesはIPアドレスをポッドスコープで適用します-ポッド内のコンテナーは、IPアドレスを含むネットワーク名前空間を共有します。つまり、ポッド内のコンテナはすべて、localhost上の互いのポートに到達できます。


24

kubectl describe pods <name of pod> IPを含むいくつかの情報を提供します


12
問題は、ポッド/コンテナー内からIPを取得することに関するものだと思いkubectlます。
Elouan Keryell-Even 2016

16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

このコマンドはIPを返します


3
ご回答有難うございます。しかし、ポッド内のコンテナのIPアドレスを知りたいのですが。なので、を使わずに知りたいkubectl
yanana 2017年

14

コンテナーのIPアドレスは、ネットワーク名前空間内で適切に構成する必要があります。これにより、標準のLinuxツールのいずれでも取得できます。たとえば、してみてくださいifconfigip addr showhostname -I、などがそれをテストするためにあなたのコンテナの1つの中添付シェルから。


12

あなたは使うことができます

kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'

これは@mibbitの提案に基づいています。

これは、次の事実を考慮に入れています。


ないパイプを実行してくださいgrepsedkubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (しかし、awkはよりよいこのためのsedよりもある)
ウィリアムPursell

4

sedを使用するよりも、覚えるのが簡単awkです。

次に、ローカルマシンで実行できる例を示します。

kubectl describe pod `<podName>` | grep IP | awk '{print $2}'

IP自体は出力の列2にあるため、$2です。


4
あなたが質問に答えていないからだと思います。問題はbut how can I acquire the IP address from a container in the Pod? 、問題の人がkubectlポッド自体にアクセスできると想定していることです。
セイバン

4
kubectl describe pod $POD | awk '/IP/{print $2}'
グレップ

1

場合によっては、下位APIに依存する代わりに、コンテナーの内部から(ネットワークインターフェイスから)ローカルIPアドレスをプログラムで読み取ることもできます。

たとえば、golangの場合:https ://stackoverflow.com/a/31551220/6247478


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.