分为2种环境,一种可以直通,一种使用代理机转发。
环境1
一台有公网地址的kubesphere集群,一台内网kubesphere集群(可以访问公网)。使用公网集群当做主集群,内网集群当做member集群。公网地址+端口作为代理地址。
官方文档地址:https://www.kubesphere.io/zh/docs/v3.3/multicluster-management/enable-multicluster/agent-connection/
步骤
启用多集群
如果没有启用多集群的话,主集群使用admin帐户登录控制台,然后进入集群管理页面上的定制资源定义,输入关键字ClusterConfiguration,然后转到其详情页面。编辑ks-installer的YAML文件。
修改为成如下的配置:
multicluster:
clusterRole: host
hostClusterName: primary(自定义)
保存,查看安装状态。
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
可以看到有个叫做Tower的组件,这是个代理服务。
配置代理地址
查看tower服务,是一个LoadBalancer,我这里没有LoadBalancer,所以proxyPublishAddress参数来配置公网代理地址。
multicluster:
clusterRole: host
hostClusterName: primary
proxyPublishAddress: 'http://公网ip:31926'
保存配置并稍等片刻,或者可以运行以下命令手动重启 ks-apiserver 使修改立即生效。
kubectl -n kubesphere-system rollout restart deployment ks-apiserver
获取jwtSecret
在主集群中使用如下命令获取:
kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret
成员集群修改配置
编辑ks-installer的YAM 文件:
authentication:
jwtSecret: Tb3LRMIYsxunhJ0rIFpGBXrLOWoyub5P
multicluster:
clusterRole: member
保存等待配置生效。
导入成员集群
在主集群中访问 http://ip:30880/clusters, 点击添加集群。
输入集群基本信息。也可以点击右上角的编辑模式以YAML格式查看并编辑基本信息。编辑完成后,点击下一步。
连接方式选择:集群连接代理
会生成一个deployment文件,在成员集群中apply即可。
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
name: cluster-agent
namespace: kubesphere-system
spec:
selector:
matchLabels:
app: agent
app.kubernetes.io/part-of: tower
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: agent
app.kubernetes.io/part-of: tower
spec:
containers:
- command:
- /agent
- --name=member
- --token=915a3f0f7615d89501717c35fc8e088111596426a8d960146c4f64270474cb12
- --proxy-server=http://1.2.3.4:31926
- --keepalive=10s
- --kubesphere-service=ks-apiserver.kubesphere-system.svc:80
- --kubernetes-service=kubernetes.default.svc:443
- --v=0
image: kubesphere/tower:v0.2.0
name: agent
resources:
limits:
cpu: "1"
memory: 200M
requests:
cpu: 100m
memory: 100M
serviceAccountName: kubesphere
status: {}
查看主集群tower日志,握手成功,member集群添加成功。
查看集群
可以看到member集群的全部信息。
环境2
- 内网机器:192.168.1.1
- 代理机:192.168.1.2,端口3128
- 公网机器:1.2.3.4
访问链路就是:内网kubesphere-cluster-agent–>代理机–>公网kubesphere-tower
代理机部署
这里使用的是nginx来做4层正向代理。将访问3128端口的流量转发到1.2.3.4:31926。nginx配置如下:
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;(我是rpm安装的nginx,没有stream模块,需要手动安装 yum install -y nginx-mod-stream,注意模块路径是否存在。)
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
stream {
server {
listen 3128;
proxy_pass app_server;
}
upstream app_server{
server 1.2.3.4:31926;
}
}
nginx -t
nohup nginx &>/dev/null &
ps aux|grep nginx
#测试代理是否生效
curl 127.0.0.1:3128
PS
我尝试过在内网机器,192.168.1.1上,用iptables来转发,但是没有生效。
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport=31926 -j DNAT --to-destination 192.168.1.2:3128
查看iptables规则FORWARD链是ACCEPT的,没有被DROP。期初我以为是没有添加回城路由导致的,又加了一条SNAT。
iptables -A PREROUTING -t nat -p tcp -d 192.168.1.2 --dport=3128 -j SNAT --to-destination 1.2.3.4
加了仍然不生效。而且 curl 1.2.3.4:31926 -x 192.168.1.2:3128
都不通了。猜测是SNAT后的地址不能是公网地址,修改成内网地址,也不行。遂删除规则。
iptables -D PREROUTING -t nat -p tcp -d 1.2.3.4 --dport=31926 -j DNAT --to-destination 192.168.1.2:3128
iptables -D PREROUTING -t nat -p tcp -d 192.168.1.2 --dport=3128 -j SNAT --to-destination 1.2.3.4
后找到原因:我的代理使用的是squid,squid是个七层应用层代理服务,iptables添加的是四层的规则。
有两种方法可以解决:
- 添加环境变量
在内网机器上使用环境变量,这种方法会把所有流量都转发到代理机上,所以需要添加no_proxy,否则会导致kubectl都无法使用,报错apiserver端口不在。export http_proxy=192.168.1.2:3128 export https_proxy=192.168.1.2:3128 export no_proxy=127.0.0.1,localhost,...
- 不适用squid,使用四层代理如nginx或者lvs等。我这里使用的就是nginx。
主集群添加集群
需要修改proxy的地址。
---
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
name: cluster-agent
namespace: kubesphere-system
spec:
selector:
matchLabels:
app: agent
app.kubernetes.io/part-of: tower
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: agent
app.kubernetes.io/part-of: tower
spec:
containers:
- command:
- /agent
- --name=test
- --token=b35f88b1badb6d626fee57edfc986e4058d867d4da6f231f9f09a65bbf6877f0
# 这里地址需要改为代理机的地址,不能用生成的公网地址。
- --proxy-server=http://192.168.1.2:3128
- --keepalive=10s
- --kubesphere-service=ks-apiserver.kubesphere-system.svc:80
- --kubernetes-service=kubernetes.default.svc:443
- --v=0
image: kubesphere/tower:v0.2.0
name: agent
resources:
limits:
cpu: "1"
memory: 200M
requests:
cpu: 100m
memory: 100M
serviceAccountName: kubesphere
status: {}
内网成员集群的cluster-agent会没有日志输出,查看主集群tower日志,握手成功。导入集群成功。
也可以正常获取到集群信息。