Kubernetes wijst een IP-adres toe aan elke container, maar hoe kan ik het IP-adres verkrijgen van een container in de Pod? Ik kon de weg niet vinden in de documentatie.
Bewerken: ik ga het Aerospike-cluster in Kubernetes gebruiken. en de configuratiebestanden hebben een eigen IP-adres nodig. En ik probeer confd te gebruiken om de hostnaam in te stellen. Ik zou de omgevingsvariabele gebruiken als deze was ingesteld.
Antwoord 1, autoriteit 100%
Het eenvoudigste antwoord is ervoor te zorgen dat uw pod- of replicatiecontroller yaml/json-bestanden het pod-IP toevoegen als een omgevingsvariabele door het hieronder gedefinieerde configuratieblok toe te voegen. (het onderstaande blok maakt bovendien de naam en naamruimte beschikbaar voor de pod)
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
Maak de pod/rc opnieuw en probeer het dan
echo $MY_POD_IP
voer ook env
uit om te zien wat kubernetes je nog meer biedt.
Proost
Antwoord 2, autoriteit 16%
Enkele verduidelijkingen(niet echt een antwoord)
In kubernetes krijgt elke pod een IP-adres toegewezen en krijgt elke container in de pod hetzelfde IP-adres. Dus, zoals Alex Robinson zei in zijn antwoord, kun je gewoon hostname -I
in je container om het IP-adres van de pod te krijgen.
Ik heb getest met een pod met twee domme containers, en inderdaad gaf hostname -I
hetzelfde IP-adres uit in beide containers. Bovendien was dat IP-adres gelijk aan dat verkregen met behulp van kubectl describe pod
van buitenaf, wat het hele ding IMO valideert.
Echter, PiersyP’s antwoordlijkt me zuiverder.
Bronnen
De applicaties in een pod gebruiken allemaal dezelfde netwerknaamruimte (dezelfde IP- en poortruimte), en kunnen elkaar dus “vinden” en communiceren via localhost. Daarom moeten applicaties in een pod hun gebruik van poorten coördineren. Elke pod heeft een IP-adres in een platte gedeelde netwerkruimte die volledige communicatie heeft met andere fysieke computers en pods in het netwerk.
Nog een stuk uit kubernetes docs:
Tot nu toe heeft dit document gesproken over containers. In werkelijkheid past Kubernetes IP-adressen toe op de Pod-scope – containers binnen een Pod delen hun netwerknaamruimten – inclusief hun IP-adres. Dit betekent dat containers binnen een Pod allemaal elkaars poorten op localhost kunnen bereiken.
Antwoord 3, autoriteit 12%
kubectl describe pods <name of pod>
geeft je wat informatie, inclusief het IP-adres
Antwoord 4, autoriteit 8%
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})
Dit commando geeft je een IP terug
Antwoord 5, autoriteit 7%
Het IP-adres van de container moet correct zijn geconfigureerd binnen de netwerknaamruimte, zodat elk van de standaard linux-tools het kan krijgen. Probeer bijvoorbeeld ifconfig
, ip addr show
, hostname -I
, enz. vanuit een bijgevoegde shell in een van uw containers om het uit te testen .
Antwoord 6, autoriteit 6%
Je zou kunnen gebruiken
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
die is gebaseerd op wat @mibbit suggereerde.
Hierbij wordt rekening gehouden met de volgende feiten:
- hostnaam is ingesteld op de naam van POD, maar dit kan in de toekomst veranderen
kubectl
is handmatig in de container geplaatst (mogelijk toen de afbeelding werd gemaakt)- Kubernetes levert impliciet een serviceaccountreferentie aan de container, zoals beschreven in Toegang tot het cluster / toegang tot de API vanuit een pod, bijv.
/var/run/secrets/kubernetes.io/serviceaccount
in de container
Antwoord 7, autoriteit 5%
kubectl get pods -o wide
Geef je een lijst met pods met naam, status, ip, node…
Antwoord 8, autoriteit 2%
Nog eenvoudiger te onthouden dan de sed
-aanpak is om awk
te gebruiken.
Hier is een voorbeeld dat u op uw lokale computer kunt uitvoeren:
kubectl describe pod `<podName>` | grep IP | awk '{print $2}'
Het IP-adres zelf staat in kolom 2 van de uitvoer, vandaar $2
.
Antwoord 9
In sommige gevallen, in plaats van te vertrouwen op neerwaartse API, werkt het programmatisch lezen van het lokale IP-adres (van netwerkinterfaces) vanuit de container ook.
Bijvoorbeeld in golang:
https://stackoverflow.com/a/31551220/6247478
Antwoord 10
Containers hebben hetzelfde IP-adres als de pod waarin ze zich bevinden.
Dus vanuit de container kun je gewoon ip a
doen en het IP-adres dat je krijgt is het IP-adres dat de pod ook heeft.