如何從網際網路訪問k8s叢集中的服務以及如何排錯

gself發表於2019-04-04

使用 traefik-ingress方案。ingress配置了自定義域名,無法訪問。

背景 客戶的服務申請了pingan.com集團二級域名,並配置到應用的 ingress 中,但是訪問不了

排錯步驟

  1. 二級域名 pingan.com(本例) 屬於外網 DNS 記錄,公司辦公網路解析不到地址,因此需要先判斷 DNS 定址是否正常。
  2. 如果 DNS 解析不到 IP 地址,則需要客戶向網路組確認是否成功新增記錄。
  3. 確認從域名到服務的網路路徑。
  4. 依次判斷網路是否連通,後端服務是否正常。

下面是客戶在servicebot上申請的域名解析:

url vip
xxx.pingan.com xxx.xxx.xxx.xxx

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

域名到服務的網路路徑:

Kubernetes_web-service_flow
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等等後端模型。

相關文章