APIServer ,etcd,kube-controller-manager,kube-scheduler,kube-proxy 等 K8s 組件的 Pod IP 地址(也就是它們監聽的地址)默認都是他們所在 Node 的 IP 地址。
這些一般在搭建K8s集群的時候指定( 也可以在它們的 yaml 文件中的某個參數中修改) ,APIServer ,etcd,kube-controller-manager,kube-scheduler 等是以 static pod 的形式部署在 master 節點的,所以它們對應的 yaml 文件默認位於 master 節點的 /etc/kubernetes/manifests/ 目錄下。
而 kube-proxy 的配置需要在 kube-system 命名空間下的名為 kube-proxy 的configmap中修改。(kubectl edit configmap kube-proxy -n kube-system)
以 APIServer 舉例:
APIServer 監聽的 IP 是由參數 --advertise-address 指定,這個參數是用來指定APIServer 和其他組件之間通訊的地址或者它的監聽地址(也是 APIServer pod 的 IP 地址)。如果不指定,它默認的判定方法會選取機器默認的網卡ip地址。
雲端的master節點一般同時具有公網IP 和內網IP,默認是內網IP, 因此 apiserver pod 的 IP 默認是雲端 master 節點的內網 IP,因此邊緣節點想要訪問雲端master節點中的apiserver,必須通過 APIServer 的公網地址(即雲端節點公網IP的6443端口)來訪問,不能通過 kubernetes這個service(default命名空間下名為kubernetes的service,這個服務的端口是443,其背后的endpoint為apiserver的pod ip:6443)來訪問,因為這個service后端的endpoint是雲端master節點的內網IP:6443,而邊緣節點與雲端節點不在一個局域網中(目的地址為私有地址的數據包會被路由器直接丟棄,不會進行轉發)。
參考文章:
kubernetes中apiserver的地址指定問題 :: 觸寶運維團隊文檔 (haojianxun.github.io)