2016-09-22 3 views
3

Я очень новичок в кубернетах/докеров, поэтому извиняюсь, если это глупый вопрос.Изменить IP-адреса Kubernetes?

У меня есть стручок, который обращается к нескольким услугам. В моем контейнере я запускаю скрипт python и нуждаюсь в доступе к службе. В настоящее время я делаю это с использованием IP-адресов служб.

Является ли IP-адрес службы стабильным или лучше использовать environment variables? Если это так, некоторые советы по этому поводу были бы замечательными.

Открытия абзац Services Documentation дает мотивацию для услуг, что подразумевает стабильный IP-адрес, но я никогда не видел его в явном виде указан:

Хотя каждый Pod получает свой собственный IP-адрес, даже тот IP-адрес не может следует полагаться на стабильность со временем. Это приводит к проблеме: если какой-либо набор Pods (давайте назовем их backends) предоставляет функциональность другим Pods (давайте назовем их интерфейсами) внутри кластера Kubernetes, как эти интерфейсы узнают и отслеживают, какие серверы находятся в этом наборе?

Ввести Услуги.

Моего стручок спецификация для справки:

kind: Pod 
apiVersion: v1 
metadata: 
    name: fetchdataiso 
    labels: 
    name: fetchdataiso 
spec: 
    containers: 
    - name: fetchdataiso 
     image: 192.111.1.11:5000/ncllc/fetch_data 
     command: ["python"] 
     args: ["feed/fetch_data.py", "-hf", "10.222.222.51", "-pf", "8880", "-hi", "10.223.222.173", "-pi","9101"] 

ответ

0

Услуга IP-адрес является стабильной. Вам нужно будет использовать переменные среды, если у вас нет лучшего способа обнаружения IP-адреса (например, DNS).

+0

Спасибо, ссылка на документацию будет очень полезна. Мой босс мне не верит! Я попытался заменить IP-адреса в своих аргументах переменными окружения, например: «$ IQFEED_SERVICE_HOST», но струйки все время терпели крах. Каким будет правильный способ доступа к ним? Я знаю, что переменные среды существуют, потому что я вошел в запущенный контейнер и запустил echo $ IQFEED_SERVICE_HOST, который отобразил IP. – Shuaib

0

При использовании кластера аддона DNS в кластере, чтобы получить доступ к вашим услугам и ваш сервис называется foo в пространстве имен bar, вы также можете получить доступ к нему, как bar.foo, который, вероятно, более значимому, чем обычный IP-адрес.

См http://kubernetes.io/docs/user-guide/services/#dns

+0

Спасибо. Как я могу использовать это в своей спецификации? У меня есть два пространства имен ** kube-system ** и ** default **. Имя моей службы: ** ssdb-feed **. Итак, я бы передал ssdb-feed.kube-систему вместо IP-адреса? Я пробовал это, и стручок падает. – Shuaib

+0

@Shuaib Ваша служба, вероятно, находится в пространстве имен по умолчанию.Просто передача в 'ssdb-feed' должна работать, пока ваши контейнеры находятся в одном и том же пространстве имен. Если вы хотите проверить, вы можете запустить модуль busybox и попытаться разрешить имя службы внутри кластера. –

0

Короткий ответ «Да, служба IP может измениться»

$ kubectl apply -f test.svc.yml 
service "test" created 

$ kubectl get svc 
NAME   CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
kubernetes 10.12.0.1  <none>  443/TCP 10d 
test   10.12.172.156 <none>  80/TCP 6s 

$ kubectl delete svc test 
service "test" deleted 

$ kubectl apply -f test.svc.yml 
service "test" created 

$ kubectl get svc 
NAME   CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
kubernetes 10.12.0.1  <none>  443/TCP 10d 
test   10.12.254.241 <none>  80/TCP 3s 

Длинный ответ, что если вы используете его правильно, вы не будете иметь никаких проблем с ним. Что еще более важно в области вашего вопроса, так это то, что переменные ENV намного хуже, чем связь DNS/IP. Вы должны обратиться к вашей службе службы или service.namespace или даже полный путь как-то вдоль линий test.default.svc.cluster.local. Это будет разрешено для обслуживания ClusterIP, и в отличие от ваших ENV он может быть повторно разрешен к новому IP (который, вероятно, никогда не произойдет, если вы явно не удалите и не восстановите сервис), в то время как ENV текущего процесса не будет изменен

+0

Я думаю, дело в том, что IP-адрес службы останется стабильным, пока вы не решите удалить/воссоздать его. Но я согласен с тем, что использование имени dns лучше. –

+0

Есть ли лучший способ для обнаружения сервисов в этом случае (перезапуск службы), чем DNS (где клиенты могут кэшировать более старые записи)? – prat0318

+0

@ prat0318 на самом деле это очень редкий случай, обычно вы должны использовать 'apply', а не' delete' и 'create', как в моем примере. Из-за этого обнаружение сервиса кубернетов довольно мощное (когда вы меняете базовые модули, их изменение IP, но вы по-прежнему указываете на clusterIP, который не изменился вообще) –