Minikube: предоставление REST API из контейнера Docker

#docker #rest #kubernetes #kubectl #minikube

#docker #rest #kubernetes #kubectl #minikube

Вопрос:

В настоящее время у меня есть докеризованное приложение Spring Boot с открытыми Java REST API, которые я развертываю на своем NUC (просто на удаленном компьютере) и могу подключиться к нему со своего Mac через статический IP-адрес NUC. Обе машины находятся в одной сети.

Сейчас я изучаю возможность размещения приложения Docker в Kubernetes (Minikube)
(используя этот учебник https://medium.com/bb-tutorials-and-thoughts/how-to-run-java-rest-api-on-minikube-4b564ea982cc ).

Я использовал инструмент Kompose из Kubernetes для преобразования моих файлов Docker compose в файлы развертываний и служб Kubernetes. Одна из служб, которую я пытаюсь запустить в первую очередь, просто открывает порт 8080 и имеет ряд ресурсов REST. Кажется, все запущено и работает, но я не могу получить доступ к ресурсам REST с моего Mac (или даже с самого NUC) с curl -v помощью команды.

После устранения небольшой проблемы с моими образами Docker (требуется встроить во внутреннее хранилище Docker images Minikube), я могу успешно развернуть свои службы и развертывания. Существует ряд других, но для того, чтобы пройти этот шаг, я просто включу один:

 $ kubectl get po -A

NAMESPACE         NAME                                 READY   STATUS    RESTARTS   AGE
kube-system       coredns-f9fd979d6-hhgn8              1/1     Running   0          7h
kube-system       etcd-minikube                        1/1     Running   0          7h
kube-system       kube-apiserver-minikube              1/1     Running   0          7h
kube-system       kube-controller-manager-minikube     1/1     Running   0          7h
kube-system       kube-proxy-rszpv                     1/1     Running   0          7h
kube-system       kube-scheduler-minikube              1/1     Running   0          7h
kube-system       storage-provisioner                  1/1     Running   0          7h
meanwhileinhell   apigw                                1/1     Running   0          6h54m
meanwhileinhell   apigw-75bc5z1f5j-cklxt               1/1     Running   0          6h54m
 
 $ kubectl get service apigw

NAME         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
apigw        NodePort   10.107.116.239   <none>        8080:32327/TCP   6h53m
 
 $ kubectl cluster-info

Kubernetes master is running at https://192.168.44.2:8443
KubeDNS is running at https://192.168.44.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
 

Однако я не могу попасть на этот главный IP-адрес или любой ожидаемый открытый порт, используя статический IP-адрес моего NUC. Я пытался использовать типы сервисов LoadBalancer и NodePort для сервиса, но первый зависает pending для внешнего IP-адреса.

Я немного поиграл с предоставлением портов и переадресацией портов, но не смог заставить что-либо работать (порт 7000 — это просто произвольное число):

 kubectl port-forward apigw 7000:8080
kubectl expose deployment apigw --port=8080 --target-port=8080
 

Вот мои apigw файлы развертывания, сервиса и pod yaml:

apigw-deployment.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: apigw
  name: apigw
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: apigw
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.network/networkinhell: "true"
        io.kompose.service: apigw
    spec:
      containers:
          image: meanwhileinhell/api-gw:latest
          name: apigw
          ports:
            - containerPort: 8080
          resources: {}
          imagePullPolicy: Never
          volumeMounts:
            - mountPath: /var/log/gateway
              name: combined-logs
      hostname: apigw
      restartPolicy: Always
      volumes:
        - name: combined-logs
          persistentVolumeClaim:
            claimName: combined-logs
status: {}
 

apigw-service.yaml

 apiVersion: v1
kind: Service
metadata:
  name: apigw
  labels:
    run: apigw
spec:
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: apigw
  type: NodePort
 

apigw-pod.yaml

 apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: apigw
  name: apigw
spec:
  containers:
    - image: meanwhileinhell/api-gw:latest
      name: apigw
      imagePullPolicy: Never
      resources: {}
      ports:
        - containerPort: 8080
 

Используется kubectl create -f для создания сервисов.

 Ubuntu 18.04.5 LTS
Minikube v1.15.0
KubeCtl v1.19.4
 

Комментарии:

1. Какой драйвер minikube -driver вы используете?

2. Привет, Мэтт, я использую драйвер Linux Docker minikube config set driver docker

3. Используете ли вы kubectl со своего Mac? или удаленный хост?

4. Я запускаю его с удаленного хоста.

5. Попробуйте kubectl port-forward apigw 7000:8080 --address 0.0.0.0