(二十一)、Docker 部署 Minikube 使用可视化管理工具 Kuboard

1、介绍

访问 Kuboard 官网

最佳实践

启动 minikube&kuboard 客户端

注意,只是启动 Docker 中 minikube 容器是不够的

minikube start # 简单版本,下面是指定资源大小
minikube start \
  --memory=4096 \
  --cpus=2 \
  --disk-size=30g \
  --driver=docker

kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system
minikube service kuboard -n kube-system

在这里插入图片描述

获取登录认证 token

  • 创建持久化的服务账户 token
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: kuboard-user-token
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: kuboard-user
type: kubernetes.io/service-account-token
EOF
                                                                     
# 获取配置的持久化 token
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

# 废弃
kubectl -n kube-system create token kuboard-user --duration=8760h

docker 运行 minikube 集群节点(kube-apiserver )无法被直接访问的问题

对于本系列,系统环境是 mac(OS 14.3.1) ,此版本的OS 系统暂不支持以 Virtual Box 方式运行 minikube 。
使用 docker 部署 minikube 会有一个问题,就是minikube 的内部地址没有办法直接被宿主机访问。
对于docker 运行 minikube ,在k8s 中部署的服务,可以通过 NodePort 方式暴露服务,然后通过隧道端口被宿主机直接访问。
但是对于集群节点,这种方式行不通,即无法为表示集群节点的 kube-apiserver 提供一个可以直接被宿主机访问的端口映射。

Kuboard 需要访问到 k8s 集群的kube-apiserver

Kuboard 通过代理地址和 k8s 集群进行交互,如果 k8s 服务不可访达,那么交互就无从谈起。

2.pre、在 k8s 中安装(Docker 安装 minikube)

2.pre.1、安装

官方链接

方法1:使用官方 YAML 文件

可能有网络问题

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

方法2:使用可靠的镜像源手动安装

  kubectl apply -f - <<EOF
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: kuboard
    namespace: kube-system
    labels:
      k8s.kuboard.cn/name: kuboard
      k8s.kuboard.cn/layer: monitor
  spec:
    replicas: 1
    selector:
      matchLabels:
        k8s.kuboard.cn/name: kuboard
        k8s.kuboard.cn/layer: monitor
    template:
      metadata:
        labels:
          k8s.kuboard.cn/name: kuboard
          k8s.kuboard.cn/layer: monitor
      spec:
        containers:
        - name: kuboard
          image: eipwork/kuboard:latest
          imagePullPolicy: Always
          ports:
          - containerPort: 80
          resources:
            limits:
              cpu: 500m
              memory: 512Mi
            requests:
              cpu: 100m
              memory: 128Mi
        tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: kuboard
    namespace: kube-system
  spec:
    type: NodePort
    ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 32567
    selector:
      k8s.kuboard.cn/name: kuboard
      k8s.kuboard.cn/layer: monitor
  EOF

方法3:使用 Helm(如果你有 Helm)

 helm repo add kuboard https://kuboard.cn/helm-chart
 helm install kuboard kuboard/kuboard --namespace kube-system

2.pre.2、删除

删除当前安装的 kuboard:
  kubectl delete deployment kuboard -n kube-system

2、安装 Kuboard(在 Docker 中安装)

2.1、k8s 集群节点可以被外部直接访问的情况

比如使用 Virtual Box 安装minikube 的模式,或者 docket dasktop 自带 k8s 的模式。
直接使用 docker 安装 Kuboard 即可。
这里使用 本机 Docker 安装独立的 Kuboard V3 版本

在这里插入图片描述

2.1.1、下载镜像
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
2.1.2、运行 deployment.yml

这里具体采取的配置为 8081 为宿主机访问Kuboard的端口,30081 为Kuboard访问 k8s 集群的代理端口
192.168.58.2 为

docker volume create kuboard-data
docker run -d \
 --restart=unless-stopped \
 --name=kuboard \
 -p 80:80/tcp \
 -p 10081:10081/tcp \
 -e KUBOARD_ENDPOINT="https://192.168.58.2:8443" \
 -e KUBOARD_AGENT_SERVER_TCP_PORT=30081 \
 -v kuboard-data:/data/kuboard \
 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
2.1.3、访问 Kuboard

http://127.0.0.1:8081/
默认登陆名和密码是

admin/Kuboard123

2.2、k8s 集群节点无法被外部直接访问的情况

比如本系列中,使用 docker 部署 minikube ,此时k8s 集群节点无法被外部直接访问,我们直接在 K8s 内部署 Kuboard,利用k8s 集群内可以自由通信的特性,再把 Kuboard 以NodePort 的形式暴露出来。

2.2.1.、细节
  • 确认 node 节点ip

192.168.49.2

➜  ~ kubectl get nodes -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
minikube   Ready    control-plane   25m   v1.31.0   192.168.49.2   <none>        Ubuntu 22.04.4 LTS   5.15.49-linuxkit   docker://27.2.0

  • 确认 storageclass,比如下面查询到叫 standard

standard

➜  ~ kubectl get storageclass
NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  21m
  • 下载 kuboard-v3.yaml,对其中的内容进行修改

官方链接

第一把 KUBOARD_ENDPOINT: ‘http://your-node-ip-address:30080’ 中 your-node-ip-address 修改为 kubectl get nodes -o wide 查询获得的ip (我这里是 192.168.49.2 )
第二是把 storageClassName: please-provide-a-valid-StorageClass-name-here 中please-provide-a-valid-StorageClass-name-here修改为 kubectl get storageclass 查询得到的name (我这里是 standard)
第三,对 PVC 部分修改为下面内容-增加了一行 storageClassName: standard
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kuboard-data-pvc
namespace: kuboard
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 根据需要调整大小
storageClassName: standard # 确保与您的 PV 的存储类匹配

在这里插入图片描述

2.2.2、 修改完后的文档
---
apiVersion: v1
kind: Namespace
metadata:
  name: kuboard

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kuboard-v3-config
  namespace: kuboard
data:
  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-built-in.html
  # [common]
  KUBOARD_ENDPOINT: 'http://192.168.49.2:30080'
  KUBOARD_AGENT_SERVER_UDP_PORT: '30081'
  KUBOARD_AGENT_SERVER_TCP_PORT: '30081'
  KUBOARD_SERVER_LOGRUS_LEVEL: info  # error / debug / trace
  # KUBOARD_AGENT_KEY 是 Agent 与 Kuboard 通信时的密钥,请修改为一个任意的包含字母、数字的32位字符串,此密钥变更后,需要删除 Kuboard Agent 重新导入。
  KUBOARD_AGENT_KEY: 32b7d6572c6255211b4eec9009e4a816  

  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-gitlab.html
  # [gitlab login]
  # KUBOARD_LOGIN_TYPE: "gitlab"
  # KUBOARD_ROOT_USER: "your-user-name-in-gitlab"
  # GITLAB_BASE_URL: "http://gitlab.mycompany.com"
  # GITLAB_APPLICATION_ID: "7c10882aa46810a0402d17c66103894ac5e43d6130b81c17f7f2d8ae182040b5"
  # GITLAB_CLIENT_SECRET: "77c149bd3a4b6870bffa1a1afaf37cba28a1817f4cf518699065f5a8fe958889"
  
  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-github.html
  # [github login]
  # KUBOARD_LOGIN_TYPE: "github"
  # KUBOARD_ROOT_USER: "your-user-name-in-github"
  # GITHUB_CLIENT_ID: "17577d45e4de7dad88e0"
  # GITHUB_CLIENT_SECRET: "ff738553a8c7e9ad39569c8d02c1d85ec19115a7"

  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-ldap.html
  # [ldap login]
  # KUBOARD_LOGIN_TYPE: "ldap"
  # KUBOARD_ROOT_USER: "your-user-name-in-ldap"
  # LDAP_HOST: "ldap-ip-address:389"
  # LDAP_BIND_DN: "cn=admin,dc=example,dc=org"
  # LDAP_BIND_PASSWORD: "admin"
  # LDAP_BASE_DN: "dc=example,dc=org"
  # LDAP_FILTER: "(objectClass=posixAccount)"
  # LDAP_ID_ATTRIBUTE: "uid"
  # LDAP_USER_NAME_ATTRIBUTE: "uid"
  # LDAP_EMAIL_ATTRIBUTE: "mail"
  # LDAP_DISPLAY_NAME_ATTRIBUTE: "cn"
  # LDAP_GROUP_SEARCH_BASE_DN: "dc=example,dc=org"
  # LDAP_GROUP_SEARCH_FILTER: "(objectClass=posixGroup)"
  # LDAP_USER_MACHER_USER_ATTRIBUTE: "gidNumber"
  # LDAP_USER_MACHER_GROUP_ATTRIBUTE: "gidNumber"
  # LDAP_GROUP_NAME_ATTRIBUTE: "cn"

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kuboard-etcd
  namespace: kuboard
  labels:
    app: kuboard-etcd
spec:
  serviceName: kuboard-etcd
  replicas: 3
  selector:
    matchLabels:
      app: kuboard-etcd
  template:
    metadata:
      name: kuboard-etcd
      labels:
        app: kuboard-etcd
    spec:
      containers:
      - name: kuboard-etcd
        image: swr.cn-east-2.myhuaweicloud.com/kuboard/etcd:v3.4.14
        ports:
        - containerPort: 2379
          name: client
        - containerPort: 2380
          name: peer
        env:
        - name: KUBOARD_ETCD_ENDPOINTS
          value: >-
            kuboard-etcd-0.kuboard-etcd:2379,kuboard-etcd-1.kuboard-etcd:2379,kuboard-etcd-2.kuboard-etcd:2379
        volumeMounts:
        - name: data
          mountPath: /data
        command:
          - /bin/sh
          - -c
          - |
            PEERS="kuboard-etcd-0=http://kuboard-etcd-0.kuboard-etcd:2380,kuboard-etcd-1=http://kuboard-etcd-1.kuboard-etcd:2380,kuboard-etcd-2=http://kuboard-etcd-2.kuboard-etcd:2380"
            exec etcd --name ${HOSTNAME} \
              --listen-peer-urls http://0.0.0.0:2380 \
              --listen-client-urls http://0.0.0.0:2379 \
              --advertise-client-urls http://${HOSTNAME}.kuboard-etcd:2379 \
              --initial-advertise-peer-urls http://${HOSTNAME}:2380 \
              --initial-cluster-token kuboard-etcd-cluster-1 \
              --initial-cluster ${PEERS} \
              --initial-cluster-state new \
              --data-dir /data/kuboard.etcd
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      # 请填写一个有效的 StorageClass name
      storageClassName: standard
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 5Gi


---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kuboard-data-pvc
  namespace: kuboard
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi  # 根据需要调整大小
  storageClassName: standard  # 确保与您的 PV 的存储类匹配

---
apiVersion: v1
kind: Service
metadata:
  name: kuboard-etcd
  namespace: kuboard
spec:
  type: ClusterIP
  ports:
  - port: 2379
    name: client
  - port: 2380
    name: peer
  selector:
    app: kuboard-etcd

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: '9'
    k8s.kuboard.cn/ingress: 'false'
    k8s.kuboard.cn/service: NodePort
    k8s.kuboard.cn/workload: kuboard-v3
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s.kuboard.cn/name: kuboard-v3
  template:
    metadata:
      labels:
        k8s.kuboard.cn/name: kuboard-v3
    spec:
      containers:
        - env:
            - name: KUBOARD_ETCD_ENDPOINTS
              value: >-
                kuboard-etcd-0.kuboard-etcd:2379,kuboard-etcd-1.kuboard-etcd:2379,kuboard-etcd-2.kuboard-etcd:2379
          envFrom:
            - configMapRef:
                name: kuboard-v3-config
          image: 'swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3'
          imagePullPolicy: Always
          name: kuboard
          volumeMounts:
            - mountPath: "/data"
              name: kuboard-data
      volumes:
      - name: kuboard-data
        persistentVolumeClaim:
          claimName: kuboard-data-pvc

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    k8s.kuboard.cn/workload: kuboard-v3
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  ports:
    - name: webui
      nodePort: 30080
      port: 80
      protocol: TCP
      targetPort: 80
    - name: agentservertcp
      nodePort: 30081
      port: 10081
      protocol: TCP
      targetPort: 10081
    - name: agentserverudp
      nodePort: 30081
      port: 10081
      protocol: UDP
      targetPort: 10081
  selector:
    k8s.kuboard.cn/name: kuboard-v3
  sessionAffinity: None
  type: NodePort
  
2.2.3、 执行 yaml,部署 Kuboard 的Pod和NodePort

kubectl apply -f kuboard-v3.yaml

➜  kubectl apply -f kuboard-v3.yaml      

正常会打印


namespace/kuboard created
configmap/kuboard-v3-config created
statefulset.apps/kuboard-etcd created
persistentvolumeclaim/kuboard-data-pvc created
service/kuboard-etcd created
deployment.apps/kuboard-v3 created
service/kuboard-v3 created
2.2.4、确定Pod运行状态
➜  ~ kubectl get pods -n kuboard

可能会遇到报错

NAME
kuboard-etcd-0                0/1     ImagePullBackOff   0          2m49s
kuboard-v3-69bd874899-pjj2m   0/1     ErrImagePull       0          2m35s

此时,把对应的Pod删除.会有自动充实机制

kubectl delete pod kuboard-etcd-0 -n kuboard
kubectl delete pod kuboard-v3-69bd874899-pjj2m -n kuboard

启动成功会展示

➜  ~ kubectl get pods -n kuboard
NAME                          READY   STATUS    RESTARTS      AGE
kuboard-etcd-0                1/1     Running   2 (24s ago)   91s
kuboard-etcd-1                1/1     Running   2 (21s ago)   85s
kuboard-etcd-2                1/1     Running   2 (19s ago)   82s
kuboard-v3-69bd874899-zx5cj   1/1     Running   0             30s
2.2.5、访问 Kuboard

因为是在 docker 运行 minikube,访问 Kuboard 的NodePort 服务,需要构造一个隧道端口
参考 从宿主机访问 k8s(minikube) 发布的 redis 服务

特殊之处在于,Kuboard 需要在特定的命名空间中

  • 查看命名空间
# 查看命名空间
➜  ~ kubectl get svc -n kuboard
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                        AGE
kuboard-etcd   ClusterIP   10.97.148.215   <none>        2379/TCP,2380/TCP                              30m
kuboard-v3     NodePort    10.104.126.78   <none>        80:30080/TCP,10081:30081/TCP,10081:30081/UDP   30m

  • 为 kuboard-v3 提供隧道服务

minikube service kuboard-v3 -n kuboard

# 为 提供隧道服务
➜  ~ minikube service kuboard-v3 -n kuboard
W1024 01:11:56.611451   15452 main.go:291] Unable to resolve the current Docker CLI context "default": context "default": context not found: open /Users/wujie/.docker/contexts/meta/37a8eec1ce19687d132fe29051dca629d164e2c4958ba141d5f4133a33f0688f/meta.json: no such file or directory
|-----------|------------|----------------------|---------------------------|
| NAMESPACE |    NAME    |     TARGET PORT      |            URL            |
|-----------|------------|----------------------|---------------------------|
| kuboard   | kuboard-v3 | webui/80             | http://192.168.49.2:30080 |
|           |            | agentservertcp/10081 | http://192.168.49.2:30081 |
|           |            | agentserverudp/10081 | http://192.168.49.2:30081 |
|-----------|------------|----------------------|---------------------------|
🏃  为服务 kuboard-v3 启动隧道。
|-----------|------------|-------------|------------------------|
| NAMESPACE |    NAME    | TARGET PORT |          URL           |
|-----------|------------|-------------|------------------------|
| kuboard   | kuboard-v3 |             | http://127.0.0.1:57428 |
|           |            |             | http://127.0.0.1:57429 |
|           |            |             | http://127.0.0.1:57430 |
|-----------|------------|-------------|------------------------|
[kuboard kuboard-v3  http://127.0.0.1:57428
http://127.0.0.1:57429
http://127.0.0.1:57430]
❗  因为你正在使用 darwin 上的 Docker 驱动程序,所以需要打开终端才能运行它。

访问 http://127.0.0.1:57428
http://127.0.0.1:57429
http://127.0.0.1:57430 任意一个
在这里插入图片描述
默认用户名和密码是

admin/Kuboard123

在这里插入图片描述

3、Kuboard 添加集群

这里就以 Docker 运行 minikube,然后在 k8s 中部署 Kuboard 为例了

选择第一种方式,获取 token

在这里插入图片描述
ApiServer 地址 写 kubectl get nodes -o wide 获取的地址(我这里是 192.168.49.2),端口固定为 8443,需要以 https:// 开头
即 https://192.168.49.2:8443

在这里插入图片描述

4、Kuboard 查看k8s 集群内容

需要先选择访问集群的身份
在这里插入图片描述

5、体验自动/手动伸缩功能

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值