Тестирование Kubernetes, используя миникуб на MacOS - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть простое приложение 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 позволяет серверу приложений быть доступным для всех сетевых интерфейсов контейнеров:)

1 Ответ

2 голосов
/ 11 апреля 2020

В конечных точках службы не отображаются IP-адреса POD. Вам необходимо предоставлять модули через службу типа LoadBalancer. Вместо использования yaml службы используйте команду ниже.

kubectl expose deployment example --type=LoadBalancer --port=8080 --target-port=3000

А затем вы можете получить URL-адрес с помощью команды ниже и использовать его в браузере для доступа к приложению.

minikube service example

Редактировать:

Приложение go имеет жестко запрограммированное значение для адреса, которое было привязано к 127.0.0.1. Из-за жесткого кодирования оно не было доступно и внутри кластера, что было проверено с помощью curl на 10.100.117.7:3000 из еще один модуль в кластере. Удаление жесткого кода решило проблему.

https://kubernetes.io/docs/tutorials/hello-minikube/

...