【问题标题】:how to enable port-forward in a k8s service yaml如何在 k8s 服务 yaml 中启用端口转发
【发布时间】:2020-02-13 10:53:49
【问题描述】:

我正在尝试自动化 pod 部署,但似乎无法弄清楚如何通过 yaml 配置将流量从集群外部转发到 pod。

只能从 localhost 访问,但不能在访问主 IP 时访问。 当单独应用 'kubectl port-forward --address 0.0.0.0 POD LISTEN_PORT:DEST_PORT' 时,它可以工作。

apiVersion: v1
kind: Service
type:
metadata:
  labels:
    name: app1
  name: app1
spec:
  ports:
  - name: "80"
    port: 8888
    targetPort: 80
  selector:
    name: app1
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: app1
  name: app1
spec:
  containers:
  - image: nginx
    name: app1
    ports:
    - containerPort: 80
    resources:
      limits:
        cpu: 500m
        memory: "52428800"
      requests:
        cpu: 250m
        memory: "20971520"
  nodeSelector:
    slave: "one"
  restartPolicy: Never

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:

    Kubernetes ServiceTypes 允许您指定您想要的服务类型。 默认为 ClusterIP

    ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从集群内访问。这是默认的 ServiceType。

    NodePort在每个节点的 IP 上的静态端口(NodePort)上公开服务。自动创建 NodePort Service 路由到的 ClusterIP 服务。您可以通过请求 <NodeIP>:<NodePort> 从集群外部联系 NodePort 服务。

    您应该如下更新服务 yaml 以创建 NodePort 以供 NodePort 访问

    apiVersion: v1
    kind: Service
    type:
    metadata:
      labels:
        name: app1
      name: app1
    spec:
      ports:
      - name: "80"
        port: 8888
        targetPort: 80
      selector:
        name: app1
      type: NodePort
    

    【讨论】:

    • LoadBalancer、NodePort 两种类型我都试过了,但仍然无法访问。
    • 正如您在问题上所说的那样,您正在使用主 IP .. 我希望您尝试使用运行 pod 的节点的 ip .. 使用 kubectl get pod -o wide 获取节点 ip
    【解决方案2】:

    Ingress:将来自集群外部的 HTTP 和 HTTPS 路由暴露给集群内的服务。流量路由由 Ingress 资源上定义的规则控制。

        internet
            |
       [ Ingress ]
       --|-----|--
       [ Services ]
    

    Ingress 不是一种服务,而是一个对象,它充当反向代理和集群的单一入口点,将请求路由到不同的服务。

    要创建基本入口,

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
    spec:
      backend:
        serviceName: testsvc
        servicePort: 80
    

    【讨论】:

    • 对于上面的示例,我已经尝试过这个 Ingress,但仍然无法访问。如果你做对了,请告诉我:apiVersion:networking.k8s.io/v1beta1 kind:Ingress metadata:name:test-ingress spec:backend:serviceName:app1 servicePort:8888
    【解决方案3】:

    您需要将服务类型更新为 NodePort。

    类型:节点端口

    然后您就可以使用http://NODE_HOST:NODE_PORT 访问该服务

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多