使用 traefik-ingress方案。ingress配置了自定义域名,无法访问。
背景 客户的服务申请了pingan.com集团二级域名,并配置到应用的 ingress 中,但是访问不了
排错步骤
- 二级域名 pingan.com(本例) 属于外网 DNS 记录,公司办公网络解析不到地址,因此需要先判断 DNS 寻址是否正常。
- 如果 DNS 解析不到 IP 地址,则需要客户向网络组确认是否成功添加记录。
- 确认从域名到服务的网络路径。
- 依次判断网络是否连通,后端服务是否正常。
下面是客户在servicebot上申请的域名解析:
url | vip |
---|---|
xxx.pingan.com | xxx.xxx.xxx.xxx |
可以看到解析出了正确地址。
域名到服务的网络路径:
过程解释: 通常客户的应用需要提供对互联网的服务,都需要部署在 DMZ 网络区域中。
- 客户通过网络组申请了公网域名,公网域名对应一个公网 IP(e.g. xxx.28.212.56),公网 IP 将流量转发到 VIP。
- ELB(负载均衡)在云平台上购置,会产生一个VIP,这个VIP将前端过来的流量转发到客户的 node 节点上。
- 在 node 上运行 traefik,监听 80 端口,接收来自 VIP 的请求。 traefik 将接收到的请求丢给apiserver,实际上 traefik 担任 ingress controller。
- traefik 和 Kubernetes API 实时地打交道,获取 ingress 的信息,从而得知具体的 URL 与 service 对应关系。
- 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等等后端模型。
所有评论(0)