我在设置此场景时遇到问题。我有一台运行 4 个虚拟机的服务器:
我已将带有 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
。
我已经没有主意了,我正处于尝试随机端口和配置直到中大奖的阶段。有人可以帮忙吗?
我在某种程度上找到了我的答案,因此如果有人遇到同样的问题,请发布。虽然我喜欢在节点端口上公开服务,但它并没有完全成功。可以从
32301
端口访问服务器(因此 VM 客户端能够加入),但服务器本身在 Pod IP 上宣传自己,而从外部无法访问该 IP。
我的案例的解决方案是:
client.exposeGossipPorts: true
、server.exposeGossipAndRPCPorts: true
和 server.ports.serflan.port: 9301
retry_join
应使用节点IP + 9301
端口encrypt
的方式可能是正确的kubectl patch
编辑它时,它开始工作(最终我们修复了集群本身)你能告诉我你为失败的 UDP 问题做了什么补丁吗