好的,所以目前我已经让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服务文档的文章,但无法找到解决方案。
答案 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
没有在主人身上运行。