0

在 VirtualBox Centos7 虚拟机上使用带有两个节点集群的 kubeadm。我有一个用 R 编写的应用程序和一个 mysql 数据库,每个都在他们自己的 pod 中。我已成功按照说明设置 nginx 入口控制器,以便我的本地计算机可以在 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
4

3 回答 3

0

根据您的 svc,您应该能够mysql:3306从集群内访问。

您是否尝试kubectl exec -it r-user-app bash过从 R 应用程序容器中 ping mysql?host mysql应该返回类似“mysql.cluster.local”的地址为 127.21.0.01”(示例)。或者返回任何错误。如果没有错误,那么 dbConnect() 可能不喜欢主机名?

于 2018-04-24T21:06:57.717 回答
0

看起来您的服务配置得很好。

ping 10.96.138.132 无响应 :(

每个Service都有一个静态地址,所以ping不通是正常的,因为那只是一个虚拟地址,对其处理的请求与对真实地址的请求略有不同。

我在这里看到只有两个原因会导致您遇到这个问题:

  1. 您的应用程序的容器中的 DNS 解析有问题。尝试使用10.96.138.132MySQL 地址而不是mysql. 如果它解决了您的问题 - 这是一个解决问题。顺便说一句,您可以使用服务 IP 而不是 DNS,正如我已经说过的 - 它是静态的。
  2. 转发规则有问题。检查命名空间中的kube-proxy日志kube-system,也许你会得到任何额外的调试信息。
于 2018-04-26T16:07:06.527 回答
0

这实际上是flannel的问题。当我切换到使用Wea ​​ve 作为 CNI 时,服务发现和 DNS kube 工作正常。

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
于 2018-05-17T15:53:58.180 回答