前言
在使用aws的托管k8s--eks过程中,避免不了使用aws的LB和块存储。AWS公有云所有的资源都可以自定义tags,这样的好处就是可以根据tag具体含义来对资源进行不同维度的审计和统计。比如按照部门,按照项目,环境(test,prod,uat)等维度。在设置service的类型为Loadbanlance的时候,可以通过以下annotations来自定义tag。
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的。
所以为了满足我们司在k8s落地过程中对存储的审计,设计了add-ebs-tags-controller这个组件。
add-ebs-tags-controller 详解
设计思路
大家都知道k8s中对于存储是通过pv和pvc来实现的。因而add-ebs-tags-controller监听所有新建的pvc,然后获取到新建pvc的annotations(volume.beta.kubernetes.io/aws-block-storage-additional-resource-tags),最后调用aws的接口sdk,完成打tag的工作。
代码实现
具体代码参见 github。
代码相对比较简单,大家可以自行研究。总体实现思路和其他的controller类似。都是监听指定资源,然后分别对Update和add和delete三种事件,做出处理。
当然这里不得不提一下,k8s controller设计的核心理念,controller通过监听实际的状态(status) ,不断做出具体调整,向期望的状态(spec) 靠轮。
部署
具体部署的yaml如下:
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授权。
demo
例如:
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查看如下:
有疑问加站长微信联系(非本文作者)