Вот мой yaml развертывания:
apiVersion: apps/v1
kind: Deployment
metadata:
name: some-deployment
spec:
replicas: 1
selector:
matchLabels:
app: some-api
template:
metadata:
labels:
app: some-api
spec:
containers:
- name: some-api-local
image: "ealen/echo-server:0.9.2"
ports:
- containerPort: 80
imagePullSecrets:
- name: registrycred
---
apiVersion: v1
kind: Service
metadata:
name: some-service
spec:
type: NodePort
ports:
- name: http
port: 5001
targetPort: 80
nodePort: 30002
selector:
app: some-api
Реальная служба работает на порту 80, а журналы выводятся чуть ниже:
Просто экспериментирую с развертыванием кластера Kubernetes. Я пытаюсь получить доступ к простому эхо-серверу через эту службу выше, например:
10.109.89.108:30002
Вывод: k get nodes --output wide
IP-адрес выше — это IP-адрес моего кластера, который я получил от kubectl get service
. Что я делаю неправильно?
Пытался получить доступ, как показано ниже:
192.168.49.2:30002
(используя IP-адрес узла)10.109.89.108:30002
(ip кластера)IP-адрес выше — это IP-адрес моего кластера, который я получил от службы kubectl get.
Попробуйте [node IP]:30002 для доступа к порту. Вы можете найти IP узла с помощью kubectl get nodes --output wide
.
Для миникуба запустите minikube service some-service --url
перед переходом по адресу http://localhost:30002. Подробнее здесь.
см. мое редактирование с выводом get nodes: 192.168.49.2:30002 должно работать правильно
Можете ли вы отредактировать, добавив точную команду, которую вы используете для доступа к 192.168.49.2:30002
, сообщение об ошибке и уточнить, на каком узле вы выполняете эту команду.
вот команда: kubectl get nodes --output wide
и указан только один узел (миникубе)
Нет, это команда, данная в ответе. Добавьте команду, которую вы используете для доступа к 192.168.49.2:30002, например. завиток?
просто это в браузере: 192.168.49.2:30002
да, это работает. Однако есть один вопрос: как вы обычно занимаетесь локальной разработкой — этот миникуб выглядит не очень жизнеспособным — я использую macOS. Какие-либо предложения? Локально просто работайте обычно и публикуйте изображения с помощью докера. Затем запустить эти оркестрации Kubernetes прямо в средах?
Я пытаюсь запустить этот API в локальном кластере Kubernetes, и интерфейс должен иметь к нему доступ (локально), с этим динамическим туннелированием может быть сложно каждый раз подключаться?
Обычно туннель необходимо создать только один раз.
Спасибо! это очень помогает. И последнее: есть ли способ выбрать порт с помощью этой сервисной команды minikube?
Вы не можете выбрать номер порта при использовании команды службы minikube.
У вас определено 4 разных порта. У вас есть порт контейнера 3001, Служба прослушивает порт 5001, который пересылает на 80, с узлами, прокси-подключающимися к порту 300002 к вашей Службе.
Какой бы порт ни работало ваше приложение (я предполагаю, 3001), он должен быть вашим targetPort
, и удобно, если вы все равно подключаетесь через узел (с каким-то внешним балансировщиком нагрузки), чтобы ваш Сервисный порт также был таким же.
spec:
containers:
- name: some-api-local
image: "ealen/echo-server:0.9.2"
ports:
- containerPort: 3001 # is this the port that echo-server runs on?
imagePullSecrets:
- name: registrycred
---
apiVersion: v1
kind: Service
metadata:
name: some-service
spec:
type: NodePort
ports:
- name: http
port: 5001 # port the service listens on
targetPort: 80 # port the app runs on
nodePort: 30002 # using Nodes as proxy with external LB
selector:
app: some-api
Привет, посмотрите мое редактирование: порт контейнера и целевой порт теперь равны 80 с одной и той же проблемой!
Попробуйте это в качестве первого шага. Проверьте, отвечает ли ваш модуль на http-запрос: kubectl run --rm Curl --image=curlimages/curl -- Curl http://:80
Ваш ответ выглядит хорошей отправной точкой для отладки проблемы. Однако это не решает проблему и не предлагает возможных решений. Возможно, лучше опубликовать это как комментарий, потому что это требует действий от человека, задавшего исходный вопрос.
это не сработало, я уже это пробовал!