Google Code Prettify

2020年1月26日 星期日

K8s: cluster (hostname & IP)

接續上一篇「K8s: cluster (install)」,在安裝了 Kubernetes cluster 之後,現在要來觀察裡面的配置。
  • 部署一個 demo 程式
  • @RestController
    @RequestMapping("/host")
    public class HostController {
        @GetMapping("/info")
        public String info() {
            try {
                InetAddress ip = InetAddress.getLocalHost();
                return ip.getHostName() + " (" + ip.getHostAddress() + ")\n";
            } catch (UnknownHostException e) {
            }
            
            return "Unknown\n";
        }
    }
    
    這個 REST API 非常簡單,每次被呼叫就會傳回 hostname 和 ip,這樣我們就可以觀察安裝好 Kubernetes cluster 之後,倒底 Kubernetes 進行了怎麼樣的配置。部署的細節可以參考「部署 RESTful service 到 Kubernetes」,這裡假設已經部署了一個命名為 host 的 pod,並且服務名稱為 host-http。為了觀察,這裡先執行以下指令,讓 Kubernetes 把 Pod 增加為 3 個。
    kubectl scale rs host --replicas=3
    
  • IP & hostname
  • kubectl get pod
    
    要怎麼知道真的有 3 個 Pod ? 如上指令,可以看到紅框裡新產生的三個 Pod,並且知道這 3 個 Pod 的 hostname 分別為 host-24kw7、host-g7xdt、host-prlrl。那麼這 3 個 Pod 的 IP 呢? 如下 …
    kubectl describe svc host-http
    
    這個指令會把服務的詳細內容列出來,從這裡顯示的資訊可以了解,這 3 個 Pod 的 IP 分別為 10.244.1.14、 10.244.1.16、10.244.1.17,並且知道服務對內的 IP 為 10.106.92.190 (cluster ip)。那麼對外的 IP 呢? 就是機器本身的 IP,master node 的 IP 是 192.168.0.110,來測試一下 …
    curl http://192.168.0.110:32738/host/info
    
    真的顯示出其中一個 Pod 的 hostname 和 IP。上面的方法可以得到 hostname 和 IP,但是倒底那一個 hostname 對到那個 IP 卻不知道,如下的指令可以得到資訊。
    kubectl get pods -o wide
    
    根據上面的資訊,可以得知整個架構如下:
    為什麼 pod 的 port 是 9080? 因為我在程式的 application.properties 定義了如下的參數:
    server.port=9080
    server.servlet.context-path=/
    
    【番外篇1】
    pod 隨時可以被消滅,每次建立時 IP 並不一定會一樣,pod 間要相互訪問,可以透過 cluster IP,例如:
    kubectl exec host-g7xdt -- curl -s http://10.106.92.190:9080/host/info
    
    上述的指令是直接進到指定的 pod host-g7xdt,下 curl 指令。
    【番外篇2】
    不通過服務 (service) 的情況下與特定的 pod 通訊也是有辦法,Kubernetes 提供的轉發的機制,使用 kubectl port-forward,方法如下:
    kubectl port-forward host-g7xdt 10080:9080
    
    我把外部的 port 10080 對映到 host-g7xdt 的 port 9080,執行後會如下:
    接著開啟另一個 terminal,執行 curl 測看看,如下,仍可得到正確的回應。

    沒有留言:

    張貼留言