Подвергать капсулу воздействию местной окружающей среды для облегчения разработки?

Я сейчас работаю с кубернетами и пытаюсь создать процесс разработки, позволяющий разработчику получать доступ к службам в локальном кластере кубернетов? Я хотел бы, чтобы это было просто, и пока я пробовал kubectl port-forward kafka 10000:9092, но это не показало, что модуль открыт для localhost: 10000 ..

Я попытался преобразовать службу kafka в nodeport, но все равно безуспешно - единственный способ получить к нему доступ - это создать свое приложение как докерризованное приложение и запустить приложение в контейнере докера - это означает, что запуск exe-файла не будет подключаться к нему, но выполнение его с помощью докера заставит его работать.

Я пробовал прокси Kubectl - он тоже не работает - я не могу проверить связь с clusterIp.

Я не пробовал использовать ingress или loadbalancer, так как считаю это слишком сложным, учитывая, что это только для целей разработки, а не что-то, что должно быть "безопасным" в производственной среде.

Как мне легко открыть службу kafka, чтобы консольное приложение на моем ноутбуке, на котором локально запущен кластер kubernetes, могло получить к ней доступ?

apiVersion: v1
kind: Service
metadata:
  name: kafka-headless
spec:
  clusterIP: None
  ports:
  - name: broker
    port: 9092
    protocol: TCP
    targetPort: 9092
  selector:
    app: kafka
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: kafka
spec:
  ports:
  - name: broker
    port: 9092
    protocol: TCP
    targetPort: 9092
  selector:
    app: kafka
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: kafka
  name: kafka
spec:
  podManagementPolicy: OrderedReady
  replicas: 1
  revisionHistoryLimit: 1
  selector:
    matchLabels:
      app: kafka
  serviceName: kafka-headless
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - command:
        - sh
        - -exc
        - |
          unset KAFKA_PORT && \
          export KAFKA_BROKER_ID=${HOSTNAME##*-} && \
          export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${POD_IP}:9092 && \
          exec /etc/confluent/docker/run
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        - name: KAFKA_HEAP_OPTS
          value: -Xmx1G -Xms1G
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: leader-zookeeper:2181
        - name: KAFKA_LOG_DIRS
          value: /opt/kafka/data/logs
        - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
          value: "1"
        image: confluentinc/cp-kafka:latest
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - sh
            - -ec
            - /usr/bin/jps | /bin/grep -q SupportedKafka
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        name: kafka-broker
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: kafka
          timeoutSeconds: 5
        ports:
        - containerPort: 9092
          name: kafka
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/kafka/data
          name: datadir
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 60
  updateStrategy:
    type: OnDelete
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  labels:
    app: kafka-pdb
  name: kafka-pdb
spec:
  maxUnavailable: 0
  selector:
    matchLabels:
      app: kafka
---

person kafka    schedule 13.01.2020    source источник


Ответы (2)


Чтобы выполнить переадресацию на службу, необходимо использовать svc/ перед именем. Таким образом, ваша команда будет либо kubectl port-forward svc/kafka 10000:9092, либо kubectl port-forward kafka-0 10000:9092

В Windows убедитесь, что брандмауэр Windows не блокирует kubectl.

Ссылка: https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/#forward-a-local-port-to-a-port-on-the-pod.


Вы также можете использовать telepresence для отладки существующей службы в кластере, заменив ее локальной версией разработки.

Установите телеприсутствие и используйте telepresence --swap-deployment $DEPLOYMENT_NAME

Ссылка:

https://kubernetes.io/docs/tasks/debug-application-cluster/local-debugging/#developing-or-debugging-an-existing-service

https://www.telepresence.io/reference/install

person Shashank V    schedule 13.01.2020
comment
kafka-0 - это модуль, kafka - это служба, недоступная через localhost: 10000 - person kafka; 13.01.2020
comment
Да ты прав. Отредактировал ответ. Это должно было сработать. Вы получали ошибку при перенаправлении портов? Ваша капсула действительно работает? Проверьте вывод kubectl get pod. Проверьте, не изменилось ли пространство имен вашего kubectl клиента по умолчанию. - person Shashank V; 13.01.2020
comment
телеприсутствие не поддерживается в Windows. - person kafka; 13.01.2020
comment
когда приложение пытается подключиться, я получаю это Handling connection for 10000 Но мое приложение `10.1.1.200:9092/0: Подключиться к ipv4 # 10.1.1.200: 9092 не удалось: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом по прошествии определенного периода времени , или установленное соединение не удалось из-за того, что подключенный хост не ответил ... (после 21013 мс в состоянии CONNECT) ` - person kafka; 13.01.2020
comment
pod работает, пространство имен по умолчанию - person kafka; 13.01.2020
comment
Можете ли вы проверить, блокирует ли ваш брандмауэр Windows kubectl? - person Shashank V; 13.01.2020
comment
выключил - все тот же - person kafka; 13.01.2020
comment
Какая ОС узлов? Можете ли вы проверить, отображается ли в журналах модуля входящее соединение? - person Shashank V; 13.01.2020
comment
Трудно отслеживать ... Многое происходит ... Сам проект создается с поддержкой докеров, если я запускаю контейнер докеров, я могу попасть в него, но файл exe до него не доходит. - person kafka; 13.01.2020
comment
Какая ОС узлов? Я вижу, что недавно добавлена ​​поддержка kubectl port-forward для узлов Windows - github.com/kubernetes/kubernetes / pull / 75479 - person Shashank V; 13.01.2020
comment
Стручки Базовые - person kafka; 13.01.2020
comment
Я использую рабочий стол докера - person kafka; 13.01.2020
comment
что значит The pods are Base ? Как вы создали свой кластер кубернетов? Какая операционная система у ваших узлов кластера? - person Shashank V; 13.01.2020
comment
Кластер создается с помощью Docker Desktop для Windows. Образ PODS основан на базе - person kafka; 13.01.2020

Если я правильно вас понял, у меня есть несколько дополнительных вариантов, которые вы можете проверить:

  1. В этом ответе используется идея externalTrafficPolicy: Local наряду с другими возможными решениями.

  2. Из комментариев я вижу, что вы используете Docker Desktop для Windows. Вы можете попробовать использовать службу type: LoadBalancer вместо ClusterIP или NodePort. Я знаю, это может показаться странным, но я видел несколько примеров, как этот, показывающих что это действительно работает.

Я публикую это как ответ сообщества, потому что предложенные решения изначально не были моими идеями.

Пожалуйста, дайте мне знать, помогло ли это.

person Community    schedule 15.01.2020