簡體   English   中英

在運行Nginx入口控制器kubernetes時需要服務的(內部)名稱

[英]Want (internal) name for service while running nginx ingress controller kubernetes

在VirtualBox Centos7 VM上將kubeadm與兩節點群集一起使用。 我有一個用R編寫的應用程序和一個位於各自容器中的mysql數據庫。 我已經成功按照說明設置了nginx入口控制器,以便可以通過本地計算機在VM外部訪問該應用程序。 檢查:)

但是,現在當應用程序(R)嘗試訪問mysql服務時,名稱無法解析。 與從bash ping'mysql'相同。 這不再起作用:

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

相反,我必須使用工作區的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 app容器中ping mysql? host mysql應該返回類似“ mysql.cluster.local”的地址為127.21.0.01“(示例)。或者返回任何錯誤。如果沒有錯誤,則dbConnect()可能不喜歡主機名?

看來您的服務配置正確。

ping 10.96.138.132無響應:(

每個服務都有一個靜態地址,因此您無法ping它的情況是正常的,因為那只是一個虛擬地址,對其處理的請求與對真實地址的請求有些不同。

我在這里只看到有兩個原因可以解決這個問題:

  1. 應用程序容器中的DNS解析存在問題。 嘗試使用10.96.138.132作為MySQL地址而不是mysql 如果它解決了您的問題,那就是解決的問題。 順便說一句,您可以使用服務IP代替DNS,正如我已經告訴過的-它是靜態的。
  2. 轉發規則出了點問題。 檢查kube-proxy kube-system命名空間中的kube-proxy日志,也許您會獲得任何其他調試信息。

這實際上是法蘭絨的問題。 當我切換為使用Weave作為CNI時,服務發現和DNS kube可以正常工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM