Выставить порт из контейнера в стручок миникубе кубернетес - PullRequest
0 голосов
/ 23 января 2020

Я новичок в K8s, попробую миникуб с 2-мя контейнерами, запущенными в модуле, с помощью этой команды:

kubectl apply -f deployment.yaml

и этого развертывания.yml:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
spec:

  restartPolicy: Never

  volumes:
  - name: v-site-home
    emptyDir: {}

  containers:


  - name: site-web
    image: site-home:1.0.0
    ports:
    - containerPort: 80
    volumeMounts:
    - name: v-site-home
      mountPath: /usr/share/nginx/html/assets/quotaLago
  
  - name: site-cron
    image: site-home-cron:1.0.0
    volumeMounts:
    - name: v-site-home
      mountPath: /app/quotaLago

У меня есть общий том, поэтому, если я понимаю, я не могу использовать развертывание, а только модули (может быть с состоянием?)

В любом случае я хочу выставить порт 80 из контейнера site-web в pod site-home. В официальных документах я вижу это для развертываний:

kubectl expose deployment hello-node --type=LoadBalancer --port=8080

, но я не могу использовать, например:

kubectl expose pod site-web --type=LoadBalancer --port=8080

Есть идеи?

1 Ответ

2 голосов
/ 23 января 2020

, но я не могу использовать, например:

kubectl expose pod site-web --type=LoadBalancer --port=8080

Конечно, вы можете, однако выставление одного Pod через LoadBalancer Service не имеет большого смысла , Если у вас есть Deployment, который обычно управляет набором Pods, между которым можно сбалансировать реальную нагрузку, LoadBalancer выполняет свою работу. Однако вы все равно можете использовать его только для демонстрации одного Pod.

Обратите внимание, что ваш контейнер предоставляет порт 80, а не 8080 (containerPort: 80 в вашей спецификации container), поэтому вам нужно укажите его как target-port в вашем Service. Ваша команда kubectl expose может выглядеть следующим образом:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

Если вы указали только --port=8080 флаг для вашей команды kubectl expose, предполагается, что значение target-port совпадает со значением --port. Вы можете легко проверить это самостоятельно, посмотрев на только что созданную службу:

kubectl get svc site-web -o yaml

, и вы увидите нечто подобное в разделе spec.ports:

- nodePort: 32576
    port: 8080
    protocol: TCP
    targetPort: 8080

После выставив ваш Pod (или Deployment) правильно, т.е. используя:

kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80

вы увидите нечто похожее:

  - nodePort: 31181
    port: 8080
    protocol: TCP
    targetPort: 80

После выдачи kubectl get services вы должны увидеть похожий вывод :

NAME                            TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
site-web                              ClusterIP      <Cluster IP>   <External IP>           8080:31188/TCP         4m42s

Если затем в браузере вы набрали go - http://<External IP>:8080 или запустили curl http://<External IP>:8080, вы должны увидеть интерфейс вашего сайта.

Имейте в виду, что это решение имеет смысл и будет полностью функциональным в облачной среде, которая сможет предоставить вам реальный балансировщик нагрузки. Обратите внимание, что если вы объявляете такой тип Service в Minikukbe , на самом деле он создает службу NodePort , поскольку он не может предоставить вам реальный балансировщик нагрузки. Таким образом, ваше приложение будет доступно на IP-адресе вашего Node (вашей виртуальной машины Minikube) на случайно выбранном порту в диапазоне 30000-32767 (в моем примере это порт 31181).

Что касается вашего вопроса о томе:

У меня есть общий том, поэтому, если я понимаю, я не могу использовать развертывание, а только модули (возможно, с состоянием?)

да, если вы хотите использовать специально EmptyDir том, он не может быть разделен между различными Pods (даже если они были запланированы на одном узле), он разделяется только между контейнерами в одном и том же Pod. Если вы хотите использовать Deployment, вам нужно подумать о другом решении для хранения данных, таком как PersistenetVolume .


РЕДАКТИРОВАТЬ:

В первый момент я не заметил ошибку в вашей команде:

kubectl expose pod site-web --type=LoadBalancer --port=8080

Вы пытаетесь выставить несуществующие Pod, так как имя Pod - site-home, а не site-web. site-web - это имя одного из ваших контейнеров (в вашем site-home Pod). Помните: мы выставляем Pod, а не containers через Service.

Я меняю 80-> 8080, но я всегда прихожу к error:kubectl expose pod site-home --type=LoadBalancer --port=8080 return:error: couldn't retrieve selectors via --selector flag or introspection: the pod has no labels and cannot be exposed См. 'kubectl expose -h' для помощи и примеров .

Ключевым моментом здесь является: the pod has no labels and cannot be exposed

Похоже, что для вашего Pod не определено ни одного labels, необходимого для того, чтобы Service Вы можете выбрать этот конкретный Pod (или набор похожих Pods, которые имеют такую ​​же метку) среди других Pods в вашем кластере. Вам нужен хотя бы один ярлык в вашем определении Pod. Добавление простой метки name: site-web в разделе Pod metadata должно помочь. Это может выглядеть так в вашем Pod определении:

apiVersion: v1
kind: Pod
metadata:
  name: site-home
  labels:
    name: site-web
spec:
...

Теперь вы даже можете предоставить эту метку в качестве селектора в вашей службе, однако она должна обрабатываться автоматически, если вы опустите флаг --selector:

kubectl expose pod site-home --type=LoadBalancer --port=8080 --target-port=80 --selector=name=site-web

Помните: in Minikube реальный балансировщик нагрузки не может быть создан, и вместо него будет создан тип LoadBalancer NodePort. Команда kubectl get svc сообщит вам, на каком порту (в диапазоне 30000-32767) ваше приложение будет доступно.

и `kubectl expose pod site-web --type = LoadBalancer --port = 8080 return: Ошибка с сервера (NotFound): модули "site-web" не найдены. Site-home - это модуль, site-web - контейнер с открытым портом, в чем проблема?

если у вас нет Pod с именем "site-web", вы можете ожидать такого сообщение. Здесь вы просто пытаетесь разоблачить несуществующие Pod.

Если я открыл порт из контейнера, порт автоматически открывается и для модуля?

Да, у вас есть порт, определенный в определении контейнера. Ваш Pods автоматически открывает все порты, которые отображаются внутри них Containers.

...