Kubernetes之Kuboard多集群管理工具安装实践

2022-09-29 19:10:01 浏览数 (1)

[TOC]

0x00 前言简述

1.Kuboard 介绍

描述: Kuboard 是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。

您也可以直接将 Kuboard 安装到现有的 Kubernetes 集群,通过 Kuboard 提供的 Kubernetes RBAC 管理界面,将 Kubernetes 提供的能力开放给您的开发/测试团队。

Kuboard 提供的功能有:

  • Kubernetes 基本管理功能
  • Kubernetes 问题诊断
  • Kubernetes 存储管理
    • 通过 ceph-csi 对接 CephFS
    • 通过 ceph-csi 对接 Rook 安装的 CephFS
    • 通过 nfs-client-provisioner 对接 NFS 类型的存储
    • 对接其他类型的存储
  • 认证与授权
    • 内建用户库认证
    • GitLab / GitHub 单点登录
    • LDAP 认证
    • 完整的 RBAC 权限管理
  • Kuboard 特色功能
    • Kuboard 官方套件
      • Grafana Prometheus 资源监控
      • Grafana Loki Promtail 日志聚合
    • Kuboard 自定义名称空间布局
    • Kuboard 中英文语言包

2.Kuboard v3.x 版本

描述: Kuboard v3.x 兼容性涉及 Kubernetes 版本 (v1.13 ~ v1.20)

Kuboard v3.x 功能特点:

  • 支持 Kubernetes 多集群管理
  • 支持 amd64 (x86) 架构和 arm68 (armv8) 架构的 CPU;

Kuboard v3.x 与 v2.0.x 对比:

  • 1.v3.x 不再部署在 Kubernetes 中,而是作为一个独立的容器运行。
  • 2.由于运行模式不同 v2.0.x 与 v3.x 可以同时存在互不干扰, 其次是 v3.x 将 Kuboard 部署的大部分内容从 kube-system 名称空间迁移到 kuboard 名称空间。

Tips : 如果您最终决定从 Kuboard v2.0.x 迁移到 Kuboard v3,请在 Kuboard v2.0.x 的界面中卸载掉 Kuboard 套件,并在 Kuboard v3 中重新安装 Kuboard 套件。


0x01 安装部署

1.安装步骤

1) k8s集群部署说明获取部署 Kuboard 所需的 YAML 文件:

代码语言:javascript复制
curl -o kuboard-v3.yaml https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

2.编辑 kuboard-v3.yaml 文件中的配置,该部署文件中,有两处配置必须修改:

代码语言:javascript复制
# 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-built-in.html
KUBOARD_ENDPOINT: 'http://192.168.12.108:30567'

# 请填写一个有效的 StorageClass name
storageClassName: please-provide-a-valid-StorageClass-name-here

# 端口设置
# Kuboard v3 容器对外暴露三个端口:
#     80 Kuboard Web 服务端口,TCP;
#     443 Kuboard Web 服务端口,TCP;
#     10081 Kuboard Agent Server 端口,TCP 、 UDP。
spec:
  ports:
    - name: webui
      nodePort: 30567
      port: 80
      protocol: TCP
      targetPort: 80
    - name: agentservertcp
      nodePort: 30568
      port: 10081
      protocol: TCP
      targetPort: 10081
    - name: agentserverudp
      nodePort: 30568
      port: 10081
      protocol: UDP
      targetPort: 10081
# 端口网络监听
# tcp        0      0 0.0.0.0:30567           0.0.0.0:*               LISTEN      -
# tcp        0      0 0.0.0.0:30568           0.0.0.0:*               LISTEN      -

3.部署到 Kubernetes 集群

代码语言:javascript复制
kubectl create -f kuboard-v3.yaml

Tips : 此 YAML 文件向 Kubernetes 中部署了一个三副本的 StatefulSet kuboard-etcd 和一个单副本的 Deployment kuboard-v3;其中 Deployment kuboard-v3 暂时不支持多副本,请保持其 replicas 字段为 1,将在后续的版本升级中解决 kuboard-v3 多副本部署的问题。

2.配置步骤

1) 访问 Kuboard 在浏览器中打开链接 http://192.168.12.108:30567 ,输入初始用户名和密码登录

代码语言:javascript复制
用户名: admin
密码: Kuboard123

WeiyiGeek.Kuboard多集群管理

2) 为单点登录的用户/用户组授权(由于在刚开发阶段所以还有些不成熟) 描述: 当您配置 Kuboard 与 gitlab / github / ldap 实现单点登录以后,Kuboard 并不管理用户基本信息、用户组信息、用户与用户组之间的映射信息 为了让单点登录的用户获得合适的权限,您需要在 Kuboard 中为对应的用户/用户组授权:

代码语言:javascript复制
- 为用户添加角色绑定
- 切换到 角色绑定(全局)
- 创建角色绑定

WeiyiGeek.授权

Tips : 全局角色绑定,用户可以在所有 Kubernetes 集群范围内执行该角色授予的权限; Tips : 集群角色绑定,用户只能在指定的 Kubernetes 集群范围内执行该角色授予的权限; Tips : 通常以用户组授权比为单个用户授权更为灵活和方便

  • 3) 通过反向代理访问 Kuboard 值得注意得是 Kuboard 需要使用根路径进行访问,即 https://kuboard.this-is-a-sample.com/,而不能是 https://this-is-a-sample.com/kuboard/ 这样的二级路径;
代码语言:javascript复制
; 使用 nginx 作为反向代理,配置文件样例
http {
  # 您需要的其他配置
  map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
  }

  server {
    listen       80; 
    server_name  kuboard.this-is-a-sample.com; # 替换成你的域名

    location / {
      proxy_pass http://192.168.32.205:10080/;  # 替换成你的 Kuboard IP 地址和端口,应该是 IP 地址,而不是 KUBOARD_ENDPOINT 参数的值
      gzip on;
    }

    location /k8s-ws/ {
      proxy_pass  http://192.168.32.205:10080/k8s-ws/;  # 替换成你的 Kuboard IP 地址和端口
      proxy_http_version 1.1;
      proxy_pass_header Authorization;
      proxy_set_header Upgrade "websocket";
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # proxy_set_header X-Forwarded-Proto https; # 如果您在反向代理上启用了 HTTPS
    }

    location /k8s-proxy/ {
      proxy_pass  http://192.168.32.205:10080/k8s-proxy/;  # 替换成你的 Kuboard IP 地址和端口
      proxy_http_version 1.1;
      proxy_pass_header Authorization;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # proxy_set_header X-Forwarded-Proto https; # 如果您在反向代理上启用了 HTTPS
      gzip on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
  }
}

4) SSL 证书配置 描述: Web 服务端口在如下两种情况下需要配置 SSL 证书, 一是通过公网访问 Kuboard 界面,提高安全性;二是为被纳管的 Kubernetes 配置 OIDC与 Kuboard 实现单点登录(如不配置,通过 Kuboard 管理 Kubernetes 时,Kubernetes 只能将用户识别成 kuboard-admin 或者 kuboard-user 这两个 ServiceAccount 当中的一个)

代码语言:javascript复制
# 已有证书 - Certificates
sudo docker run -d 
  --restart=unless-stopped 
  -v /hostpath/to/your/server.crt:/etc/certs/my.company.com/server.crt 
  -v /hostpath/to/your/server.key:/etc/certs/my.company.com/server.key 
  -e KUBOARD_TLS_CERT=/etc/certs/my.company.com/server.crt 
  -e KUBOARD_TLS_KEY=/etc/certs/my.company.com/server.key 
  -p 10080:80/tcp 
  -p 443:443/tcp 
  -p 10081:10081/tcp 
  -p 10081:10081/udp 
  -e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" 
  -e KUBOARD_AGENT_SERVER_UDP_PORT="10081" 
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" 
  -v /root/kuboard-data:/data 
  eipwork/kuboard:v3-beta

# 在线申请 - Lets Encrypt
sudo docker run -d 
  --restart=unless-stopped 
  -p 10080:80/tcp 
  -p 443:443/tcp 
  -p 10081:10081/tcp 
  -p 10081:10081/udp 
  # 第 7 行激活 Kuboard 中的 Lets Encrypt 客户端;
  -e KUBOARD_TLS_AUTOCERT=true  
  # 第 8 行指定 Lets Encrypt 颁发证书时对应的域名;
  -e KUBOARD_TLS_DOMAIN=kuboard.this-is-a-sample.com 
  -e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" 
  -e KUBOARD_AGENT_SERVER_UDP_PORT="10081" 
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" 
  -v /root/kuboard-data:/data 
  eipwork/kuboard:v3-beta

Tips : Kuboard Agent Server 端口使用 TCP、UDP 通信,是私有协议,已经自动配置了 TLS 加密连接,无需用户额外配置证书。(该 Agent Server 端口无需暴露到公网) Tips : 如果通过 nginx 反向代理访问 Kuboard,建议在 nginx 中配置 SSL 证书; Tips : 如果您的 Kuboard 打算直接在公网上访问,建议使用 Lets Encrypt; Tips : 使用 Lets Encrypt 时,请将 kuboard.this-is-a-sample.com 域名指向您的 Kuboard 所在宿主机的公网 IP,并且确保 80, 443 端口开放。Kuboard 启动后,在您第一次访问 https://kuboard.this-is-a-sample.com 时,Lets Encrypt 将自动申请证书(浏览器上显示第一次访问将失败)。等候 1-5 分钟时间,再次访问 https://kuboard.this-is-a-sample.com 时,您将能够成功访问,证书也已经颁发并且自动配置好;通常免费证书有效期是一年时间,证书到期前一个月,系统会自动为您更新证书,无需您额外做任何操作。

3.升级配置

描述: 将 kuboard v3 更新到最新版本。

方式1.Docker 容器

代码语言:javascript复制
# 1.停止已有 kuboard 容器
docker stop $(docker ps -a | grep "eipwork/kuboard" | awk '{print $1 }')
docker rm $(docker ps -a | grep "eipwork/kuboard" | awk '{print $1 }')

# 2.使用新版本的镜像启动 kuboard
sudo docker run -d 
  --restart=unless-stopped 
  --name=kuboard 
  -p 10080:80/tcp 
  -p 10081:10081/udp 
  -p 10081:10081/tcp 
  -e KUBOARD_ENDPOINT="http://kuboard.this-is-a-sample.com:10080" 
  -e KUBOARD_AGENT_SERVER_UDP_PORT="10081" 
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" 
  -v /root/kuboard-data:/data 
  eipwork/kuboard:v3.1.0.3

方式2.Kubernetes 集群

代码语言:javascript复制
# 更新到最新版本
kubectl set image -n kuboard deployment/kuboard-v3 kuboard=swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3

0x02 使用实践

1.集群添加

Step 1.添加已有 Kubernetes 集群到 Kuboard(注意Kubernetes 集群,版本不低于 v1.13),点击首页的添加集群。输入如图下所示(注意选择Agent连接方式)

WeiyiGeek.k8s cluster add

Step 2.请安装 kuboard-agent 然后在将要被导入的 Kubernetes 集群执行如下指令

代码语言:javascript复制
curl -k 'http://192.168.12.108:30567/kuboard-api/cluster/k8s-test.weiyigeek/kind/KubernetesCluster/k8s-test.weiyigeek/resource/installAgentToKubernetes?token=OIrni4gJpu4hfeAMyJTxCL0gyMZ0Ps1o' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml
# namespace/kuboard created
# serviceaccount/kuboard-admin created
# clusterrolebinding.rbac.authorization.k8s.io/kuboard-admin-crb created
# serviceaccount/kuboard-viewer created
# clusterrolebinding.rbac.authorization.k8s.io/kuboard-viewer-crb created
# deployment.apps/kuboard-agent created
# deployment.apps/kuboard-agent-2 created
# weiyigeek@master-k8s:~$
 
# 在 被导入的Kubernetes 集群下执行查看你
$ kubectl get pod -n kuboard
NAME                               READY   STATUS    RESTARTS   AGE
kuboard-agent-2-5f4bcf8b45-d4gr9   1/1     Running   0          33s
kuboard-agent-784ccf8f5c-lm7fc     1/1     Running   0          33s

Step 3.最后点击我已执行导入命令(执行上面的命令后也会自动探测), 添加完集群后会在Kubernetes 集群列表中看它。

WeiyiGeek.集群添加

Step 4.如果您已经执行了导入命令,但仍然处于等待导入状态,有可能是因为 kuboard-agent 没有启动,或者 kuboard-agent 不能连接 kuboard-server。请按照下面的提示检查网络连通性以及 kuboard-agent 的日志。

代码语言:javascript复制
# 1.请测试连通性 UDP
nc -vuz 192.168.12.108 30568
# Connection to 192.168.12.108 30568 port [udp/*] succeeded

# 2.请检查 kuboard-agent 状态
kubectl get pods -n kuboard -o wide -l "k8s.kuboard.cn/name in (kuboard-agent, kuboard-agent-2)"

# 3.请检查 kuboard-agent 日志 
kubectl logs -f  -n kuboard -l "k8s.kuboard.cn/name in (kuboard-agent, kuboard-agent-2)"

Step 5.连接完成后与v2.x一样可以对集群进行管理包括(资源配置和应用程序应用以及存储的创建)

WeiyiGeek.集群管理

Step 5.学习上面生成的 Kuboard-agent.yaml 资源清单编写

代码语言:javascript复制
# 名称空间创建
---
apiVersion: v1
kind: Namespace
metadata:
  name: kuboard

# 服务用户创建
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kuboard-admin
  namespace: kuboard

# 集群角色绑定RBAC-将k8s集群管理员的角色绑定到ServiceAccount中的kuboard-admin.
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kuboard-admin-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kuboard-admin
  namespace: kuboard

# 下面的浏览用户的权限绑定的是集群浏览的角色
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kuboard-viewer
  namespace: kuboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kuboard-viewer-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: kuboard-viewer
  namespace: kuboard

# 利用 Deployment 控制器来 部署 kuboard-agent 容器 (此处采用两个Deployment控制器来进行不同权限分离)
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    k8s.kuboard.cn/ingress: "false"
    k8s.kuboard.cn/service: none
    k8s.kuboard.cn/workload: kuboard-agent
  labels:
    k8s.kuboard.cn/layer: cloud
    k8s.kuboard.cn/name: kuboard-agent
  name: kuboard-agent
  namespace: kuboard
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: cloud
      k8s.kuboard.cn/name: kuboard-agent
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: cloud
        k8s.kuboard.cn/name: kuboard-agent
    spec:
      serviceAccountName: kuboard-admin
      # 容忍在master节点也运行
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
          operator: Exists
      # 容器定义设置
      containers:
        - env:
            - name: KUBOARD_ENDPOINT
              value: "http://192.168.12.108:30567"
            - name: KUBOARD_AGENT_HOST
              value: "192.168.12.108"
            - name: KUBOARD_AGENT_PORT
              value: "30568"
            - name: KUBOARD_AGENT_REMOTE_PORT
              value: "35002"
            - name: KUBOARD_AGENT_PROTOCOL
              value: "tcp"
            - name: KUBOARD_AGENT_PROXY
              value: ""
            - name: KUBOARD_K8S_CLUSTER_NAME
              value: "dev-k8s.weiyieek"
            - name: KUBOARD_AGENT_KEY
              value: "32b7d6572c6255211b4eec9009e4a816"
            - name: KUBERNETES_TOKEN_NAME
              value: "kuboard-admin"
            - name: KUBOARD_ANONYMOUS_TOKEN
              value: "WoMzrTCxYCoCPxZ91aX0v8d63ycPwFJ3"
          image: "swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-agent:v3"
          imagePullPolicy: Always
          # 生存周期验证
          livenessProbe:
            exec:
              command:
                - /health.sh
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 60
            successThreshold: 1
            timeoutSeconds: 1
          name: kuboard-agent
      restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    k8s.kuboard.cn/ingress: "false"
    k8s.kuboard.cn/service: none
    k8s.kuboard.cn/workload: kuboard-agent-2
  labels:
    k8s.kuboard.cn/layer: cloud
    k8s.kuboard.cn/name: kuboard-agent-2
  name: kuboard-agent-2
  namespace: kuboard
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: cloud
      k8s.kuboard.cn/name: kuboard-agent-2
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: cloud
        k8s.kuboard.cn/name: kuboard-agent-2
    spec:
      serviceAccountName: kuboard-viewer
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
          operator: Exists
      containers:
        - env:
            - name: KUBOARD_ENDPOINT
              value: "http://192.168.12.108:30567"
            - name: KUBOARD_AGENT_HOST
              value: "192.168.12.108"
            - name: KUBOARD_AGENT_PORT
              value: "30568"
            - name: KUBOARD_AGENT_REMOTE_PORT
              value: "35002"
            - name: KUBOARD_AGENT_PROTOCOL
              value: "tcp"
            - name: KUBOARD_AGENT_PROXY
              value: ""
            - name: KUBOARD_K8S_CLUSTER_NAME
              value: "dev-k8s.weiyieek"
            - name: KUBOARD_AGENT_KEY
              value: "32b7d6572c6255211b4eec9009e4a816"
            - name: KUBERNETES_TOKEN_NAME
              value: "kuboard-viewer"
            - name: KUBOARD_ANONYMOUS_TOKEN
              value: "WoMzrTCxYCoCPxZ91aX0v8d63ycPwFJ3"
          image: "swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-agent:v3"
          imagePullPolicy: Always
          livenessProbe:
            exec:
              command:
                - /health.sh
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 60
            successThreshold: 1
            timeoutSeconds: 1
          name: kuboard-agent
      restartPolicy: Always

Step 6.我将所有的kubernetes集群都加入到kuboard进行多集群管理

代码语言:javascript复制
Kubernetes master is running at https://weiyigeek-lb-vip.k8s:16443  # 高可用
Kubernetes master is running at https://k8s-test.weiyigeek:6443
Kubernetes control plane is running at https://dev-k8s.weiyieek:6443

WeiyiGeek.Kubernetes 集群列表

2.集群管理使用

Step 1.选择k8s-test.weiyigeek集群->default名称空间->常用操作->从YAML中创建。

Step 2.在Kuboiard中创建一个Nginx服务应用。 从 YAML 创建的资源清单将此输入: (注意为了便于管理建议控制器名称与服务发现名称设置一样)

代码语言:javascript复制
# 字典设置
---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: nginx
  name: nginx-config
  namespace: default
data:
  name: WeiyiGeek

# Deployment 控制器 & 初始化容器值得学习
---
apiVersion: apps/v1
kind: Deployment
metadata:	
  name: nginx-demo
  namespace: default
  labels:	
    app: nginx
spec:	
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        volumeMounts:
        - name: web 
          mountPath: "/usr/share/nginx/html"
      initContainers:
      - name: init
        image: busybox:1.33.0
        command: ['sh', '-c', "env;echo ConfigMap:${MSG}--HostName-${HOSTNAME} > /usr/share/nginx/html/index.html"]
        volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
        env:
        - name: MSG
          valueFrom:
            configMapKeyRef: 
              name: nginx-config
              key: name
      volumes:    
      - name: web 
        emptyDir: {} 
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    nodePort: 30000
    targetPort: 80

WeiyiGeek.yaml部署

  • Step 3.部署结果访问http://192.168.12.111:30000/地址返回界面如下:

WeiyiGeek.部署结果

  • Step 4.查看我们资源清单创建的ConfigMap,点击配置中心->配置字典->我们可以通过资源清单和UI来创建

WeiyiGeek.kuboard-ConfigMap

0 人点赞