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/leader on 8500
  • Name
    RBAC
    Description
    ServiceAccount consul + Role(podsget/list)+ RoleBinding

启动命令与 ConfigMap 中的 server.json 描述一致:datacenter=dc1data_dir=/consul/databootstrap_expect=1retry_join 指向 headless Service。容器实际以内联 shell 命令启动,server.json 挂载在 /tmp/consul-config(readOnly),作为同源配置参考。

配置与依赖

ConfigMap consul-configserver.json 关键项:

配置项
datacenterdc1
ports.https-1(禁用 HTTPS)
ports.http / grpc / dns8500 / 8502 / 8600
telemetry.prometheus_retention_time60s
performance.raft_multiplier1
leave_on_terminatetrue
skip_leave_on_interruptfalse

ExternalSecret consul-secret 经 ClusterSecretStore vault-backend 从 Vault 拉取,刷新间隔 1h,生成同名 Secret consul-secret:

  • Name
    CONSUL_HTTP_TOKEN
    Description
    remoteRef secret/database/prod/consulhttp_token
  • Name
    GOSSIP_ENCRYPTION_KEY
    Description
    remoteRef secret/database/prod/consulgossip_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类型端口说明
consulClusterIP8500 http / 8502 grpc / 8600 dns主访问入口
consul-headlessHeadless(clusterIP None)8500 / 8502 / 8301 / 8302 / 8300 / 8600publishNotReadyAddresses: true,供 retry-join 与 StatefulSet 寻址
consul-uiNodePort8500(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 Workflows
  • allow-prometheus-scraping —— 放行 kubernetes.io/metadata.name: prometheus 命名空间抓取
  • allow-dns-egress / allow-healthcheck-egress —— 出站 DNS 与健康检查

返回 Data 服务总览

评论