运行nginx入口控制器kubernetes时需要(内部)服务名称

tp5buhyn  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(553)

在virtualbox centos7虚拟机上使用带有两节点群集的kubeadm。我有一个用r编写的应用程序和一个mysql数据库,每个数据库都在自己的pod中。我已经成功地按照说明设置nginx入口控制器,这样我的本地机器就可以在vms之外访问应用程序。支票:)
但是,现在当app(r)尝试访问mysql服务时,名称无法解析。与从bash ping'mysql'相同。这不再有效:

  1. mydb<-dbConnect(MySQL(), user = 'root', password ='password',
  2. dbname = 'prototype', host = 'mysql')

相反,我必须使用吊舱的ip,这是可行的。

  1. mydb<-dbConnect(MySQL(), user = 'root', password ='password',
  2. dbname = 'prototype', host = '10.244.1.233')

然而,在重新启动和系统更改时,这不是要改变吗?我想用一种更静态的方式来引用mysql数据库。

  1. $ kubectl get endpoints
  2. NAME ENDPOINTS AGE
  3. kubernetes 192.168.56.101:6443 5h
  4. mysql 10.244.1.233:3306 41m
  5. r-user-app 10.244.1.232:8787,10.244.1.232:3838 2h
  6. $ kubectl get svc
  7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  8. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h
  9. mysql ClusterIP 10.96.138.132 <none> 3306/TCP 28m
  10. r-user-app LoadBalancer 10.100.228.80 <pending> 3838:32467/TCP,8787:31754/TCP 2h
  11. $ kubectl get ing
  12. NAME HOSTS ADDRESS PORTS AGE
  13. r-user-app storage.test.com 80, 443 3h
  14. $ kubectl describe service mysql
  15. Name: mysql
  16. Namespace: default
  17. Labels: <none>
  18. Annotations: <none>
  19. Selector: app=neurocore,tier=mysql
  20. Type: ClusterIP
  21. IP: 10.96.138.132
  22. Port: <unset> 3306/TCP
  23. TargetPort: 3306/TCP
  24. Endpoints: 10.244.1.236:3306
  25. Session Affinity: None
  26. Events: <none>
  27. ps auxw | grep kube-proxy
  28. 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
  29. root 29218 0.0 0.0 112660 980 pts/1 R+ 14:23 0:00 grep --color=auto kube-proxy
  30. $iptables-save | grep mysql
  31. -A KUBE-SEP-7P27CEQL6WJZRBQ5 -s 10.244.1.236/32 -m comment --comment "default/mysql:" -j KUBE-MARK-MASQ
  32. -A KUBE-SEP-7P27CEQL6WJZRBQ5 -p tcp -m comment --comment "default/mysql:" -m tcp -j DNAT --to-destination 10.244.1.236:3306
  33. -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
  34. -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
  35. -A KUBE-SVC-M7XME3WTB36R42AM -m comment --comment "default/mysql:" -j KUBE-SEP-7P27CEQL6WJZRBQ5
abithluo

abithluo1#

看起来你的服务配置得很好。
平10.96.138.132无应答:(
每个服务都有一个静态地址,因此无法ping它的情况是正常的,因为这只是一个虚拟地址,对其处理的请求与对实际地址的请求略有不同。
我在这里只看到两个原因,为什么你会有这个问题:
应用程序容器中的dns解析有问题。尝试使用 10.96.138.132 作为mysql地址而不是 mysql . 如果它解决了你的问题-那就是一个解决问题。顺便说一句,你可以使用服务ip而不是dns,正如我已经告诉-它是静态的。
转发规则有问题。检查 kube-proxy 登录 kube-system 命名空间,可能您将获得任何用于调试的附加信息。

ff29svar

ff29svar2#

根据你的svc,你应该能够 mysql:3306 从集群内部。
你试过了吗 kubectl exec -it r-user-app bash 从r应用程序容器中ping mysql? host mysql 应该返回类似“mysql.cluster.local”的地址127.21.0.01(示例)。或返回任何错误。如果没有错误,那么dbconnect()可能不喜欢主机名?

0vvn1miw

0vvn1miw3#

这实际上是法兰绒的问题。当我切换到使用weave作为cni时,服务发现和dns kube工作得很好。

  1. kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

相关问题