使用 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等等後端模型。