Kubernetesは各コンテナーにIPアドレスを割り当てますが、ポッドのコンテナーからIPアドレスを取得するにはどうすればよいですか?ドキュメンテーションからの道を見つけることができませんでした。
編集:KubernetesでAerospikeクラスターを実行します。設定ファイルには独自のIPアドレスが必要です。そして、私はconfdを使用してホスト名を設定しようとしています。環境変数が設定されている場合は、それを使用します。
回答:
最も簡単な答えは、ポッドまたはレプリケーションコントローラーの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が提供するものを確認できます。
乾杯
status.hostIP
か?
いくつかの説明(実際には回答ではありません)
kubernetesでは、すべてのポッドにIPアドレスが割り当てられ、ポッド内のすべてのコンテナに同じIPアドレスが割り当てられます。したがって、Alex Robinsonが彼の回答で述べたhostname -i
ように、ポッドのIPアドレスを取得するためにコンテナー内で使用できます。
2つのダムコンテナーを実行するポッドでテストしましたhostname -i
が、実際には両方のコンテナー内で同じIPアドレスを出力していました。さらに、そのIPはkubectl describe pod
外部から取得したものと同等であり、IMO全体を検証します。
しかし、PiersyPの答えは私にはよりクリーンに見えます。
ポッド内のアプリケーションはすべて同じネットワーク名前空間(同じIPとポートスペース)を使用するため、相互に「検索」し、localhostを使用して通信できます。このため、ポッド内のアプリケーションは、ポートの使用を調整する必要があります。各ポッドのIPアドレスはフラットな共有ネットワーク空間にあり、ネットワーク全体で他の物理コンピューターやポッドと完全に通信します。
kubernetes docsからの別のピース:
これまで、このドキュメントではコンテナについて説明しました。実際には、KubernetesはIPアドレスをポッドスコープで適用します-ポッド内のコンテナーは、IPアドレスを含むネットワーク名前空間を共有します。つまり、ポッド内のコンテナはすべて、localhost上の互いのポートに到達できます。
kubectl describe pods <name of pod>
IPを含むいくつかの情報を提供します
kubectl
ます。
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})
このコマンドはIPを返します
kubectl
。
コンテナーのIPアドレスは、ネットワーク名前空間内で適切に構成する必要があります。これにより、標準のLinuxツールのいずれでも取得できます。たとえば、してみてくださいifconfig
、ip addr show
、hostname -I
、などがそれをテストするためにあなたのコンテナの1つの中添付シェルから。
あなたは使うことができます
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
これは@mibbitの提案に基づいています。
これは、次の事実を考慮に入れています。
kubectl
手動でコンテナーに配置された(おそらくイメージが構築されたとき)/var/run/secrets/kubernetes.io/serviceaccount
容器にgrep
にsed
:kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p'
(しかし、awkはよりよいこのためのsedよりもある)
sed
を使用するよりも、覚えるのが簡単awk
です。
次に、ローカルマシンで実行できる例を示します。
kubectl describe pod `<podName>` | grep IP | awk '{print $2}'
IP自体は出力の列2にあるため、$2
です。
but how can I acquire the IP address from a container in the Pod?
、問題の人がkubectl
ポッド自体にアクセスできると想定していることです。
kubectl describe pod $POD | awk '/IP/{print $2}'
printenv | grep '10.254.24.167'
ユーザー定義の変数MY_POD_IP以外は何も返さないので、kubernetesにはそのような環境変数がないと100%確信しています。とにかく、私の投票を