<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小技巧!k8s 環(huán)境下調(diào)試服務(wù)

          共 4925字,需瀏覽 10分鐘

           ·

          2021-07-04 13:08

          本文面向 enginner 及 k8s 新手,老鳥可以跳過啦~ 但也需要了解 k8s, 比如至少知道 service, endpoint, pod, node 這些基本概念

          前兩年開始接觸學(xué)習(xí) k8s, 一直有紙上談兵的感覺。最近恰好項(xiàng)目需要,服務(wù)要整體遷移到 aws k8s 平臺,實(shí)踐中才發(fā)現(xiàn)原來很多地方理解不到位

          比如說如何調(diào)試 k8s 里的服務(wù)呢? 服務(wù)對外暴露了 service, 要查看 endpoints(就是后端的 real server) 是否掛載成功,如果沒有 endpoints 那就要用 kubectl logs 或是 kubectl describe 查看服務(wù) pod 是否啟動(dòng)成功。可以參考官網(wǎng)應(yīng)用故障排查[1]

          Pod 起不來的原因很多:鏡像 pull 失敗(墻內(nèi)), 資源不足無法調(diào)度,liveness 檢查失敗,服務(wù)自身 panic 等等一大堆 ...

          專用 pod

          由于 k8s 內(nèi)部網(wǎng)絡(luò)和物理機(jī)不在一個(gè)網(wǎng)段,如果你的服務(wù)沒有掛到 external lb 上面,那就需要創(chuàng)建專用的調(diào)試 pod, 然后進(jìn)到 k8s 網(wǎng)絡(luò)里

          apiVersion: v1
          kind: Pod
          metadata:
            name: dnsutils
            namespace: default
          spec:
            containers:
            - name: dnsutils
              image: ubuntu:18.04
              command: [ "/bin/bash", "-c", "--" ]
              args: [ "while true; do sleep 30; done;" ]
              imagePullPolicy: IfNotPresent
            restartPolicy: Always

          比如這里創(chuàng)建了名稱是 dnsutils 的 pod, 永久 sleep

          zerun.dong$ kubectl exec -i -t dnsutils -- /bin/bash
          root@dnsutils:/# cat /etc/resolv.conf
          nameserver 172.20.0.10
          search default.svc.cluster.local svc.cluster.local cluster.local

          root@dnsutils:/# curl -i http://service-name.namespace-name/xx/aa/bb/cc
          HTTP/1.1 405 Method Not Allowed
          Date: Tue, 22 Jun 2021 01:57:07 GMT
          Content-Length: 0

          比如這里使用 /bin/bash 進(jìn)到調(diào)試 pod 里,然后 curl 調(diào)用我服務(wù)的地址 http://service-name.namespace-name/xx/aa/bb/cc。

          這里要注意 service-name.namespace-name 是短域名,完整的應(yīng)該是 service-name.namespace-name.svc.cluster.local. 也可以直接用 container ip 進(jìn)行調(diào)試

          另外 k8s 也支持使用 kubectl debug 命令啟動(dòng)調(diào)試 pod, 也非常方便??傊袡?quán)限啥都好說,沒權(quán)限干瞪眼 ...

          登錄 node

          另外,如果有登錄宿主機(jī)的權(quán)限,也可以使用 nsenter 進(jìn)行調(diào)試

          原理就是nsenter attach 到目標(biāo)容器的 namespaces 中,一般我們都是進(jìn)到 net ns

           ~]# ps aux | grep -i envoy
          root     11023  0.0  0.0 119416   980 pts/0    S+   01:51   0:00 grep --color=auto -i envoy
          root     13808  0.4  0.4 373848 67248 ?        Ssl  Jun21   3:59 envoy -c /etc/envoy/envoy.yaml --log-format
          ~]# nsenter -u -i -n -p -t 13808 ip addr
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
              link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
              inet 127.0.0.1/8 scope host lo
                 valid_lft forever preferred_lft forever
          3: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
              link/ether 42:ce:9b:ce:c5:4a brd ff:ff:ff:ff:ff:ff link-netnsid 0
              inet 10.10.209.132/32 scope global eth0
                 valid_lft forever preferred_lft forever
          ~]# nsenter -u -i -n -p -t 13808 curl -i http://127.0.0.1:8081/help
          HTTP/1.1 200 OK
          content-type: text/plain; charset=UTF-8
          cache-control: no-cache, max-age=0
          x-content-type-options: nosniff
          date: Tue, 22 Jun 2021 01:52:43 GMT
          server: envoy
                  "domains": [
                   "xxxx.domain.name"
                  ],
                  "routes": [

          比如上面的例子,13808 是 envoy 在宿主機(jī)上的進(jìn)程 id, 有些端口并沒有暴露給宿主機(jī),或是 lb, 只能進(jìn)到 net ns 里調(diào)試

          kt-connect

          阿里以前開源了一個(gè) kt-connect[2] 項(xiàng)目。宣稱是研發(fā)側(cè)利器,本地連通 Kubernetes 集群內(nèi)網(wǎng)。不過一年多沒有更新,猜測又是 kpi 式開源?還是項(xiàng)目移植走了?

          理念超級棒??梢詫?k8s 流量導(dǎo)到開發(fā)機(jī)本地,也能將本地服務(wù)暴露到 k8s 中。我們目前沒有采用,現(xiàn)在仍然是每次修改都要 deploy 到 dev k8s 環(huán)境中

          上面是架構(gòu)圖,可以參考云原生環(huán)境下的開發(fā)測試[3]。沒啥黑科技,就是在集群內(nèi)部設(shè)置代理影子容器,負(fù)責(zé)轉(zhuǎn)發(fā)流量,有時(shí)間這塊再寫一篇分享

          小結(jié)

          今天的分享就這些,寫文章不容易,如果對大家有所幫助和啟發(fā),請大家?guī)兔c(diǎn)擊再看,點(diǎn)贊,分享 三連

          官方也有相關(guān) blog[4], 可以參考。關(guān)于調(diào)試 k8s 服務(wù)大家有什么看法,歡迎留言一起討論,大牛多留言 ^_^

          參考資料

          [1]

          應(yīng)用故障排查: https://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-application/,

          [2]

          kt-connect: https://github.com/alibaba/kt-connect,

          [3]

          云原生環(huán)境下的開發(fā)測試: https://zhuanlan.zhihu.com/p/144273459,

          [4]

          調(diào)試運(yùn)行中的 Pod: https://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-running-pod/,




          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲??;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。


          瀏覽 70
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  岛国免费播放器无码 | 日韩精品AV无码一区二区三区 | 超碰在线人人妻 | 亚洲精品九九九 | 日韩不卡|