Consul · 集群内服务发现与 KV 存储
Consul 在本集群里担任服务发现与键值存储的角色(README 中归类为「服务发现」)。它以单副本 server 模式运行(-server -bootstrap-expect=1),启用了内置 Web UI 和 DNS 接口,数据中心标识为 dc1。
部署形态上它是一个单节点自举的 Consul agent:consul agent -server -ui -bootstrap-expect=1,绑定 0.0.0.0,以 Pod IP 作为 advertise 地址,并通过 headless Service 的集群内 DNS 名做 retry-join,gossip 流量用 GOSSIP_ENCRYPTION_KEY 加密。
部署形态
- Name
- 命名空间
- Description
- consul(kustomization 设定
namespace: consul,独立于 data category 的目录归类;无 namePrefix)
- Name
- 工作负载
- Description
- StatefulSet
consul,serviceName: consul-headless,replicas: 1
- Name
- 镜像
- Description
hashicorp/consul:2.0.0(直接写在容器 image,kustomization 无images:块,不归 argocd-image-updater 管理)
- Name
- 调度
- Description
nodeSelector: node-role=database—— 按 README,该标签仅 k8s-worker3 持有,所以 Consul 固定落在 worker3
- Name
- 端口
- Description
- 8500 http、8502 grpc、8600 dns、8301 serf-lan、8302 serf-wan、8300 server
- Name
- 存储
- Description
- PVC
consul-data,ReadWriteOnce,storageClassName: nfs-client,10Gi,挂载到/consul/data
- Name
- 资源
- Description
- requests 250m CPU / 256Mi,limits 1000m CPU / 1Gi
- Name
- 探针
- Description
- liveness 与 readiness 均为 HTTP GET
/v1/status/leaderon 8500
- Name
- RBAC
- Description
- ServiceAccount
consul+ Role(pods的get/list)+ RoleBinding
启动命令与 ConfigMap 中的 server.json 描述一致:datacenter=dc1、data_dir=/consul/data、bootstrap_expect=1、retry_join 指向 headless Service。容器实际以内联 shell 命令启动,server.json 挂载在 /tmp/consul-config(readOnly),作为同源配置参考。
配置与依赖
ConfigMap consul-config 的 server.json 关键项:
| 配置项 | 值 |
|---|---|
| datacenter | dc1 |
| ports.https | -1(禁用 HTTPS) |
| ports.http / grpc / dns | 8500 / 8502 / 8600 |
| telemetry.prometheus_retention_time | 60s |
| performance.raft_multiplier | 1 |
| leave_on_terminate | true |
| skip_leave_on_interrupt | false |
ExternalSecret consul-secret 经 ClusterSecretStore vault-backend 从 Vault 拉取,刷新间隔 1h,生成同名 Secret consul-secret:
- Name
- CONSUL_HTTP_TOKEN
- Description
- remoteRef
secret/database/prod/consul的http_token
- Name
- GOSSIP_ENCRYPTION_KEY
- Description
- remoteRef
secret/database/prod/consul的gossip_key
两个值通过 secretKeyRef 注入容器环境变量;GOSSIP_ENCRYPTION_KEY 用于启动命令的 -encrypt。另外注入了 POD_IP/POD_NAME/POD_NAMESPACE(downward API),POD_IP 作为 advertise 地址。
命名空间设有 ResourceQuota consul-quota(pods 10、requests 500m/512Mi、limits 2/2Gi)与 LimitRange consul-limits(容器默认 requests 50m/64Mi、limits 100m/128Mi)。
访问与监控
集群内有三个 Service:
| Service | 类型 | 端口 | 说明 |
|---|---|---|---|
| consul | ClusterIP | 8500 http / 8502 grpc / 8600 dns | 主访问入口 |
| consul-headless | Headless(clusterIP None) | 8500 / 8502 / 8301 / 8302 / 8300 / 8600 | publishNotReadyAddresses: true,供 retry-join 与 StatefulSet 寻址 |
| consul-ui | NodePort | 8500(nodePort 30850) | UI 节点端口直达 |
Ingress consul 经 Traefik(ingressClassName: traefik)暴露 host consul.yldm.tech,后端指向 consul Service 的 8500。TLS 由 cert-manager letsencrypt-prod 签发到 consul-tls;external-dns 注解走 Cloudflare Tunnel(*.cfargotunnel.com target,cloudflare-proxied: "true"),代理读写超时各 600s。
此目录下没有 ServiceMonitor、PrometheusRule、HPA、VPA 或 PDB;server.json 仅开启了 Consul 自身的 Prometheus telemetry retention(60s),抓取由 NetworkPolicy 放行(见下),但仓库内未提供对应的 ServiceMonitor。
网络策略
命名空间采用 default-deny-ingress 基线,再按来源逐条放行(kustomization 中引用):
allow-same-namespace—— 命名空间内互通allow-from-app/allow-from-game/allow-from-platform—— 放行对应业务命名空间访问allow-from-ingress—— 放行 ingress 来源allow-from-argo-workflows—— 放行 Argo Workflowsallow-prometheus-scraping—— 放行kubernetes.io/metadata.name: prometheus命名空间抓取allow-dns-egress/allow-healthcheck-egress—— 出站 DNS 与健康检查
返回 Data 服务总览