Kubernetes Cluster-IP服务未按预期工作

时间:2018-03-15 10:37:39

标签: amazon-web-services kubernetes

好的,所以目前我已经让kubernetes掌握并运行在AWS EC2实例上,并在我的笔记本电脑上运行一名工作人员:

$ kubectl get nodes
NAME            STATUS    ROLES     AGE       VERSION
master          Ready     master    34d       v1.9.2
worker          Ready     <none>    20d       v1.9.2

我使用以下配置创建了部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostnames
  labels:
    app: hostnames-deployment
spec:
  selector:
    matchLabels:
      app: hostnames
  replicas: 1
  template:
    metadata:
      labels:
        app: hostnames
    spec:
      containers:
      - name: hostnames
        image: k8s.gcr.io/serve_hostname
        ports:
        - containerPort: 9376
          protocol: TCP

部署正在运行:

$ kubectl get deployment
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hostnames      1         1         1            1           1m

已在工作节点上创建了一个pod:

$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
hostnames-86b6bcdfbc-v8s8l     1/1       Running   0          2m

从工作节点,我可以卷曲pod并获取信息:

$ curl 10.244.8.5:9376
hostnames-86b6bcdfbc-v8s8l

我使用以下配置创建了服务:

kind: Service
apiVersion: v1
metadata:
  name: hostnames-service
spec:
  selector:
    app: hostnames
  ports:
  - port: 80
    targetPort: 9376

服务已启动并正在运行:

$ kubectl get svc
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hostnames-service   ClusterIP   10.97.21.18      <none>        80/TCP         1m
kubernetes          ClusterIP   10.96.0.1        <none>        443/TCP        34d

据我了解,该服务应该在群集范围内公开pod,我应该能够使用服务IP从群集中的任何节点获取信息pod。

如果我从工作节点卷曲服务,它就会按预期工作:

$ curl 10.97.21.18:80
hostnames-86b6bcdfbc-v8s8l

但是,如果我尝试从位于AWS EC2实例上的主节点卷曲服务,请求会挂起并最终超时:

$ curl -v 10.97.21.18:80
* Rebuilt URL to: 10.97.21.18:80/
*   Trying 10.97.21.18...
* connect to 10.97.21.18 port 80 failed: Connection timed out
* Failed to connect to 10.97.21.18 port 80: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to 10.97.21.18 port 80: Connection timed out

为什么主节点的请求无法通过群集IP服务到达工作节点上的pod?

我已经阅读了很多关于kubernetes网络和官方kubernetes服务文档的文章,但无法找到解决方案。

2 个答案:

答案 0 :(得分:2)

取决于您使用它的哪种模式在细节上有所不同,但在概念上相同。

您尝试连接到2种不同类型的地址 - 可从节点访问的Pod IP地址,以及可从Kubernetes群集中的pod访问的虚拟IP地址。

该服务的IP地址某个pod或任何其他主题上的IP地址,即根据您在服务中定义的规则映射到pod IP地址的虚拟地址,并由其管理kube-proxy守护进程,它是Kubernetes的一部分。

群集内通信特别需要的地址,以便能够访问服务后面的pod,而无需关心你拥有多少pod的副本以及它实际工作的位置,因为服务IP是静态的,与pod的IP不同。

因此,希望从其他pod获取的服务IP地址,而不是来自节点的服务IP地址。

您可以在official documentation中阅读服务虚拟IP的工作原理。

答案 1 :(得分:2)

kube-proxy负责设置路由集群IP的IPTables规则(默认情况下)。服务的集群IP应该可以从运行kube-proxy的任何地方路由。我的第一个猜测是kube-proxy没有在主人身上运行。