【问题标题】:Kubernetes external-IP doesn't work on all nodesKubernetes 外部 IP 不适用于所有节点
【发布时间】:2018-11-19 20:20:15
【问题描述】:

我用 Kubeadm 创建了一个 Kubernetes 集群,它有 3 个节点。它们的 IP 地址和主机名分别是 10.10.10.146/24(k8s1, master)、10.10.10.135/24(k8s2)、10.10.10.170/24(k8s3)。

现在我使用这个 yaml 文件创建一个包含 3 个 pod 的 nginx 服务:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-app
        image: nginx:1.14.0
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-srv
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - 10.10.100.1

最后一个 pod 被安排到 k8s2,其中两个被安排到 k8s3。

然后,如果我将 10.10.100.0/24 路由​​到 k8s2,则只有一个 pod 工作。如果到 k8s3,只有两个 pod 工作。如果到 k8s1,则没有 pod 工作。

我怎样才能使所有 pod 正常工作通过外部 IP 来自外部就像通过集群 IP 从内部 无论我将外部 IP 子网路由到哪个节点?或者这是不可能的,或者我需要其他东西,比如 Kubernetes Ingress?

【问题讨论】:

  • 你为哪台主机配置了 ip 10.10.100.1?
  • @KunLi 我没有将 10.10.100.1 配置为接口上的真实 IP 地址。我只是将它添加到外部 IP 配置中并将我的路由器配置为将 10.10.100.0/24 路由​​到其中一个节点
  • 外部IP应该手动配置,我想,尝试在你的三个节点之一上配置外部IP。
  • 你必须使用入口

标签: kubernetes


【解决方案1】:

有几个options可以在集群外公开你的服务:

第一个选项是使用Kubernetes Service 的NodePort 类型。这样,Service 会在集群中每个节点的网络接口上打开一个端口,所有到达该端口的流量都会被转发到该服务。 默认情况下,此类服务的端口范围限制为 30000–32767。

这里是一个 Service NodePort 配置的例子:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: NodePort
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
    nodePort: 30080

如果您在 AWS、GCP、Azure 等云中运行 Kubernetes 集群,则可以使用第二个选项。如果您创建 LoadBalancer 类型的服务,它将在云中创建一个新的负载均衡器并将所有流量从该负载均衡器转发到该服务。 这种方式的缺点是每个服务都会创建一个单独的负载均衡器,这会花费你额外的钱。

这是一个 Service LoadBalancer 配置示例:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376

第三个选项是使用Ingress 对象。集群中应该运行一个 Ingress 控制器,以根据您创建的 Ingress 对象的内容配置云网络。 Ingress 可以根据 dns 名称和 URI 路径为您提供将请求路由到不同服务的功能。您也可以在裸机 Kubernetes 集群上使用它,但在这种情况下,您需要负责将网络流量路由到 Ingress 控制器,例如通过防火墙规则。

以下是 Ingress 配置的几个示例:

# redirect all traffic to a service
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  backend:
    serviceName: testsvc
    servicePort: 80


# redirect traffic to a service for specified URI path
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多