Композит не выставляя NodePort - Docker для рабочего стола Windows - PullRequest
1 голос
/ 07 января 2020

У меня есть docker-compose.yml и Docker для рабочего стола Windows с локальным кластером kubernetes (контекст по умолчанию docker -desktop):

version: '3'
services:
  web:
    image: customnode
    ports:
    - "3000:3000"
    labels:
      kompose.service.type: nodeport

  datastore:
    image: custommongo
    ports:
    - "27017:27017"

docker-compose up -d отлично работает и выставляет мой NodeJS на порт 3000 на 127.0.0.1.

Я пытаюсь перенести этот кластер на мой k8s, поэтому следую https://kompose.io/getting-started/

На странице выше написано: «Если у вас еще нет запущенного кластера Kubernetes, миникубе - лучший способ начать работу» ... Я уже использую кластер OOTB Docker для настольных компьютеров, поэтому я предполагаю, что мне не нужен миникуб.

kompose convert
INFO Kubernetes file "datastore-service.yaml" created
INFO Kubernetes file "web-service.yaml" created
INFO Kubernetes file "datastore-deployment.yaml" created
INFO Kubernetes file "web-deployment.yaml" created

Вот веб-развертывание и веб-сервис YAMLS:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.service.type: nodeport
    kompose.version: 1.16.0 (0c01309)
  creationTimestamp: null
  labels:
    io.kompose.service: web
  name: web
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: web
    spec:
      containers:
        image: customnode
        name: web
        ports:
        - containerPort: 3000
        resources: {}
      restartPolicy: Always
status: {}

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.service.type: nodeport
    kompose.version: 1.16.0 (0c01309)
  creationTimestamp: null
  labels:
    io.kompose.service: web
  name: web
spec:
  ports:
  - name: "3000"
    port: 3000
    targetPort: 3000
  selector:
    io.kompose.service: web
  type: NodePort
status:
  loadBalancer: {}

Наконец, работает kompose up:

kompose up
[36mINFO[0m We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application. If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead.

INFO Deploying application in "default" namespace
INFO Successfully created Service: datastore
INFO Successfully created Service: web
INFO Successfully created Deployment: datastore
INFO Successfully created Deployment: web

Вывод kubectl get svc:

kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
datastore    ClusterIP   10.103.***.***   <none>        27017/TCP        76s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          23m
web          NodePort    10.106.***.***     <none>        3000:32033/TCP   76s

Как видите, нет внешнего IP, как я ожидал. Я уверен, что это недостаток знаний с моей стороны, а не ошибка, так что мне не хватает?

1 Ответ

1 голос
/ 07 января 2020

Extenal IP назначается только для услуги типа LoadBalancer. Для работы службы LoadBalancer в кластере должен быть установлен контроллер LoadBalancer. Еще услуга LoadBalancer ведет себя точно так же, как и служба NodePort. Большинство облачных провайдеров поддерживают службы LoadBalancer.

Для служб типа NodePort служба связывается со случайным портом в диапазоне портов узла на всех узлах. В вашем случае вы можете видеть, что служба привязана к порту 32033 - 3000:32033/TCP.

Диапазон портов узла настраивается в качестве аргумента для сервера API Kubernetes с параметром --service-node-port-range (по умолчанию 30000-32767). При создании службы типа NodePort из этого диапазона выбирается случайный свободный порт. Если вы хотите выбрать пользовательский порт, вы можете указать атрибут nodePort в объекте Port.

Например:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.service.type: nodeport
    kompose.version: 1.16.0 (0c01309)
  creationTimestamp: null
  labels:
    io.kompose.service: web
  name: web
spec:
  ports:
  - name: "3000"
    port: 3000
    targetPort: 3000
    nodePort: 30002         ###### You can choose node port here if needed
  selector:
    io.kompose.service: web
  type: NodePort           ####### Change this line to LoadBalancer if you want an external IP
status:
  loadBalancer: {}
...