KubeSphere使用代理添加多集群

分为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(自定义)

file

保存,查看安装状态。

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的组件,这是个代理服务。

file

配置代理地址

查看tower服务,是一个LoadBalancer,我这里没有LoadBalancer,所以proxyPublishAddress参数来配置公网代理地址。

file

  multicluster:
    clusterRole: host
    hostClusterName: primary
    proxyPublishAddress: 'http://公网ip:31926'

file

保存配置并稍等片刻,或者可以运行以下命令手动重启 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

file

成员集群修改配置

编辑ks-installer的YAM 文件:

  authentication:
    jwtSecret: Tb3LRMIYsxunhJ0rIFpGBXrLOWoyub5P
  multicluster:
    clusterRole: member

file

file

保存等待配置生效。

导入成员集群

在主集群中访问 http://ip:30880/clusters, 点击添加集群。

file

输入集群基本信息。也可以点击右上角的编辑模式以YAML格式查看并编辑基本信息。编辑完成后,点击下一步。

file

连接方式选择:集群连接代理

file

会生成一个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: {}

file

查看主集群tower日志,握手成功,member集群添加成功。

file

查看集群

file

可以看到member集群的全部信息。

file

环境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

file

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添加的是四层的规则。

有两种方法可以解决:

  1. 添加环境变量
    在内网机器上使用环境变量,这种方法会把所有流量都转发到代理机上,所以需要添加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,...
  2. 不适用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日志,握手成功。导入集群成功。

file

file

也可以正常获取到集群信息。

file

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x