在使用aws的託管k8s--eks過程當中,避免不了使用aws的LB和塊存儲。AWS公有云全部的資源均可以自定義tags,這樣的好處就是能夠根據tag具體含義來對資源進行不一樣維度的審計和統計。好比按照部門,按照項目,環境(test,prod,uat)等維度。在設置service的類型爲Loadbanlance的時候,能夠經過如下annotations來自定義tag。git
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: "sgt:env=prod,sgt:group=SGT,sgt:project=hawkeye" labels: app: prometheus-server name: prometheus-server namespace: kube-system spec: ports: - name: http port: 9090 protocol: TCP targetPort: 9090 selector: app: prometheus-server type: LoadBalancer
可是惋惜的是,k8s當中的塊存儲(ebs
)並不支持這樣的方式。可能aws以爲存儲比較便宜,不值得進行審計吧。可是自己ebs是支持打tag的。github
因此爲了知足咱們司在k8s落地過程當中對存儲的審計,設計了add-ebs-tags-controller這個組件。api
你們都知道k8s中對於存儲是經過pv和pvc來實現的。於是add-ebs-tags-controller監聽全部新建的pvc,而後獲取到新建pvc的annotations(volume.beta.kubernetes.io/aws-block-storage-additional-resource-tags),最後調用aws的接口sdk,完成打tag的工做。app
具體代碼參見 github。ui
代碼相對比較簡單,你們能夠自行研究。整體實現思路和其餘的controller相似。都是監聽指定資源,而後分別對Update和add和delete三種事件,作出處理。spa
固然這裏不得不提一下,k8s controller設計的核心理念,controller經過監聽實際的狀態(status) ,不斷作出具體調整,向指望的狀態(spec) 靠輪。設計
具體部署的yaml以下:code
apiVersion: apps/v1 kind: Deployment metadata: name: add-ebs-tags-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: k8s-app: add-ebs-tags-controller task: tool template: metadata: labels: task: tool k8s-app: add-ebs-tags-controller annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: serviceAccount: cluster-admin containers: - name: add-ebs-tags-controller image: iyacontrol/add-ebs-tags-controller:0.0.1 imagePullPolicy: IfNotPresent
注意serviceAccount: cluster-admin,加入集羣中不存在admin角色,能夠自行進行rbac受權。server
例如:接口
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: prometheus-claim namespace: kube-system annotations: volume.beta.kubernetes.io/aws-block-storage-additional-resource-tags: "sgt:env=prod,sgt:group=SGT,sgt:project=hawkeye" spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi
建立成果之後,去aws的ui查看以下: