Требуется (внутреннее) имя для службы при запуске входного контроллера nginx kubernetes - PullRequest
0 голосов
/ 24 апреля 2018

Использование kubeadm с двухузловым кластером на виртуальных машинах VirtualBox Centos7.У меня есть приложение, написанное на R, и база данных mysql, каждая в своих модулях.Я успешно выполнил инструкции по настройке входного контроллера nginx , чтобы приложение могло быть доступно вне виртуальных машин на моей локальной машине.check:)

Однако теперь, когда приложение (R) пытается связаться со службой mysql, имя не разрешается.То же самое с пингом «mysql» из bash.Это больше не работает:

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

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Похоже, ваш сервис настроен хорошо.

ping 10.96.138.132 нет ответа :(

Каждый сервис имеет статический адрес, поэтому ситуация, когда вы не можетеping это нормально, потому что это просто виртуальный адрес, и запросы на его обработку немного отличаются от запросов на реальные адреса.

Я вижу здесь только 2 причины, по которым у вас может возникнуть эта проблема:

  1. Что-то не так с разрешением DNS в контейнере с приложением. Попробуйте использовать 10.96.138.132 в качестве адреса MySQL вместо mysql. Если это решит вашу проблему - это решающая проблема. Кстати, вы можетеиспользуйте IP-адрес службы вместо DNS, как я уже сказал - он статический.
  2. Что-то не так с правилами переадресации. Проверьте kube-proxy, регистрирует в kube-system пространство имен, возможно, вы получите любую дополнительную информацию для отладки.
0 голосов
/ 17 мая 2018

Это на самом деле проблема с фланелевой .Когда я переключился на использование Weave в качестве CNI, обнаружение службы и DNS-куб работают нормально.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
0 голосов
/ 25 апреля 2018

Исходя из вашего SVC, вы должны быть в состоянии достичь mysql:3306 из кластера.

Вы пробовали kubectl exec -it r-user-app bash и пинговали mysql из контейнера приложения R? host mysql должно возвращать что-то вроде "mysql.cluster.local" с адресом 127.21.0.01 "(пример). Или возвращать любую ошибку. Если ошибки нет, то, возможно, dbConnect () не нравится имя хоста?

...