developer tip

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

copycodes 2020. 10. 25. 12:27
반응형

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


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


가장 간단한 대답은 아래 정의 된 구성 블록을 추가하여 포드 또는 복제 컨트롤러 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가 제공하는 다른 기능을 확인하기 위해 실행 합니다.

건배


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

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를 포함한 몇 가지 정보를 제공합니다.


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

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


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


당신은 사용할 수 있습니다

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

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

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

  • 호스트 이름이 POD의 이름으로 설정되어 있지만 나중에 변경 될 수 있습니다.
  • kubectl 컨테이너에 수동으로 배치되었습니다 (이미지가 빌드되었을 때 가능).
  • Kubernetes는 클러스터 액세스 / 포드에서 API 액세스 , 즉 /var/run/secrets/kubernetes.io/serviceaccount컨테이너에 설명 된대로 컨테이너에 서비스 계정 사용자 인증 정보를 암시 적으로 제공합니다.

sed를 사용 하는 것보다 기억하기가 더 간단 합니다 awk.

다음은 로컬 컴퓨터에서 실행할 수있는 예입니다.

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

IP 자체는 출력의 열 2에 있으므로 $2.


경우에 따라 하향 API에 의존하는 대신 컨테이너 내부에서 프로그래밍 방식으로 로컬 IP 주소 (네트워크 인터페이스에서)를 읽는 것도 작동합니다.

예 : golang : https://stackoverflow.com/a/31551220/6247478

참고 URL : https://stackoverflow.com/questions/30746888/how-to-know-a-pods-own-ip-address-from-inside-a-container-in-the-pod

반응형