我有一个简单的MYSQL pod位于MYSQL服务后面。
另外,我有另一个正在运行python进程的pod,它正在尝试连接到MYSQL pod。
如果我尝试从python pod手动连接到MYSQL pod的IP地址,一切都是A-OK。但是,如果我尝试连接到MYSQL服务,那么我会收到一个无法连接到MYSQL的错误。
grant@grant-Latitude-E7450:~/k8s/objects$ kubectl describe pod mysqlpod
Name: mysqlpod
Namespace: default
Node: minikube/192.168.99.100
Start Time: Fri, 20 Jan 2017 11:10:50 -0600
Labels: <none>
Status: Running
IP: 172.17.0.4
Controllers: <none>
grant@grant-Latitude-E7450:~/k8s/objects$ kubectl describe service mysqlservice
Name: mysqlservice
Namespace: default
Labels: <none>
Selector: db=mysqllike
Type: ClusterIP
IP: None
Port: <unset> 3306/TCP
Endpoints: 172.17.0.5:3306
Session Affinity: None
No events.
grant@grant-Latitude-E7450:~/k8s/objects$ kubectl describe pod basic-python-model
Name: basic-python-model
Namespace: default
Node: minikube/192.168.99.100
Start Time: Fri, 20 Jan 2017 12:01:50 -0600
Labels: db=mysqllike
Status: Running
IP: 172.17.0.5
Controllers: <none>
如果我附加到我的python容器并执行mysqlservice的nslookup,那么我实际上得到了错误的IP。如上所示,mysqlpod的IP是172.17.0.4,而nslookup mysqlservice正在解析为172.17.0.5。
grant@grant-Latitude-E7450:~/k8s/objects$ k8s exec -it basic-python-model bash
[root@basic-python-model /]# nslookup mysqlservice
Server: 10.0.0.10
Address: 10.0.0.10#53
Name: mysqlservice.default.svc.cluster.local
Address: 172.17.0.5
我对kubernetes相当新,但我已经在这个问题上敲了几个小时,我似乎无法理解我做错了什么。
所以这是完全正确的行为,但我只是错误配置了我的pod。
对于未来被困的人:
kubernetes服务中定义的选择器必须与您要服务的pod的标签匹配。 IE)在我的MySqlService.yaml文件中,我有“mysqlpod”的名称选择器:
apiVersion: v1
kind: Service
metadata:
name: mysqlservice
spec:
clusterIP: None
ports:
- port: 3306
targetPort: 3306
selector:
name: mysqlpod
因此,在我的MySqlPod.yaml文件中,我需要一个完全匹配的标签。
kind: Pod
apiVersion: v1
metadata:
name: mysqlpod
labels:
name: mysqlpod
spec:
...
对于再来这里的人,请查看@gnicholas的答案,同时确保clusterIP: None
设置正确。
我碰巧在clusterIP: None
文件中缩进了.yml
,并且Kubernetes忽略了命令,因此错误地分配了clusterIP导致错误的IP问题。
请注意,验证不会抛出任何错误,但会默默地忽略它。