Làm thế nào để biết địa chỉ IP riêng của Pod từ bên trong vùng chứa trong Pod?


91

Kubernetes chỉ định một địa chỉ IP cho mỗi vùng chứa, nhưng làm cách nào để lấy địa chỉ IP từ một vùng chứa trong Pod? Tôi không thể tìm thấy đường từ các tài liệu.

Chỉnh sửa: Tôi sẽ chạy cụm Aerospike ở Kubernetes. và các tệp cấu hình cần có địa chỉ IP riêng. Và tôi đang cố gắng sử dụng confd để đặt tên máy chủ. Tôi sẽ sử dụng biến môi trường nếu nó được đặt.

Câu trả lời:


166

Câu trả lời đơn giản nhất là đảm bảo rằng các tệp yaml / json nhóm hoặc bộ điều khiển nhân rộng của bạn thêm IP nhóm làm biến môi trường bằng cách thêm khối cấu hình được xác định bên dưới. (khối bên dưới cũng cung cấp tên và không gian tên cho nhóm)

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

Tạo lại pod / rc và sau đó thử

echo $MY_POD_IP

cũng chạy envđể xem kubernetes cung cấp cho bạn những gì khác.

Chúc mừng


1
Tôi vừa thử nghiệm giải pháp của bạn và nó hoạt động rất tốt. Tôi chắc chắn 100% kubernetes không có biến môi trường như vậy, vì printenv | grep '10.254.24.167'không trả về bất kỳ thứ gì ngoại trừ biến MY_POD_IP do người dùng xác định. Dù sao, hãy lấy phiếu bầu của tôi thưa ngài :)
Elouan Keryell-Even

1
Bạn đã bao giờ cố gắng lấy IP của máy chủ lưu trữ thông qua status.hostIPchưa?
PEdroArthur

@PEdroArthur Không Tôi không có, afaik đó là một bổ sung gần đây. Xem yêu cầu kéo tại đây - github.com/kubernetes/kubernetes/pull/42717
PiersyP

Đây được gọi là "Downwad API": kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin

Cảm ơn bạn rất nhiều, câu trả lời này thực sự làm cho tôi rất yêu thích.
Liping Huang

25

Một số làm rõ (không thực sự là một câu trả lời)

Trong kubernetes, mọi nhóm được gán một địa chỉ IP và mọi vùng chứa trong nhóm sẽ được gán cùng một địa chỉ IP đó. Do đó, như Alex Robinson đã nêu trong câu trả lời của mình , bạn chỉ có thể sử dụng hostname -ibên trong vùng chứa của mình để lấy địa chỉ IP nhóm.

Tôi đã thử nghiệm với một nhóm chạy hai vùng chứa câm và thực sự hostname -iđang xuất cùng một địa chỉ IP bên trong cả hai vùng chứa. Hơn nữa, IP đó tương đương với IP có được bằng cách sử dụng kubectl describe podtừ bên ngoài, xác nhận toàn bộ IMO.

Tuy nhiên, câu trả lời của PiersyP có vẻ rõ ràng hơn đối với tôi.

Nguồn

Từ tài liệu kubernetes :

Các ứng dụng trong một nhóm đều sử dụng cùng một không gian tên mạng (cùng một IP và không gian cổng), do đó có thể “tìm thấy” nhau và giao tiếp bằng cách sử dụng localhost. Do đó, các ứng dụng trong một nhóm phải điều phối việc sử dụng các cổng của chúng. Mỗi nhóm có một địa chỉ IP trong không gian mạng chia sẻ phẳng có giao tiếp đầy đủ với các máy tính và nhóm vật lý khác trên toàn mạng.

Một đoạn khác từ tài liệu kubernetes :

Cho đến nay tài liệu này đã nói về container. Trên thực tế, Kubernetes áp dụng địa chỉ IP ở phạm vi Pod - các vùng chứa trong Pod chia sẻ không gian tên mạng của chúng - bao gồm cả địa chỉ IP của chúng. Điều này có nghĩa là các container trong Pod đều có thể đến được các cổng của nhau trên localhost.


24

kubectl describe pods <name of pod> sẽ cung cấp cho bạn một số thông tin bao gồm IP


12
Tôi nghĩ câu hỏi là về việc lấy IP từ bên trong pod / container, nơi kubectlkhông có sẵn.
Elouan Keryell-Even

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

Lệnh này sẽ trả về cho bạn một IP


3
Cảm ơn câu trả lời của bạn. Nhưng tôi muốn biết địa chỉ IP trong vùng chứa trong Pod. Vì vậy, tôi muốn biết nó mà không cần sử dụng kubectl.
yanana

14

Địa chỉ IP của vùng chứa phải được định cấu hình đúng bên trong không gian tên mạng của nó, vì vậy bất kỳ công cụ linux tiêu chuẩn nào cũng có thể lấy được. Ví dụ, thử ifconfig, ip addr show, hostname -I, vv từ một vỏ gắn bên trong một trong những container của bạn để kiểm tra nó ra.


12

Bạn đã có thể sử dụng

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

dựa trên những gì @mibbit đề xuất.

Điều này có tính đến các sự kiện sau:


Đừng bỏ grepqua sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (nhưng awk thì tốt hơn cho điều này so với sed)
William Pursell

4

Thậm chí đơn giản để nhớ hơn sedcách tiếp cận là sử dụng awk.

Đây là một ví dụ mà bạn có thể chạy trên máy cục bộ của mình:

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

Do đó, chính IP nằm trên cột 2 của đầu ra $2.


4
Tôi cho rằng đó là vì bạn không trả lời câu hỏi. Câu hỏi đặt ra là but how can I acquire the IP address from a container in the Pod? Bạn đang giả định rằng người được đề cập có quyền truy cập kubectlvào chính nhóm.
Seivan

4
Đừng bỏ thuốc mê:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell

1

Trong một số trường hợp, thay vì dựa vào API xuống, việc đọc địa chỉ IP cục bộ (từ giao diện mạng) theo chương trình từ bên trong vùng chứa cũng hoạt động.

Ví dụ: trong golang: https://stackoverflow.com/a/31551220/6247478


1
kubectl get pods -o wide

Cung cấp cho bạn danh sách các nhóm với tên, trạng thái, ip, nút ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.