将吊舱暴露在本地环境中以便于开发?

时间:2020-01-13 07:19:33

标签: visual-studio kubernetes docker-desktop

我目前正在使用kubernetes,并试图制定一个开发流程,使开发人员能够访问本地kubernetes集群中的服务?我希望它保持简单,现在尝试使用kubectl port-forward kafka 10000:9092,但这似乎并没有将pod暴露给localhost:10000。

我尝试将kafka服务转换为节点端口,但仍然没有运气-我访问它的唯一方法是将应用程序创建为dockerized应用程序,然后在docker容器中运行该应用程序 -表示运行exe文件不会连接到该文件,但使用docker执行该文件将使其正常运行。

我尝试了Kubectl代理-也不起作用-我无法ping通clusterIp。

我还没有尝试过使用入口或负载平衡器,因为我觉得它太复杂了,考虑到这只是出于开发目的,而不是应该用于生产的“安全”产品。

我如何轻松公开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
---

2 个答案:

答案 0 :(得分:0)

要移植到服务,您需要在名称前使用svc/。因此,您的命令将是kubectl port-forward svc/kafka 10000:9092kubectl 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

答案 1 :(得分:0)

如果我对您的理解正确,那么我还有一些其他选项可供您检查:

  1. This answer使用externalTrafficPolicy: Local的想法以及其他可能的解决方案。

  2. 我从评论中看到您正在使用Windows的Docker Desktop。您可以尝试使用type: LoadBalancer服务而不是ClusterIPNodePort。我知道听起来可能有些麻烦,但是我没有看到like this one的例子表明它确实有效。

我将其发布为社区答复,因为建议的解决方案最初并不是我的想法。

请让我知道是否有帮助。

相关问题