1. 程式人生 > 實用技巧 >kubernets之服務發現

kubernets之服務發現

一 服務與pod的發現

  1.1 服務發現pod是很顯而易見的事情,通過簡稱pod的標籤是否和服務的標籤一致即可,但是pod是如何發現服務的呢?這個問題其實感覺比較多餘,但是接下來你就可能不這麼想了

  首先,眾所周知,pod是有生命週期,並且受控於它的管控器(RC等),當節點從叢集中離開,則管控器需要重新建立pod,此時RC和pod裡面都無服務的資訊,那麼是如何發現服務的呢?

  1.2 一個簡單的方法是通過環境變數的形式來發現服務,但是這種方式,只能是服務在pod之前建立,因為這樣叢集才能將服務的相關的資訊以環境變數的形式寫入進去

    我們先刪除現有的pod,刪除之後RC會感知到叢集裡面的pod數量不符合預期,於是會重新建立3個pod

[root@node01 Chapter05]# k delete po --all
pod "kubia-2z6kz" deleted
pod "kubia-m79rd" deleted
pod "kubia-trmbx" deleted

[root@node01 Chapter05]# k get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-44qx4   1/1     Running   0          63s
kubia-665qt   1/1     Running   0          63s
kubia-k9cw8   1
/1 Running 0 63s

  

  1.3 之後檢視任意的一個pod內部容器的環境變數可知

[root@node01 Chapter05]# k exec kubia-k9cw8 -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubia-k9cw8
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBIA_SERVICE_HOST=10.109.29.64
KUBIA_SERVICE_PORT=80
KUBIA_PORT_80_TCP=tcp://10.109.29.64:80
KUBIA_PORT_80_TCP_ADDR=10.109.29.64 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBIA_PORT=tcp://10.109.29.64:80 KUBERNETES_SERVICE_PORT=443 KUBERNETES_SERVICE_HOST=10.96.0.1 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_PORT_443_TCP_PORT=443 KUBIA_PORT_80_TCP_PROTO=tcp KUBIA_PORT_80_TCP_PORT=80 KUBERNETES_PORT=tcp://10.96.0.1:443 NPM_CONFIG_LOGLEVEL=info NODE_VERSION=7.9.0 YARN_VERSION=0.22.0 HOME=/root

  環境變數如紅色字型標註出來一致,可以通過環境的變數的形式來發現服務的存在

  1.4 通過環境變數的形式發現服務總覺得有些不盡人意,何不嘗試使用DNS的形式發現服務

事實上,kubernets確實允許通過DNS的形式來訪問服務,並且這種方式比環境變數的形式要優秀很多

  我們首先來看叢集中執行DNS服務的在哪裡

[root@node01 Chapter05]# k get po --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
default       kubia-44qx4                      1/1     Running   0          13m
default       kubia-665qt                      1/1     Running   0          13m
default       kubia-k9cw8                      1/1     Running   0          13m
kube-system   coredns-fb8b8dccf-gfkss          1/1     Running   1          3d3h
kube-system   coredns-fb8b8dccf-tjr6m          1/1     Running   1          3d3h
kube-system   etcd-master                      1/1     Running   1          3d3h
kube-system   kube-apiserver-master            1/1     Running   0          3d3h
kube-system   kube-controller-manager-master   1/1     Running   1          3d3h
kube-system   kube-flannel-ds-b95br            1/1     Running   0          3d2h
kube-system   kube-flannel-ds-mwlgl            1/1     Running   0          3d3h
kube-system   kube-flannel-ds-w4mvw            1/1     Running   0          3d2h
kube-system   kube-proxy-2h9ck                 1/1     Running   0          3d3h
kube-system   kube-proxy-qprh7                 1/1     Running   0          3d2h
kube-system   kube-proxy-z6nwk                 1/1     Running   0          3d2h
kube-system   kube-scheduler-master            1/1     Running   1          3d3h

 

 如紅色字型顯示,他在kube-system這個名稱空間裡,並且為所有的pod提供DNS服務那麼他又是如何做到的呢,我們看下/etc/resolv.conf

[root@node01 Chapter05]# k get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-44qx4   1/1     Running   0          16m
kubia-665qt   1/1     Running   0          16m
kubia-k9cw8   1/1     Running   0          16m

[root@node01 Chapter05]# k exec kubia-k9cw8 -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@node01 Chapter05]# k exec kubia-665qt -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@node01 Chapter05]# k exec kubia-44qx4 -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

每個pod裡面/etc/resolv.conf都已經有了相關的配置於是訪問服務就變得更加簡單了

  1.5 可以直接通過DNS的形式進行訪問

root@kubia-44qx4:/# curl -s http://kubia.default.svc.cluster.local
You've hit kubia-k9cw8

root@kubia-44qx4:/# curl -s http://kubia.default You've hit kubia-665qt

root@kubia-44qx4:/# curl -s http://kubia You've hit kubia-k9cw8

注意:.svc.cluster.local這個是叢集設定的,如果在相同的名稱空間裡面甚至可以直接用svc的名稱加埠號訪問

在不同的命令空間的svc只需要新增服務名稱加名稱空間和埠號(在同一個叢集)