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
포드 / rc를 다시 만든 다음 시도하십시오.
echo $MY_POD_IP
또한 env
kubernetes가 제공하는 다른 기능을 확인하기 위해 실행 합니다.
건배
status.hostIP
있습니까?
일부 설명 (정말 답변이 아님)
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에서 서로의 포트에 도달 할 수 있음을 의미합니다.
kubectl describe pods <name of pod>
IP를 포함한 몇 가지 정보를 제공합니다.
kubectl
.
당신은 사용할 수 있습니다
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
를 사용 하는 것보다 기억하기가 더 간단 합니다 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}'
어떤 경우에는 하향 API에 의존하는 대신 컨테이너 내부에서 프로그래밍 방식으로 로컬 IP 주소 (네트워크 인터페이스에서)를 읽는 것도 작동합니다.
예 : golang : https://stackoverflow.com/a/31551220/6247478
printenv | grep '10.254.24.167'
사용자 정의 변수 MY_POD_IP를 제외하고는 아무것도 반환하지 않기 때문에 kubernetes에 이러한 환경 변수가 없다고 100 % 확신 합니다. 어쨌든, 내 투표 선생님 :)