在 Kubernetes (K8s) 上部署 kube-state-metrics 和 cAdvisor,并允许外部访问它们的 metrics 接口,同时配置 RBAC 鉴权,可以按照以下步骤进行。
1. 部署 kube-state-metrics
kube-state-metrics 是一个服务,它监听 Kubernetes API 并生成关于集群状态的 metrics。
1.1 创建 RBAC 资源
首先,创建 kube-state-metrics 所需的 RBAC 资源。
apiVersion: v1
kind: ServiceAccount
metadata:name: kube-state-metricsnamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: kube-state-metrics
rules:
- apiGroups: [""]resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]verbs: ["list", "watch"]
- apiGroups: ["extensions", "apps"]resources: ["daemonsets", "deployments", "replicasets", "statefulsets"]verbs: ["list", "watch"]
- apiGroups: ["batch"]resources: ["cronjobs", "jobs"]verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]resources: ["horizontalpodautoscalers"]verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kube-state-metrics
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kube-state-metrics
subjects:
- kind: ServiceAccountname: kube-state-metricsnamespace: kube-system
1.2 部署 kube-state-metrics
接下来,部署 kube-state-metrics。
apiVersion: apps/v1
kind: Deployment
metadata:name: kube-state-metricsnamespace: kube-system
spec:replicas: 1selector:matchLabels:app: kube-state-metricstemplate:metadata:labels:app: kube-state-metricsspec:serviceAccountName: kube-state-metricscontainers:- name: kube-state-metricsimage: k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.4.2ports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: kube-state-metricsnamespace: kube-systemlabels:app: kube-state-metrics
spec:ports:- port: 8080targetPort: 8080protocol: TCPselector:app: kube-state-metricstype: LoadBalancer
1.3 外部访问
通过 LoadBalancer 类型的 Service,kube-state-metrics 的 metrics 接口可以通过外部 IP 访问。
2. 部署 cAdvisor
cAdvisor 是一个容器资源使用和性能分析工具,通常与 kubelet 集成。你可以通过 kubelet 的 metrics 接口访问 cAdvisor 的数据。
2.1 配置 kubelet 以暴露 cAdvisor metrics
cAdvisor 的 metrics 通常通过 kubelet 的 --cadvisor-port 参数暴露。默认情况下,kubelet 会在 4194 端口暴露 cAdvisor metrics。
确保 kubelet 的配置中包含以下参数:
--cadvisor-port=4194
2.2 创建 Service 以暴露 cAdvisor metrics
创建一个 Service 来暴露 kubelet 的 cAdvisor metrics。
apiVersion: v1
kind: Service
metadata:name: cadvisornamespace: kube-system
spec:ports:- port: 4194targetPort: 4194protocol: TCPselector:k8s-app: kubelettype: LoadBalancer
2.3 外部访问
通过 LoadBalancer 类型的 Service,cAdvisor 的 metrics 接口可以通过外部 IP 访问。
3. 配置 RBAC 鉴权
为了确保只有授权的用户或服务可以访问这些 metrics,你可以配置 RBAC 规则。
3.1 创建 Role 和 RoleBinding
假设你希望允许某个特定的 ServiceAccount 访问 kube-state-metrics 和 cAdvisor 的 metrics。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: metrics-readernamespace: kube-system
rules:
- apiGroups: [""]resources: ["services"]verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: metrics-reader-bindingnamespace: kube-system
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: metrics-reader
subjects:
- kind: ServiceAccountname: <your-service-account>namespace: <your-namespace>
3.2 使用 Token 进行访问
你可以使用 ServiceAccount 的 Token 来访问 metrics 接口。获取 Token 的方式如下:
kubectl -n <your-namespace> get secret $(kubectl -n <your-namespace> get sa <your-service-account> -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
然后,使用该 Token 访问 metrics 接口:
curl -k -H "Authorization: Bearer <token>" https://<external-ip>:<port>/metrics
4. 总结
通过以上步骤,你可以在 Kubernetes 集群中部署 kube-state-metrics 和 cAdvisor,并通过 LoadBalancer 类型的 Service 暴露它们的 metrics 接口。同时,通过 RBAC 配置,你可以控制哪些用户或服务可以访问这些 metrics。