最近面臨一個需求,如何監控多個K8s集群的service,並將其名下的pod們的IP記錄下來,便於管理把,主要是做網絡方面的ACL。
在使用一種新的語言前,我是習慣於去看看菜鳥教程的,因為這可以讓你迅速可以寫出自己的first little pro。但是 想要更上一層就需要閱讀別人的源碼啦。對於K8s 我師傅曾說過這主要是針對接口的使用,如果真的有技術含量的部分,那肯定就是網絡部分了,網絡的實現,如何改善K8s網絡和外部的通訊。
client-go的github地址:https://godoc.org/admiralty.io/multicluster-controller,client-go裡面的examples會給我們提供一個模板,還有一些有用的函數,不用重新編寫,比如獲取kubeconfig home文件夾的HomeDir(),以及一些數據結構定義及其相關接口實現。
然後,GoDOC: https://godoc.org/admiralty.io/multicluster-controllerhttps://godoc.org/k8s.io/apimachinery/pkg/apis/meta/v1這個地方我們能夠找到我們所需數據結構定義,以及所在的包目錄等等。
本次主要監測K8s集群對象類型是service下面的pod,以service為粒度劃分,所以不能使用單獨的service監測的接口,需要使用endpoints這個對象,因為endpoints不僅監測servie本省增刪改查,還監測其下面包含的pod(Subesets)的變化,這個滿足我們對於pod IP監測的需要。主要涉及到的package如下:
實現過程及思路:
將K8s集群kubeconfig信息存入固定文件夾,將其加入環境變量,通過config.AllNamedConfigsAndNamespaces()生成config列表,遍歷該列表,形成個集群的clientset,生成serviceLookupController,加入到multicluster-controller包的manager對象,之後開始監測配置文件中讀入的service列表,相關主要內容如下:


