У меня есть простое приложение REST, которое я хочу развернуть в kubernetes. Прежде чем развернуть в среде облачного провайдера, я хочу проверить локально, используя minikube
. Вот мои настройки:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: example
spec:
replicas: 3
selector:
matchLabels:
name: example
template:
metadata:
labels:
name: example
spec:
containers:
- name: application
image: 1ijk/example
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: example
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 3000
selector:
name: example
и способ его вызова
$ minikube start --driver=hyperkit
[ output omitted ]
$ kubectl apply -f deployment.yml
deployment.apps/example created
ingress.extensions/example-ingress created
$ kubectl get service example
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example NodePort 10.100.198.224 <none> 3000:32275/TCP 4s
minikube service example --url
http://192.168.64.2:32275
$ minikube service example
|-----------|---------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------|-------------|---------------------------|
| default | example | http/80 | http://192.168.64.2:31726 |
|-----------|---------|-------------|---------------------------|
? Opening service default/example in default browser...
Однако браузер не может подключиться. Я проверил, что двоичный файл приложения и его изображение контейнера работают правильно. Кажется, мне не хватает части настройки kubernetes на minikube, и все учебники, которые я видел, предполагают развертывание облака с типом службы LoadBalancer
.
Что я могу сделать, чтобы протестировать это простое приложение kubernetes локально используя minikube
?
обновления
вот описание службы
$ kubectl describe service example
Name: example
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"example","namespace":"default"},"spec":{"ports":[{"name":"http","...
Selector: name=example
Type: NodePort
IP: 10.107.95.114
Port: http 80/TCP
TargetPort: 3000/TCP
NodePort: http 31726/TCP
Endpoints:
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
после обхода файла yml и использования cli для создания развертывания и службы вот так
kubectl create deployment example --image=1ijk/example
kubectl expose deployment example --type=LoadBalancer --port=8080 --target-port=3000
Я получаю сервис, установленный так
$ kubectl describe service example
Name: example
Namespace: default
Labels: app=example
Annotations: <none>
Selector: app=example
Type: LoadBalancer
IP: 10.100.117.7
Port: <unset> 8080/TCP
TargetPort: 3000/TCP
NodePort: <unset> 31683/TCP
Endpoints: 172.17.0.10:3000,172.17.0.5:3000,172.17.0.7:3000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
и тот же результат
окончательное обновление: см. комментарии, управляющие процессом отладки, в ответе ниже
Проблема была не с kubernetes - это было с моим приложением! Я сделал ошибку, связав сервер go с "127.0.0.1:3000"
вместо ":3000"
: faceplam :. Привязка к порту без указания IP позволяет серверу приложений быть доступным для всех сетевых интерфейсов контейнеров:)