运行 nginx ingress controller kubernetes 时想要服务的(内部)名称
Want (internal) name for service while running nginx ingress controller kubernetes
在 VirtualBox Centos7 虚拟机上使用 kubeadm 和双节点集群。
我有一个用 R 编写的应用程序和一个 mysql 数据库,每个数据库都有自己的 pods。
我已成功关注 instructions to setup nginx ingress controller,以便我的本地计算机可以在 VM 之外访问该应用程序。检查 :)
但是,现在当应用程序 (R) 尝试访问 mysql 服务时,名称无法解析。与从 bash ping 'mysql' 相同。这不再有效:
mydb<-dbConnect(MySQL(), user = 'root', password ='password',
dbname = 'prototype', host = 'mysql')
相反,我必须使用 pod 的 IP,这确实有效。
mydb<-dbConnect(MySQL(), user = 'root', password ='password',
dbname = 'prototype', host = '10.244.1.233')
但是,这不会随着重启和系统更改而改变吗?我想要一种更静态的方式来引用 mysql 数据库。
$ kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.56.101:6443 5h
mysql 10.244.1.233:3306 41m
r-user-app 10.244.1.232:8787,10.244.1.232:3838 2h
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h
mysql ClusterIP 10.96.138.132 <none> 3306/TCP 28m
r-user-app LoadBalancer 10.100.228.80 <pending> 3838:32467/TCP,8787:31754/TCP 2h
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
r-user-app storage.test.com 80, 443 3h
$ kubectl describe service mysql
Name: mysql
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=neurocore,tier=mysql
Type: ClusterIP
IP: 10.96.138.132
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
Endpoints: 10.244.1.236:3306
Session Affinity: None
Events: <none>
ps auxw | grep kube-proxy
root 1914 0.1 0.3 44848 21668 ? Ssl 11:03 0:20 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf
root 29218 0.0 0.0 112660 980 pts/1 R+ 14:23 0:00 grep --color=auto kube-proxy
$iptables-save | grep mysql
-A KUBE-SEP-7P27CEQL6WJZRBQ5 -s 10.244.1.236/32 -m comment --comment "default/mysql:" -j KUBE-MARK-MASQ
-A KUBE-SEP-7P27CEQL6WJZRBQ5 -p tcp -m comment --comment "default/mysql:" -m tcp -j DNAT --to-destination 10.244.1.236:3306
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.138.132/32 -p tcp -m comment --comment "default/mysql: cluster IP" -m tcp --dport 3306 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.138.132/32 -p tcp -m comment --comment "default/mysql: cluster IP" -m tcp --dport 3306 -j KUBE-SVC-M7XME3WTB36R42AM
-A KUBE-SVC-M7XME3WTB36R42AM -m comment --comment "default/mysql:" -j KUBE-SEP-7P27CEQL6WJZRBQ5
根据您的 svc,您应该能够从集群内到达 mysql:3306
。
您是否尝试过 kubectl exec -it r-user-app bash
并从 R 应用容器内 ping mysql? host mysql
应该 return 类似 "mysql.cluster.local" 的地址为 127.21.0.01"(示例)。或者 return 任何错误。如果没有错误,那么可能是 dbConnect()不喜欢主机名?
看来您的服务配置不错。
ping 10.96.138.132 no response :(
每个Service都有一个静态地址,所以ping不通的情况是正常的,因为那只是一个虚拟地址,对其处理的请求与对真实地址的请求有点不同。
我在这里看到您遇到该问题的原因只有 2 个:
- 您的应用程序容器中的 DNS 解析出现问题。尝试使用
10.96.138.132
作为 MySQL 地址而不是 mysql
。如果它解决了您的问题 - 这是一个正在解决的问题。顺便说一句,您可以使用服务 IP 而不是 DNS,正如我已经说过的那样 - 它是静态的。
- 转发规则有问题。在
kube-system
命名空间中检查 kube-proxy
日志,也许你会得到任何额外的调试信息。
这实际上是 flannel 的问题。当我切换到使用 Weave 作为 CNI 时,服务发现和 DNS kube 工作正常。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
在 VirtualBox Centos7 虚拟机上使用 kubeadm 和双节点集群。 我有一个用 R 编写的应用程序和一个 mysql 数据库,每个数据库都有自己的 pods。 我已成功关注 instructions to setup nginx ingress controller,以便我的本地计算机可以在 VM 之外访问该应用程序。检查 :)
但是,现在当应用程序 (R) 尝试访问 mysql 服务时,名称无法解析。与从 bash ping 'mysql' 相同。这不再有效:
mydb<-dbConnect(MySQL(), user = 'root', password ='password',
dbname = 'prototype', host = 'mysql')
相反,我必须使用 pod 的 IP,这确实有效。
mydb<-dbConnect(MySQL(), user = 'root', password ='password',
dbname = 'prototype', host = '10.244.1.233')
但是,这不会随着重启和系统更改而改变吗?我想要一种更静态的方式来引用 mysql 数据库。
$ kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.56.101:6443 5h
mysql 10.244.1.233:3306 41m
r-user-app 10.244.1.232:8787,10.244.1.232:3838 2h
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h
mysql ClusterIP 10.96.138.132 <none> 3306/TCP 28m
r-user-app LoadBalancer 10.100.228.80 <pending> 3838:32467/TCP,8787:31754/TCP 2h
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
r-user-app storage.test.com 80, 443 3h
$ kubectl describe service mysql
Name: mysql
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=neurocore,tier=mysql
Type: ClusterIP
IP: 10.96.138.132
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
Endpoints: 10.244.1.236:3306
Session Affinity: None
Events: <none>
ps auxw | grep kube-proxy
root 1914 0.1 0.3 44848 21668 ? Ssl 11:03 0:20 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf
root 29218 0.0 0.0 112660 980 pts/1 R+ 14:23 0:00 grep --color=auto kube-proxy
$iptables-save | grep mysql
-A KUBE-SEP-7P27CEQL6WJZRBQ5 -s 10.244.1.236/32 -m comment --comment "default/mysql:" -j KUBE-MARK-MASQ
-A KUBE-SEP-7P27CEQL6WJZRBQ5 -p tcp -m comment --comment "default/mysql:" -m tcp -j DNAT --to-destination 10.244.1.236:3306
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.138.132/32 -p tcp -m comment --comment "default/mysql: cluster IP" -m tcp --dport 3306 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.138.132/32 -p tcp -m comment --comment "default/mysql: cluster IP" -m tcp --dport 3306 -j KUBE-SVC-M7XME3WTB36R42AM
-A KUBE-SVC-M7XME3WTB36R42AM -m comment --comment "default/mysql:" -j KUBE-SEP-7P27CEQL6WJZRBQ5
根据您的 svc,您应该能够从集群内到达 mysql:3306
。
您是否尝试过 kubectl exec -it r-user-app bash
并从 R 应用容器内 ping mysql? host mysql
应该 return 类似 "mysql.cluster.local" 的地址为 127.21.0.01"(示例)。或者 return 任何错误。如果没有错误,那么可能是 dbConnect()不喜欢主机名?
看来您的服务配置不错。
ping 10.96.138.132 no response :(
每个Service都有一个静态地址,所以ping不通的情况是正常的,因为那只是一个虚拟地址,对其处理的请求与对真实地址的请求有点不同。
我在这里看到您遇到该问题的原因只有 2 个:
- 您的应用程序容器中的 DNS 解析出现问题。尝试使用
10.96.138.132
作为 MySQL 地址而不是mysql
。如果它解决了您的问题 - 这是一个正在解决的问题。顺便说一句,您可以使用服务 IP 而不是 DNS,正如我已经说过的那样 - 它是静态的。 - 转发规则有问题。在
kube-system
命名空间中检查kube-proxy
日志,也许你会得到任何额外的调试信息。
这实际上是 flannel 的问题。当我切换到使用 Weave 作为 CNI 时,服务发现和 DNS kube 工作正常。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"