使用 traefik-ingress方案。ingress配置了自定义域名,无法访问。

背景 客户的服务申请了pingan.com集团二级域名,并配置到应用的 ingress 中,但是访问不了

排错步骤

  1. 二级域名 pingan.com(本例) 属于外网 DNS 记录,公司办公网络解析不到地址,因此需要先判断 DNS 寻址是否正常。
  2. 如果 DNS 解析不到 IP 地址,则需要客户向网络组确认是否成功添加记录。
  3. 确认从域名到服务的网络路径。
  4. 依次判断网络是否连通,后端服务是否正常。

下面是客户在servicebot上申请的域名解析:

urlvip
xxx.pingan.comxxx.xxx.xxx.xxx

可以看到解析出了正确地址。

域名到服务的网络路径:

Kubernetes_web-service_flow

过程解释: 通常客户的应用需要提供对互联网的服务,都需要部署在 DMZ 网络区域中。

  1. 客户通过网络组申请了公网域名,公网域名对应一个公网 IP(e.g. xxx.28.212.56),公网 IP 将流量转发到 VIP。
  2. ELB(负载均衡)在云平台上购置,会产生一个VIP,这个VIP将前端过来的流量转发到客户的 node 节点上。
  3. 在 node 上运行 traefik,监听 80 端口,接收来自 VIP 的请求。 traefik 将接收到的请求丢给apiserver,实际上 traefik 担任 ingress controller。
  4. traefik 和 Kubernetes API 实时地打交道,获取 ingress 的信息,从而得知具体的 URL 与 service 对应关系。
  5. traefik 将请求转发到后端 service。

通过命令验证:

# 首先要看 VIP 是否可访问
# 这里例子是可访问的,当然就没问题了
[root@SHB-L0117161 ~]# telnet xxx.128.118.241 80
Trying xxx.128.118.241...
Connected to xxx.128.118.241.
Escape character is '^]'.
exit

复制代码

1.验证VIP是否可访问,注意要在VIP所在网段,否则可能没有开通防火墙。

# traefik label
# 215.128.118.201 是 VIP 转发过来的其中一个 node
[root@SHB-L0075967 ~]# kubectl get nodes -o=wide --show-labels | sed -n '1p;/215\.128\.118\.201/p'
NAME              STATUS     ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE                  KERNEL-VERSION               CONTAINER-RUNTIME   LABELS
215.128.118.201   Ready      <none>    42d       v1.9.1    <none>        CentOS Linux 7 (Core)     3.10.0-693.21.1.el7.x86_64   docker://17.5.0     CAAS_LOG_CLOUD=INSTALLING,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,caas_cluster=shb-dmz-fp-core-stg-106593af,host_name=SHB-L0117161,kubernetes.io/hostname=215.128.118.201,lb=traefik
[root@SHB-L0075967 ~]# kubectl get pods -o=wide --namespace=kube-system | sed -n '1p;/215\.128\.118\.201/p'
NAME                                      READY     STATUS             RESTARTS   AGE       IP                NODE
caas-log-helper-2hvqt                     1/1       Running            0          42d       172.1.115.2       215.128.118.201
traefik-ingress-lb-4z76b                  1/1       Running            0          5d        215.128.118.201   215.128.118.201
[root@SHB-L0075967 ~]#
复制代码

2.查看 VIP 的后端 node IP是否有运行 traefik,这里只查看了其中一个节点,如上图所示的三个节点都必须要有运行才正常。

[root@SHB-L0117161 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 215.128.118.201  netmask 255.255.255.192  broadcast 215.128.118.255
        inet6 fe80::453:7aff:fe01:d3d3  prefixlen 64  scopeid 0x20<link>
        ether 06:53:7a:01:d3:d3  txqueuelen 1000  (Ethernet)
        RX packets 18242994  bytes 11646816745 (10.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17043276  bytes 25852317409 (24.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@SHB-L0117161 ~]# lsof -i :80
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
traefik 23819 root    3u  IPv6 64172224      0t0  TCP *:http (LISTEN)
[root@SHB-L0117161 ~]#
复制代码

3.查看node上 traefik 是否正常监听,到这一步都正常,且确保防火墙开通的话,那浏览器过来的请求就已经到达 k8s 集群中了,剩下的就是 k8s 集群通过 ingress 组件找到具体服务。

# ingress
[root@SHB-L0075967 ~]# kubectl get ingresses -o=wide --namespace=shb-dmz-fp-core-stg-106593af
NAME                    HOSTS                      ADDRESS   PORTS     AGE
fp-core-outer-gateway   ifin-emp-stg1.pingan.com             80        17d
ises-ds-service         *                                    80        12d
[root@SHB-L0075967 ~]# kubectl -o=yaml get ingresses fp-core-outer-gateway --namespace=shb-dmz-fp-core-stg-106593af
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  creationTimestamp: 2018-10-12T03:58:19Z
  generation: 1
  name: fp-core-outer-gateway
  namespace: shb-dmz-fp-core-stg-106593af
  resourceVersion: "51549923"
  selfLink: /apis/extensions/v1beta1/namespaces/shb-dmz-fp-core-stg-106593af/ingresses/fp-core-outer-gateway
  uid: 0e12b199-cdd3-11e8-9a84-06f8b40001a8
spec:
  rules:
  - host: xxxx-emp-stg1.pingan.com
    http:
      paths:
      - backend:
          serviceName: fp-core-outer-gateway
          servicePort: 8088
        path: /
status:
  loadBalancer: {}
复制代码

4.验证一下 ingress 中所配置的 URL 与 后端 service 的对应关系是否正确。

**PS. 本次举例的问题最后排查到是三台负责负载的客户 node 的其中一台上,flanneld 组件挂了,导致 ELB 判断服务不可用。所以必须保证负载节点所有节点服务一直正常。换句话说,ELB 只管负载均衡,不管高可用。 **

Ingress简介:

  • 理解 Ingress 简单的说,Ingress 就是从 Kubernetes 集群外访问集群的入口,将用户的 URL 请求转发到不同的 service 上。Ingress 相当于 nginx、apache 等负载均衡反向代理服务器,其中还包括规则定义,即 URL 的路由信息,路由信息的刷新由 Ingress controller 来提供。
  • 理解 Ingress Controller Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 Kubernetes API 打交道,实时地感知后端 service、pod 等变化,比如新增和减少 pod,service 增加和减少等;当得到这些变化信息后, Ingress Controller 再结合 Ingress 生产配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用。

介绍 Traefik: Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API等等后端模型。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐