【问题标题】:Exposing a pod to local enviroment for easy developing purposes?将 pod 暴露在本地环境中以便于开发?
【发布时间】:2020-04-29 21:34:12
【问题描述】:

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

我尝试将 kafka 服务转换为 nodeport,但仍然没有运气 - 我可以访问它的唯一方法是将我的应用程序创建为 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
---

【问题讨论】:

    标签: visual-studio kubernetes docker-desktop


    【解决方案1】:

    要转发到服务,您需要在名称前使用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

    【讨论】:

    • kafka-0 是 pod,kafka 是无法通过 localhost:10000 访问的服务
    • 是的,你是对的。编辑了答案。它应该起作用了。进行端口转发时是否遇到任何错误?你的 pod 真的在运行吗?检查 kubectl get pod 的输出。检查您的 kubectl 客户端的默认命名空间是否已更改。
    • Windows 不支持远程呈现。
    • kubectl port-forward svc/kafka 10000:9092 Forwarding from 127.0.0.1:10000 -> 9092 Forwarding from [::1]:10000 -> 9092
    • 当应用程序尝试连接我得到这个Handling connection for 10000 但我的应用程序` 10.1.1.200:9092/0: Connect to ipv4#10.1.1.200:9092 failed: 连接尝试失败,因为已连接一方在一段时间后没有正确响应,或者由于连接的主机未能响应而建立连接失败...(在状态 CONNECT 21013ms 之后)`
    【解决方案2】:

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

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

    2. 我从 cmets 看到您正在使用 Docker Desktop for Windows。您可以尝试使用type: LoadBalancer 服务而不是ClusterIPNodePort。我知道这可能听起来很奇怪,但我见过几个例子like this one 表明它确实有效。

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

    如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多