Openshift origin pods无法通过服务名称

时间:2017-07-21 11:26:34

标签: kubernetes openshift

我尝试过两个不同的应用程序,它们都包含一个需要连接到关系数据库的Web应用程序前端。

在这两种情况下,前端应用程序都无法连接到数据库。在这两个实例中,数据库也在OpenShift中作为容器(pod)运行。 Web应用程序使用服务名称作为URL。这两个应用程序都可以在其他OpenShift环境中使用。

  • OpenShift Master:v1.5.1 + 7b451fc
  • Kubernetes Master:v1.5.2 + 43a9be4
  • 使用Ansible Openshift安装
  • 单节点,此节点上有master
  • 主机操作系统:CentOS 7 Minimal

我不确定在OpenShift中查看调试此问题的位置。我能够从Web pod访问数据库pod的唯一方法是使用群集IP地址。

5 个答案:

答案 0 :(得分:1)

为了使内部DNS解析起作用,您需要确保dnsmasq.service正在运行,/etc/resolv.conf包含OCP节点本身的IP地址而不是其他DNS服务器(这些应该在{ {1}})。

示例:

/etc/dnsmasq.d/origin-upstream-dns.conf

^^注意/etc/resolv.conf中的调度程序脚本

# ip a s eth0
    ...
        inet 10.0.0.1/24


# cat /etc/resolv.conf 
    ...
    nameserver 10.0.0.1
    # nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh

^^此IP应为kubernetes服务IP(# systemctl status dnsmasq.service ● dnsmasq.service - DNS caching server. Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled) Active: active (running) # cat /etc/dnsmasq.d/origin-dns.conf no-resolv domain-needed server=/cluster.local/172.18.0.1

oc get svc -n default

如果OpenShift在某种OpenStack实例,AWS或类似实例上运行,# cat /etc/dnsmasq.d/origin-upstream-dns.conf server=<dns ip 1> server=<dns ip 2> 可能不会触发NetworkManager调度程序脚本,因此cloud-init不会被修改为指向{ {1}}。尝试重新启动整个网络,例如:

resolv.conf

我希望这会有所帮助。

答案 1 :(得分:0)

在OpenShift skydns是master的一部分,你可以重启master来重启内部dns,但我建议你试试这个: 1.检查dns是否可以使用dig解析您的服务名称 2.如果它失败了它的dns问题,或者它是iptables问题,你可以尝试重启kube代理(节点服务的一部分)来同步代理规则。

答案 2 :(得分:0)

我一直面临着使用SkyDNS连接到数据库的问题,例如phpMyAdmin,作为一种解决方法,我尝试输入ClusterIP而不是SkyDNS名称,并且它有效,您是否尝试过使用服务ClusterIP?

答案 3 :(得分:0)

我们暂时将 openshift 从 4.5.3 升级到 4.5.7 并观察状态。

看起来是 SkyDNS 问题,我想知道这是否会在 4.5.7 以后得到解决。

如果 DNS 请求失败或得到解决,以下命令将让您知道。尝试在堡垒节点上运行。

粘性(本地 DNS 查询)

DST_HOST=kubernetes.default.svc.cluster.local; while read wide; do   pod=$(echo ${wide} | awk '{print $1}');   node=$(echo ${wide} | awk '{print $7}');   while read wide2; do     ip=$(echo ${wide2} | awk '{print $6}');     node2=$(echo ${wide2} | awk '{print $7}');     echo -ne "`date +"%Y-%m-%d %T"` : ${pod}(${node}) querying ${DST_HOST} via ${ip}(${node2}): ";     oc exec -n openshift-dns ${pod} -- dig ${DST_HOST} +short &>/dev/null;     test "$?" -eq "0" && echo ok || echo failed;   done < <(oc get pods -n openshift-dns -o wide --no-headers); done < <(oc get pods -n openshift-dns -o wide --no-headers)

随机(Sprayed DNS Query,看看它们是否给出与上面相同的结果)

DST_HOST=kubernetes.default.svc.cluster.local; while read wide; do   pod=$(echo ${wide} | awk '{print $1}');   node=$(echo ${wide} | awk '{print $7}');   while read wide2; do     ip=$(echo ${wide2} | awk '{print $6}');     node2=$(echo ${wide2} | awk '{print $7}');     echo -ne "`date +"%Y-%m-%d %T"` : ${pod}(${node}) querying ${DST_HOST} via ${ip}(${node2}): ";     oc exec -n openshift-dns ${pod} -- dig @${ip} ${DST_HOST} -p 5353 +short &>/dev/null;     test "$?" -eq "0" && echo ok || echo failed;   done < <(oc get pods -n openshift-dns -o wide --no-headers); done < <(oc get pods -n openshift-dns -o wide --no-headers)

答案 4 :(得分:-2)

如果无法到达路线,则会发出