将虚拟机上的Consul客户端连接到Kubernetes中的Consul服务器

问题描述 投票:0回答:2

我在设置此场景时遇到问题。我有一台运行 4 个虚拟机的服务器:

  • k8s大师
  • k8s工人1
  • k8s工人2
  • vm1

我已将带有 Helm Chart 的 Consul 集群部署到 k8s 集群中,导致每个工作节点上有 1 个服务器,每个工作节点上有 1 个客户端。这是当前的配置(我正在尝试各种方法,因此有些可能会被注释/禁用)

global:
  name: consul
  enabled: true
  datacenter: dc1
  gossipEncryption:
    autoGenerate: true
  tls:
    enabled: true
    enableAutoEncrypt: true
    verify: true
  acls:
    manageSystemACLs: true
# client:
#   exposeGossipPorts: true
server:
  replicas: 2
  # exposeGossipAndRPCPorts: true
  # ports:
  #   serflan:
  #     port: 9301
  extraConfig: |
    { "log_level": "debug" }
  exposeService:
    enabled: true
    type: NodePort
    nodePort:
      http: 31500 # 8500 + 23k
      https: 31501 # 8501 + 23k
      grpc: 31503 # 8503 + 23k
      serf: 32301 # 9301 + 23k
      rpc: 31300 # 8300 + 23k
  securityContext:
    runAsNonRoot: false
    runAsUser: 0
  storageClass: nfs-synology-test
connectInject:
  enabled: true
controller:
  enabled: true
syncCatalog:
  enabled: true
dns:
  enabled: true

这在集群本身中大部分工作得很好(我可以运行一个对 Consul 服务名称执行

dig
操作的作业,并且我确实得到了响应)。现在我想安装另一个 Consul 客户端,这次是在
vm1
VM 上,并将其加入到 K8s 集群中的 Consul 中。

正如您在评论中看到的,我尝试将八卦和 RPC 端口公开为主机端口,现在将服务器服务公开为给定端口上的 NodePort 服务。

从虚拟机中,我可以使用

nmap
验证这些端口确实在 TCP 上打开,但出于神圣的原因,我无法弄清楚在
vm1
客户端中配置什么。这是我当前的配置:

{
  "server": false,
  "domain": "consul",
  "datacenter": "dc1",
  "data_dir": "/etc/consul/data",
  "tls": {
    "defaults": {
      "ca_file": "/etc/consul/tls/ca/tls.crt",
      "verify_incoming": false,
      "verify_outgoing": true
    },
    "internal_rpc": {
      "verify_server_hostname": true
    }
  },
  "auto_encrypt": { "tls": true },
  "encrypt": "redacted",
  "log_level": "DEBUG",
  "enable_syslog": true,
  "leave_on_terminate": true,
  "retry_join": [
    "192.168.1.207:32301",
    "192.168.1.208:32301",
    "10.233.94.138:8300",
    "10.233.119.94:8300"
  ],
  "advertise_addr": "192.168.1.230",
  "bind_addr": "0.0.0.0",
  "ports": { "server": 31300 },
  "acl": {
    "tokens": {
      "agent": "redacted",
      "default": "redacted"
    }
  }
}

我从k8s中的秘密中获取了

encrypt
的值,与
tls.crt
相同。我尝试生成一个令牌,并将 GUI 分配给
client-policy
,定义为:

node_prefix "" {
  policy = "write"
}
service_prefix "" {
  policy = "read"
}

但一切都无济于事。客户端通常会失败 UDP 连接,尝试连接到内部 k8s 集群 IP(即使我没有将它们添加到

retry_join
,再次尝试),总体上会出现超时和
rpc error: lead thread didn't get connection

我已经没有主意了,我正处于尝试随机端口和配置直到中大奖的阶段。有人可以帮忙吗?

kubernetes consul
2个回答
1
投票

我在某种程度上找到了我的答案,因此如果有人遇到同样的问题,请发布。虽然我喜欢在节点端口上公开服务,但它并没有完全成功。可以从

32301
端口访问服务器(因此 VM 客户端能够加入),但服务器本身在 Pod IP 上宣传自己,而从外部无法访问该 IP。

我的案例的解决方案是:

  • 实际使用注释掉的
    client.exposeGossipPorts: true
    server.exposeGossipAndRPCPorts: true
    server.ports.serflan.port: 9301
  • 配置中的
  • retry_join
    应使用节点IP +
    9301
    端口
  • 我设置 TLS 证书、令牌和
    encrypt
    的方式可能是正确的
  • 就 RPC 和失败的 UDP 而言,问题在于 Kube 集群未能正确部署服务器和客户端(Serflan-UDP 端口未通过 UDP 公开)。当我
    kubectl patch
    编辑它时,它开始工作(最终我们修复了集群本身)

0
投票

你能告诉我你为失败的 UDP 问题做了什么补丁吗

© www.soinside.com 2019 - 2024. All rights reserved.