Kubernetes外部IP不';不能在所有节点上工作

Kubernetes外部IP不';不能在所有节点上工作,kubernetes,Kubernetes,我已经由Kubeadm创建了一个具有3个节点的Kubernetes集群。它们的IP地址和主机名分别为10.10.10.146/24(k8s1,主机)、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:

我已经由Kubeadm创建了一个具有3个节点的Kubernetes集群。它们的IP地址和主机名分别为10.10.10.146/24(k8s1,主机)、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,只有一个吊舱工作。如果连接到k8s3,则只有两个吊舱工作。如果到k8s1,没有吊舱工作

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

有几种方法可以在集群外公开您的服务:

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

以下是服务节点端口配置的示例:

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
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
# 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
如果您在AWS、GCP、Azure等云中运行Kubernetes群集,则第二个选项可用。如果您创建LoadBalancer类型的服务,它将在云中创建一个新的负载平衡器,并将所有流量从该负载平衡器转发到该服务。 这种方式的缺点是,每个服务都会创建一个单独的负载平衡器,这会增加您的成本

以下是服务负载平衡器配置的示例:

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
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
# 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
第三种选择是使用对象。应在群集中运行入口控制器,以根据您创建的入口对象的内容配置云网络。入口可以根据dns名称和URI路径为您提供将请求路由到不同服务的功能。您也可以在裸机Kubernetes群集上使用它,但在这种情况下,您负责将网络流量路由到入口控制器,例如通过防火墙规则

以下是几个入口配置示例:

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
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
# 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

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