포드의 컨테이너 내부에서 포드의 자체 IP 주소를 아는 방법은 무엇입니까?


96

Kubernetes는 각 컨테이너에 대해 IP 주소를 할당하지만 포드의 컨테이너에서 IP 주소를 얻으려면 어떻게해야합니까? 문서에서 방법을 찾을 수 없습니다.

편집 : Kubernetes에서 Aerospike 클러스터를 실행할 것입니다. 구성 파일에는 자체 IP 주소가 필요합니다. 그리고 confd를 사용하여 호스트 이름을 설정하려고합니다. 설정된 경우 환경 변수를 사용합니다.

답변:


174

가장 간단한 대답은 아래에 정의 된 구성 블록을 추가하여 포드 또는 복제 컨트롤러 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

포드 / rc를 다시 만든 다음 시도하십시오.

echo $MY_POD_IP

또한 envkubernetes가 제공하는 다른 기능을 확인하기 위해 실행 합니다.

건배


1
방금 귀하의 솔루션을 테스트했으며 매우 잘 작동합니다. printenv | grep '10.254.24.167'사용자 정의 변수 MY_POD_IP를 제외하고는 아무것도 반환하지 않기 때문에 kubernetes에 이러한 환경 변수가 없다고 100 % 확신 합니다. 어쨌든, 내 투표 선생님 :)
Elouan Keryell-Even

1
호스트의 IP를 가져 오려고 시도한 적이 status.hostIP있습니까?
PEdroArthur

@PEdroArthur 아니요, 최근 추가되었습니다. 풀 요청은 여기에서 확인하십시오 -github.com/kubernetes/kubernetes/pull/42717
PiersyP


대단히 감사합니다.이 답변은 나를 정말 좋아합니다.
Liping Huang

27

일부 설명 (정말 답변이 아님)

kubernetes에서는 모든 포드에 IP 주소가 할당되고 포드의 모든 컨테이너에는 동일한 IP 주소가 할당됩니다. 따라서 Alex Robinson이 답변 에서 언급했듯이 hostname -i컨테이너 내부를 사용 하여 포드 IP 주소를 가져올 수 있습니다.

두 개의 멍청한 컨테이너를 실행하는 포드로 테스트했으며 실제로 hostname -i두 컨테이너 내에서 동일한 IP 주소를 출력했습니다. 또한 그 IP는 kubectl describe pod외부에서 얻은 IP와 동일하여 IMO 전체를 검증합니다.

그러나 PiersyP의 대답 은 더 깨끗해 보입니다.

출처

에서 는 Kubernetes 워드 프로세서 :

포드의 애플리케이션은 모두 동일한 네트워크 네임 스페이스 (동일한 IP 및 포트 공간)를 사용하므로 서로 "찾고"localhost를 사용하여 통신 할 수 있습니다. 이 때문에 포드의 애플리케이션은 포트 사용을 조정해야합니다. 각 포드에는 네트워크를 통해 다른 물리적 컴퓨터 및 포드와 완전히 통신하는 평면 공유 네트워킹 공간에 IP 주소가 있습니다.

kubernetes 문서의 또 다른 부분 :

지금까지이 문서는 컨테이너에 대해 이야기했습니다. 실제로 Kubernetes는 포드 범위에서 IP 주소를 적용합니다. 포드 내의 컨테이너는 IP 주소를 포함하여 네트워크 네임 스페이스를 공유합니다. 이는 Pod 내의 컨테이너가 모두 localhost에서 서로의 포트에 도달 할 수 있음을 의미합니다.


25

kubectl describe pods <name of pod> IP를 포함한 몇 가지 정보를 제공합니다.


12
질문은 포드 / 컨테이너 내부에서 IP를 얻는 것에 관한 것이라고 생각합니다 kubectl.
Elouan Keryell-Even

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

이 명령은 IP를 반환합니다.


3
답변 해 주셔서 감사합니다. 하지만 포드의 컨테이너에있는 IP 주소를 알고 싶습니다. 그래서 사용하지 않고 알고 싶습니다 kubectl.
yanana

14

컨테이너의 IP 주소는 네트워크 네임 스페이스 내에서 적절하게 구성되어야 표준 Linux 도구가이를 얻을 수 있습니다. 예를 들어, 시도를 들어 ifconfig, ip addr show, hostname -I당신의 용기 중 하나에 부착 된 쉘 등을 테스트합니다.


12

당신은 사용할 수 있습니다

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

@mibbit이 제안한 내용을 기반으로합니다.

이것은 다음 사실을 고려합니다.


하지 파이프를 수행 grepsed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (하지만, AWK 더 나은 이것에 대한 나오지보다)
윌리엄 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이 포드 자체에 대한 액세스 권한이 있다고 가정하는 것입니다.
Seivan

4
grep을 awk로 파이프하지 마십시오.kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell


1
kubectl get pods -o wide

이름, 상태, IP, 노드가 포함 된 포드 목록을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.