安利一波广告,欢迎大家试用目前本人 maintain 的EMQX Kubernete Operator

最近在社区中接到用户反馈Release manifests has broken metrics
描述如下:
issue-info
使用 release-1.1.5 版本,看到对于目前对于 Operatlrmetrics 保护机制是采用的 kube-rbac-proxy,此处相关的内容也可以通过查看 kubebuilder官方文档进行具体的阅读。

根据 Issue 反馈其实很快能定位到应该是 Service 没有匹配的 Container Port,看下 release-1.1.5 中的代码,如下
release-1.1.5-manifests
可以看到 emqx-operator-controller-manager-metrics-service 中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Service
metadata:
labels:
control-plane: controller-manager
name: emqx-operator-controller-manager-metrics-service
namespace: emqx-operator-system
spec:
ports:
- name: https # 配置了 https
port: 8443 # 端口是 8443
targetPort: https
selector:
control-plane: controller-manager

Operator 相应的 Deployment.spec.containers.ports 内容如下:

1
2
3
4
ports:
- containerPort: 9443
name: webhook-server #只存在 webhook-server 相关的配置
protocol: TCP

果不其然,确实这块的配置缺少了,但是考虑到目前在私有化交付或者公有化的交付过程中的保护机制,以及一些镜像维护的成本先暂不对外使用基于 kube-rbac-proxyPod 内部权限检查的机制,那么我们就得针对于 MetricsEndPoint 提供一套默认的配置,方便使用者能够针对 /MetricsEndPoint 进行 metrics 采集。

基于 kustomizeconfig 维护

关于 kustomize 的基础这里就不阐述了,重点关注下 config/default/kustomization.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bases:
- ../crd
- ../rbac
- ../manager
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
- ../webhook
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required.
- ../certmanager
# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'.
#- ../prometheus 此处目前是需要部署 对应的 ServiceMonitor 的 目前暂不开放此配置,有能力的用户可以自己generate yaml

patchesStrategicMerge:
# Protect the /metrics endpoint by putting it behind auth.
# If you want your controller-manager to expose the /metrics
# endpoint w/o any authn/z, please comment the following line.
# - manager_auth_proxy_patch.yaml # 重点就是此时的patch.yaml

# Mount the controller config file for loading manager configurations
# through a ComponentConfig type
#- manager_config_patch.yaml

# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
- manager_webhook_patch.yaml

此时看关联的 patch.yaml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# This patch inject a sidecar container which is a HTTP proxy for the
# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews.
apiVersion: apps/v1
kind: Deployment
metadata:
name: controller-manager
namespace: system
spec:
template:
spec:
containers:
- name: kube-rbac-proxy
image: gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0
args:
- "--secure-listen-address=0.0.0.0:8443"
- "--upstream=http://127.0.0.1:8080/"
- "--logtostderr=true"
- "--v=10"
ports: #重点关注点,因为 patch 文件被注释了,所以关于这段patch 内容就没有生成,所以出现了 issue 出现的问题
- containerPort: 8443
name: https
- name: manager
args:
- "--health-probe-bind-address=:8081"
- "--metrics-bind-address=127.0.0.1:8080"
- "--leader-elect"

基于交付场景的考虑,目前在工程中暂不开放 manager_auth_proxy 的配置,但是为了让用户可以对 metrics 进行相关的查看,我们需要提供默认的配置,同时还要让用户对工程项目的配置最小化改动,最终的方案是提供基于 http:8080 的默认配置,追加一套 patch 文件,当有能力维护的用户想要自定义的时候他可以取消对 # - manager_auth_proxy_patch.yaml 的配置,实际上是触发了 patch$delete 动作。

明细的改动可以查看release-1.1.6去了解。

最后还是发版快乐,后续的 RoadMap 已经开始 1.2.x 的计划了,将进行 .spec 以及事件日志以及状态采集的优化。