Kubernetes external-IP不适用于所有节点

时间:2018-06-10 11:28:04

标签: kubernetes

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

现在我创建了一个nginx服务,其中包含3个包含此yaml文件的pod:

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

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

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

如何通过外部IP从外部使所有pod正常运行,就像从内部通过cluster-IP一样,无论我将外部IP子网路由到哪个节点?或者那是不可能的,或者我需要其他东西,比如Kubernetes Ingress?

1 个答案:

答案 0 :(得分:0)

有几个options要在群集外公开您的服务:

第一个选项是使用NodePort类型Kubernetes Service。这样,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