1 - 运维管理

1.1 - 用户管理

本文档介绍了如何在 KubeCube 上创建、管理用户。

准备工作

使用平台管理员账号登录 KubeCube。

新增用户

1、使用平台管理员账号登录 KubeCube 后,展开【组织管理】菜单,点击【用户管理】,进入用户管理页面。

user-manage

2、点击【新增用户】,填写用户信息。

user-add

  • 登录账号:
    • 不能超过253个字符;
    • 只能包含小写字母、数字,以及'-' 和 ‘.';
    • 须以字母数字开头;
    • 须以字母数字结尾;
    • 全局唯一标识,不允许重复,不允许修改。
  • 用户名:
    • 平台内展示的用户名,默认为登录账号。
  • 密码:
    • 长度不得少于8位且不大于20位;
    • 至少应包括字母、数字以及特殊符号中两类。
  • 电话:
    • 符合中国手机号规范,如188****1234;
    • 选填。
  • Email:
    • 符合日常邮件地址规范;
    • 选填。

点击【确定】,即创建该用户。

3、如果需要批量创建用户,可以点击【批量导入】-【下载模版】,填写表格内容后上传文件,即可批量创建表格内填写的用户。表格填写规范同上。

user-import

用户管理

使用平台管理员账号登录 KubeCube 后,展开【组织管理】菜单,点击【用户管理】,进入用户管理页面。

user-manage

在用户管理页面,可以看到平台内的所有用户,包括每个用户的登录账号、用户名、类型、状态、上次登录IP以及上次登录时间。

  • 类型:用户的登录方式,如果是使用账号密码登录,则类型为 “normal”;如果为其他登录方式,如LDAP、Github等通过第三方平台认证登录,则类型为对应的第三方平台名称。目前 KubeCube 只支持密码登录方式。
  • 状态:分为启用和禁用,启用状态用户可正常登录,禁用状态用户不可登录。

同时,平台管理员可以在该界面修改用户信息,包括用户密码、用户名、电话以及 Email,规范同上。用户登录账号不支持修改。

1.2 - 租户管理

本文档介绍了如何在 KubeCube 上进行租户管理,并管理租户下的项目和成员。

准备工作

使用平台管理员或租户管理员账号登录 KubeCube。

租户管理

新增租户

1、使用平台管理员账号登录 KubeCube,展开【组织管理】菜单,点击【租户管理】,进入租户管理页面。

2、点击【新增租户】,填写租户信息。

tenant-manage

  • 租户名称:平台内展示的租户名。
  • 租户标识:
    • 长度不得少于2位且不大于32位;
    • 只能包含小写字母、数字,以及中划线 ‘-’ ;
    • 全局唯一标识,不允许重复,不允许修改。

租户管理

使用平台管理员账号登录 KubeCube,展开【组织管理】菜单,点击【租户管理】,进入租户管理页面,可以查看到平台下所有的租户;使用租户管理员账号登录,进入租户管理页面,可以查看到该租户管理员所管理的所有租户。

同时可以在该界面快捷添加成员、添加项目、修改租户名称。

tenant-manage

项目管理

在租户管理页面点击上方的【项目】,切换到项目管理页面。

project-manage

点击【新增项目】,即可添加项目:

  • 所属租户:选择权限内的已有租户;
  • 项目名称:项目的展示名称;
  • 项目标识:
    • 长度不得少于2位且不大于32位;
    • 只能包含小写字母、数字,以及中划线 ‘-’ ;
    • 全局唯一标识,不允许重复,不允许修改。
  • 项目描述:对该项目的描述性语言。

添加项目成功后,也可以在该页面直接为该项目或其他项目添加项目成员。

成员管理

在租户管理页面点击上方的到【成员】,切换到成员管理页面。

member-manage

点击【添加成员】,即可为指定的租户或项目添加成员。

  • 所属租户:选择权限内的租户;
  • 所属项目:选择所选租户下的项目,如果选择【不指定】,则为添加租户成员,否则为项目成员;
  • 账号:选择平台内的用户;
  • 角色:指定所选用户的角色,如果【所属项目】选择【不指定】,则角色可设置为租户管理员或普通成员;如果【所属项目】选择具体项目,则角色可设置为项目管理员或普通成员。

添加成员成功后,可以在该页面进行租户成员和项目成员的管理。同时可以在右上方,根据租户、项目、角色对成员进行过滤和搜索。

1.3 - 角色管理

KubeCube 的角色管理基于 Kubernetes 的 RBAC 实现,对多集群提供了统一的认证鉴权功能

内置角色

KubeCube 针对不同的层级,内置了相应的管理员角色和只有读权限的 reviewer 角色

权限\角色platform-admintenant-adminproject-adminreviewer
集群管理
角色管理
角色查看
用户管理
节点管理
所有租户管理
所有租户成员管理
本租户管理
本租户成员管理
所有项目管理
所有项目成员管理
租户下项目管理
租户下项目成员管理
本项目管理
本项目成员管理
管理 namespace
管理工作负载
管理卷
管理 service
管理 ingress
管理 secrets
管理 serviceaccout
管理 subnamespaceanchor
查看工作负载
查看卷
查看 service
查看 ingress
查看 secrets
查看 serviceaccout
查看 subnamespaceanchor

KubeCube 使用 HNC 来实现 tenant、project 和 namespace 的层级,以及彼此之间的隔离;为了实现 namespace 层级的隔离,除 platform-admin 外所有角色,通过 subnamespaceanchor 资源来管理 namespace

管理角色

通过角色标签栏来选择角色层级,点击【添加角色】来新建自定义角色,【继承已有】会以本层级的 admin 角色为模版新建出角色,【自定义】可以自定义编辑新角色

add-role.png

通过勾选具体的权限项来自定义角色的权限,点击【修改】提交修改

mgr-role.png

1.4 - 配额管理

KubeCube 在 Kubernetes 原生的资源配额能力上进行了拓展,在租户层级即可对资源配额进行限制,在使用体验上与 Kubernetes 原生的 ResouceQuota 保持一致

KubeCube 目前支持对 nvidia gpu 进行资源配额

资源配额结构

resourcequota.png

资源配额的计算结构遵循以下约束:

  1. 租户下 namespace 的资源配额总和 < 租户配额
  2. 集群下租户的资源配额总和 < 集群的物理资源

CubeResourceQuota 是 KubeCube 对于 namespace 级别的 ResourceQuota 的上层抽象,基于 CRD 实现

Tenant 资源配额

前置要求

创建一个租户

设置租户的资源配额

选择租户,点击【调整配额】对指定集群下的租户进行资源配额的设置

tenant-quota.png

在可填框中填入期望设置的资源配额,点击【确定】保存配额设置

  • 【集群可分配】表示该集群剩余可分配资源
  • 【租户已分配】表示该租户下所有 namespace 已分配的资源总和

modify-tenant-quota.png

创建 Namespace 并设置资源配额

前置要求

创建一个租户,在租户下创建项目

设置 namespace 的资源配额

点击右上方【租户】选择框,选择租户,点击【创建空间】创建新的 namespace 并设置资源配额,也可以点击【修改】对已创建的 namespace 的资源配额进行修改

ns-quota.png

创建 namespace 时,需要选择空间所属的集群、租户、项目,namespace 一旦创建,其所属关系不能更改。在可填框中填入期望的资源配额,点击【确定】使资源配额生效

【租户可分配】表示该 namespace 所属的租户所剩的可分配资源配额

modify-ns-quota.png

1.5 - K8s集群管理

1.5.1 - 多集群管理

KubeCube 提供多集群管理的能力,可以基于管控集群添加或者删除集群,并对所有接管的集群提供统一的认证和鉴权入口

⚠️ 计算集群信息不允许修改,若有修改需求,请先删除计算集群再重新添加,该操作存在的一定风险,删除计算集群期间,计算集群所有资源不受管控集群管控,认证和鉴权功能暂时关闭,直到该集群被重新添加

查看集群信息

选择集群查看对应的基本信息,Node、StorageClass、NetworkPolicy 以及 PV

cluster-inspect

添加计算集群

部署新集群并添加

纳管已有集群

删除计算集群

点击【删除配置】来删除计算集群,管控集群无法通过 Console 删除。删除计算集群意味着 KubeCube 控制面不再接管该集群,该集群恢复被接管前的样子,集群上运行的工作负载、服务等不会受到影响,可以通过添加该集群来重新接管

cluster-manager

1.5.2 - 集群级资源管理

1.5.2.1 - 存储类别(StorageClass)

KubeCube 提供对 k8s StorageClass 资源的原生管理能力

查看 StorageClass

点击【集群管理】,选择需要查看的集群,点击【存储类别】,查看该集群中所有的 StorageClass,可以在右上角搜索栏中输入资源名称进行模糊匹配,点击【删除】可删除此 StorageClass

view-storageclass

创建 StorageClass

点击【创建存储类别】来创建新的 StorageClass

create-storageclass

1.5.2.2 - 存储声明(PV)

PersistentVolume 应该由集群管理员事先提供,KubeCube 对其拥有查看和删除的能力

查看 PersistentVolume

点击【集群管理】,选择需要查看的集群,点击【持久存储】来查看 PersistentVolume 详情,点击【删除】可以删除该资源

pv

pv-view

1.5.2.3 - 集群节点(Node)

KubeCube 支持集群管理员通过 Console 页面管理各集群的 Node,也支持集群管理员直接使用黑屏操作对 各集群 Node 进行管理

查看节点信息

点击 Node 名称来查看节点的具体信息,点击【更多】查看 Node 的所有标签,

node-info

添加节点

KubeCube 支持集群管理员通过黑屏操作来自行添加节点,也可以点击【添加节点】来使用 KubeCube 的脚本来进行节点添加

// todo:确认 master 和 node 节点的添加细节

add-node

节点操作

点击【编辑标签】来对节点的标签进行编辑

edit-labels

点击【禁止调度】来限制 pod 调度到该节点

no-schedual

点击【更多】来对节点进行更多高级操作,包括:设置节点类型、设置污点、平滑迁移等

edit-node

1.5.2.4 - 网络策略(NetworkPolicy)

NetworkPolicy 依赖 CNI 实现,创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的,KubeCube 默认使用 calico

查看 NetworkPolicy

点击【集群管理】,选择要操作的集群,点击【网络策略】,点击【查看详情】可以查看 NetworkPolicy 的详细描述,点击【设置】可以对 NetworkPolicy 进行修改,点击【删除】可以删除该资源

view-networkpolicy

创建 NetworkPolicy

点击【创建网络策略】可以创建新的 NetworkPolicy

create-networkpolicy

1.6 - 操作审计

本文档介绍了如何在 KubeCube 上查询和导出操作审计日志。

准备工作

使用平台管理员账号登录 KubeCube。

开启操作审计

部署好 KubeCube 后,操作审计功能默认开启。如果需要关闭或开启操作审计功能:

1、使用平台管理员账号登录 KubeCube;

2、点击页面右上角【切换到控制台】,点击任意空间,进入到控制台页面;

3、在左侧菜单栏点击【自定义资源CRD】,进入到集群级别 CRD 列表,可以点击右上方输入 “hotplug” 进行搜索,找到 “hotplugs.hotplug.kubecube.io” CRD,点击【v1】版本进入 CRD 详情页;

4、选择 common 实例,点击【设置YAML】,找到 spec.component.name=audit,将 “status” 改成 “disabled”,即关闭审计功能;改为 “enabled”,为开启审计功能。详细配置说明见 热插拔

5、配置 ElasticSearch:

  • 如果需要安装内置 ElasticSearch,修改上述 common 实例,找到 spec.component.name=elasticsearch,将 “status” 改成 “enabled”,在集群内安装 ElasticSearch。

  • 如果需要连接外部 ElasticSearch,需要修改审计服务的deployment的环境变量:

    1. kubectl edit deploy audit -n kubecube-system

    2. 添加环境变量:AUDIT_WEBHOOK_HOST、AUDIT_WEBHOOK_INDEX、AUDIT_WEBHOOK_TYPE,如

      env:
      - name: AUDIT_WEBHOOK_HOST
        value: http://elasticsearch-master.elasticsearch:9200
      - name: AUDIT_WEBHOOK_INDEX
        value: audit
      - name: AUDIT_WEBHOOK_TYPE
        value: logs
      
  • 如果同时配置了内部和外部 ElasticSearch,优先将审计日志发到外部 ElasticSearch。

查询审计日志

使用平台管理员账号登录 KubeCube 后,展开【管控运维】菜单,点击【操作审计】,进入操作审计页面。

audit-manage

如图所示,在该页面展示出了所有的审计日志,包括审计操作者的账号、操作的时间、IP地址、事件名称、资源、状态。同时平台管理员也可以根据账号、IP地址等进行过滤查询。

导出审计日志

在操作审计页面,对审计日志查询后,点击【导出】,即可对查询结果进行导出。导出文件格式为csv,导出的日志条数默认不超过10000条。

2 - K8s资源管理

2.1 - 工作负载管理

2.1.1 - Deployment

本文档介绍了如何在 KubeCube 上创建、使用和编辑 Deployment。

准备工作

创建一个租户,在租户下创建一个项目,在项目下创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 Deployment

1、选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击 【Deployments】,进入 Deployment 管理页面。

deploy-apply

2、点击【部署】,进入创建 Deployment 页面,填写信息后,点击【立即创建】,即可创建一个 Deployment。

  • 基本信息
    • 名称:由小写字母、数字或中划线组成,长度1~63位,以字母开头,字母或数字结尾;
    • 副本数:默认为1个;
    • 更新策略
      • 最短就绪时间:新创建的副本准备就绪后,被视为可用前需要保持正常的时间下限,单位(秒);
      • 最大超预期副本数:可创建的最大超过所需副本的副本数量或百分比;
      • 最大不可用副本数:更新过程中不可使用的副本数上限个数或百分比;
  • 容器配置
    • 容器名称:副本运行的容器名称;
    • 镜像:容器运行的镜像
    • 配置:配额设置,包括请求配额(基础配置)、最大配额(配置上限),以及 GPU 配置;
    • 挂载数据卷:选择已创建的数据卷,并设置挂载目录和子路径等;
    • 环境变量:配置副本的环境变量;
    • 容器类型:分为业务容器和 init 容器,init 容器不支持就绪探针,必须可以执行结束。一个 pod 可以有多个 init 容器,它们将依次在业务容器运行前执行。
    • 启动命令:容器启动时即执行该命令;
    • 启动命令参数:执行启动命令时所需的参数;
    • 存活探针:可以开启存活探测器,并配置,具体配置方法可参考 https://v1-19.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
    • 就绪探针:可以开启就绪探测器,并配置,具体配置方法可参考 https://v1-19.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
    • 生命周期-停止前:在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此命令会被调用。
    • 生命周期-启动后:这个回调在容器被创建之后立即被执行。 但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。 没有参数传递给处理程序。
    • 容器端口:需要在副本的 IP 地址上公开的端口;
    • 镜像拉取策略:可以选择 Always、Never、IfNotPresent;
  • 高级配置
    • 仓库密钥:如果配置的镜像需要密钥拉取,选择已创建的 Secret;
    • 标签:给该 Deployment 添加标签;
    • 注释:给该 Deployment 添加注释;
    • 部署策略:给该 Deployment 添加节点亲和性、副本亲和性、副本反亲和性、容忍等部署规则。

管理 Deployment

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Deployments】,进入 Deployment 管理页面,可以看到该命名空间下的所有 deployment 名称以及状态。

这里的状态指的是该 deployment 下所有副本的状态。

  • desired:预期的副本数;
  • updated:已经是最新版本的副本数;
  • available:可用副本数;
  • unavailable:不可用副本数;
  • total:总副本数。

同时也可以根据名称对列表进行搜索,或对单个 deployment 进行副本数调整、滚动更新、删除,以及修改 Yaml。

deploy-manage

查看 Deployment 详情

在 Deployment 管理页面,点击任一 deployment 名称,可以进入到该 deployment 详情页。

deploy-detail

在 Deployment 详情页,可以查看到 deployment 的具体信息,以及该 deployment 所关联的所有副本的详情、副本的监控数据以及该 deployment 和副本的事件信息和 condition 信息。

2.1.2 - StatefulSet

本文档介绍了如何在 KubeCube 上创建、使用和编辑 StatefulSet。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 StatefulSet

1、选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Statefulsets】,进入StatefulSet 管理页面。

statefulset-apply

2、点击【部署】,编写 statefulset 的 yaml 文件。点击【确定】,即可部署该 statefulset。

statefulset 的规范可参考:https://v1-20.docs.kubernetes.io/docs/concepts/workloads/controllers/statefulset/。

管理 StatefulSet

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Statefulset】,进入 StatefulSet 管理页面。在管理页面,可以看到该命名空间下的所有 statefulSet。

同时也可以根据名称对列表进行搜索,或对单个 statefulset 进行副本数调整、删除,以及修改 Yaml。

statefulset-manage

查看 StatefulSet 详情

在 StatefulSet 管理页面,点击任一 statefulSet 名称,即可进入到该 statefulSet 详情页。

statefulset-detail

StatefulSet 详情页除了可以管理 StatefulSet,还可以查看 StatefulSet 的详细信息,关联的副本信息和副本的监控数据,以及 StatefulSet 和关联副本的事件和 condition 信息。

2.1.3 - Job

本文档介绍了如何在 KubeCube 上创建、使用和编辑 Job。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 Job

1、选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Job】,进入 Job 管理页面。

job-apply

2、点击【部署】,编写 job 的 yaml 文件。点击【确定】,即可部署该 job。

job 的 规范可参考:https://v1-20.docs.kubernetes.io/docs/concepts/workloads/controllers/job/。

管理 Job

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Job】,进入 Job 管理页面。在管理页面,可以看到该命名空间下的所有 job 名称以及对应的状态、执行情况、运行时长,并可以在该界面对 job 进行删除操作。同时也可以根据名称对 job 进行搜索。

job-manage

查看 Job 详情

在 Job 管理页面,点击任一 job 名称,即可进入到该 job 详情页。

job-detail

Job 详情页除了可以管理 Job,还可以查看 Job 的详细信息,关联的副本信息和副本的监控数据,以及 Job 和关联副本的事件和 condition 信息。

2.1.4 - CronJob

本文档介绍了如何在 KubeCube 上创建、使用和编辑 CronJob。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 CronJob

1、选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【CronJob】,进入 CronJob 管理页面。

cronjob-apply

2、点击【部署】,编写 CronJob 的 yaml 文件。点击【确定】,即可部署该 CronJob。

CronJob 的 规范可参考:https://v1-20.docs.kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/。

管理 CronJob

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【CronJob】,进入 CronJob 管理页面。在管理页面,可以看到该命名空间下的所有 CronJob ,包括对应的名称、空间、状态、定时调度设置、正在运行的任务数以及创建时间。并可以在该界面对 CronJob 进行删除和修改操作。同时也可以根据名称对 CronJob 进行搜索。

cronjob-manage

查看 CronJob 详情

在 CronJob 管理页面,点击任一 CronJob 名称,即可进入到该 CronJob 详情页。

cronjob-detail

CronJob 详情页除了可以管理 CronJob,还可以查看 CronJob 的详细信息,根据状态过滤该 CronJob 关联的任务列表,以及查看该 CronJob 和该 CronJob 所关联的副本的事件。

2.1.5 - Pod

本文档介绍了如何在 KubeCube 上管理 Pods。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

管理 Pod

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【Pod】,进入 Pod 管理页面。在管理页面,可以看到该命名空间下的所有 pod,包括每个 pod 的名称、IP、状态、重启次数、CPU 使用量、内存使用量以及创建时间。

同时也可以根据名称对列表进行搜索,或对单个 pod 进行查看和删除。

pod-manage

2.1.6 - CRD

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 CRD

选择租户和项目,选择集群和空间,点击左侧【自定义资源 CRD】,进入自定义资源列表页面。点击【创建自定义资源】可以以 YAML 的模式创建自定义资源 CRD。

manage

创建 CR

在 CRD 列表页面,点击具体一条记录的版本,进入 CRD 关联的实例页面,可以管理和创建相应的 CR。

creatercr

2.1.7 - DaemonSet

本文档介绍了如何在 KubeCube 上创建、使用和编辑 DaemonSet。

准备工作

创建一个租户,在租户下创建一个项目,在项目下创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 DaemonSet

1、选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击 【DaemonSets】,进入 DaemonSet 管理页面。

daemonset-apply

2、点击【部署】,编写 daemonSet 的 yaml 文件。点击【确定】,即开始部署该 daemonSet。

daemonSet 的 规范可参考:https://v1-20.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/。

注意,daemonSet 的 namespace 应与当前所在 namespace 一致。

管理 DaemonSet

选择租户和项目,选择集群和空间,展开【工作负载】菜单,点击【DaemonSets】,进入 DaemonSet 管理页面,可以看到该命名空间下的所有 daemonSet,包括名称、级别以及创建时间。

同时也可以根据名称对列表进行搜索,或对单个 daemonSet 进行删除或修改。

daemonset-manage

查看 DaemonSet 详情

在 DaemonSet 管理页面,点击任一 daemonSet 名称,可进入到该 daemonSet 详情页。

daemonset-detail

在 DaemonSet 详情页,可以查看到 daemonSet 的具体信息,以及该 daemonSet 所关联的所有副本的详情、副本的监控数据以及该 daemonSet 和副本的事件信息和 condition 信息。

2.2 - 服务与发现

2.2.1 - Service

本文档介绍了如何在 KubeCube 上创建、使用和编辑 Service。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,在命名空间下创建一个 Deployment,创建一个账号并赋予该命名空间操作权限。

创建 Service

1、选择租户和项目,选择集群和空间,展开【服务与发现】菜单,点击【Services】菜单按钮,进入 Service 管理页面。

manage.png

2、点击【创建服务】按钮,进入创建服务页面,填写信息后,点击【立即创建】按钮,即可创建一个 Service。

create.png

  • 名称:输入服务名称

  • 类型:选择服务类型为 ClusterIP 或者 NodePort

  • 使用方式:对于 ClusterIP 类型,需要选择使用方式为常规服务、Headless 服务或外部服务

  • Selector:选择关联的工作负载,支持高级自定义

  • 标签:定义标签

  • Ports:添加应用端口与服务端口的映射关系

  • 会话保持:开通/关闭会话保持

管理 Service

选择租户和项目,选择集群和空间,展开【服务与发现】菜单,点击【Services】菜单按钮,进入 Service 管理页面,可以对 Service 列表进行设置重编辑,删除和 Yaml 设置。

manage.png

查看 Service 详情

在 Service 管理页面,点击具体一条服务名称,进入 Service 详情页面。

servicedetail.png

Service 详情页面除了可以管理 Service,还可以查看 Service 的详细信息、关联的副本信息和事件信息,支持设置 Nginx Ingress 类型的对外服务端口供外部访问。

2.2.2 - Ingress

本文档介绍了如何在 KubeCube 上创建、使用和编辑 Ingress。KubeCube 默认使用 Nginx Ingress。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,命名空间下创建一个 Service,创建一个账号并赋予该命名空间操作权限。

创建 Ingress

1、选择租户和项目,选择集群和空间,展开【服务与发现】菜单,点击【Ingresses】菜单按钮,进入 Ingress 管理页面。

manage.png

2、点击【创建负载均衡】按钮,进入创建负载均衡页面,填写信息后,点击【立即创建】按钮,即可创建一个 Ingress。

create.png

  • 名称:输入 Ingress 名称

  • 端口:选择对外暴露访问的端口

  • 调度算法:选择负载均衡轮询策略

  • 转发规则:设置 Host,设置 Path 与 Service 端口的映射关系,可以添加多条转发规则

  • 会话保持:开通/关闭会话保持

管理 Ingress

选择租户和项目,选择集群和空间,展开【服务与发现】菜单,点击【Ingresses】菜单按钮,进入 Ingress 管理页面,可以对 Ingress 列表进行设置重编辑,删除和 Yaml 设置。

manage.png

查看 Ingress 详情

在 Ingress 管理页面,点击具体一条 Ingress 记录的名称,进入详情页面。

ingressdetail.png

Ingress 详情页面除了可以管理 Ingress,还可以查看 Ingress 的详细信息、关联的 Service 信息和事件信息。

2.3 - 配置管理

2.3.1 - Secret

本文档介绍了如何在 KubeCube 上创建、使用和编辑 Secret。

Kubernetes Secret 用于存储和管理一些敏感数据,比如密码密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问 Secret 里保存的信息。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 Secret

1、选择租户和项目,选择集群和空间,展开【配置】菜单,点击【Secret】菜单按钮,进入 Secret 管理页面。

manage.png

2、点击【创建 Secret】按钮,进入创建 Secret 页面,填写信息后,点击【立即创建】按钮,即可创建一个 Secret。

create.png

  • 名称:输入 Secret 名称。
  • 类型:
    • Opaque:base64 编码格式的 Secret,用来存储密码、密钥等。
    • DockerConfigJson : 用来存储私有 docker registry 的认证信息。
    • IngressTLS:配置 Ingress TLS 密钥。
  • 根据选择的类型,输入相应的信息。

查看 Secret 详情

在 Secret 管理页面,点击具体一条 Secret 记录的名称,进入详情页面查看 Secret 的详细信息。

detail.png

2.3.2 - ConfigMap

本文档介绍了如何在 KubeCube 上创建、使用和编辑 ConfigMap。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 ConfigMap

1、选择租户和项目,选择集群和空间,展开【配置】菜单,点击【ConfigMap】菜单按钮,进入 ConfigMap 管理页面。

manage.png

2、点击【创建 ConfigMap】按钮,进入创建 ConfigMap 页面,填写信息后,点击【立即创建】按钮,即可创建一个 ConfigMap。

create.png

  • 名称:输入 ConfigMap 名称。
  • 数据:输入键值对形式的数据信息。

管理 ConfigMap

选择租户和项目,选择集群和空间,展开配置菜单,点击 ConfigMap 菜单按钮,进入 ConfigMap 管理页面。在 ConfigMap 管理页面可以对 ConfigMap 进行设置、删除和 Yaml 设置。

manage2.png

查看 ConfigMap 详情

在 ConfigMap 管理页面,点击具体一条 ConfigMap 记录的名称,进入详情页面查看 ConfigMap 的详细信息。

detail.png

2.4 - 存储管理

2.4.1 - PVC

本文档介绍了如何在 KubeCube 上创建、使用和编辑 PVC(Persistent Volume Claim)。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

创建 PVC

1、选择租户和项目,选择集群和空间,点击【存储】菜单,进入 PVC 管理页面。在管理页面可以进行 PVC 记录的添加、设置、删除和 Yaml 设置。

manage1.png

2、点击【创建存储声明】,弹出创建存储声明的窗口。

create.png

  • 存储类别:选择存储类别,存储类别可以在集群管理页面添加
  • 名称:存储声明名称
  • 容量:填写所需存储容量
  • 模式:独占读写( ReadWriteOnce:读写权限,并且只能被单个节点挂载 )、只读共享( ReadOnlyMany:只读权限,允许被多个节点挂载 )、共享读写( ReadWriteMany:读写权限,允许被多个节点挂载 )

查看 PVC 详情

在 PVC 管理页面选择一条 PVC 记录,可以查看该 PVC 记录的详细信息,可以查看绑定的副本信息和监控信息。并且可以管理操作,包括删除、设置和 Yaml 设置。

detail.png

2.5 - 其他

2.5.1 - 密钥管理

本文档介绍了如何在 KubeCube 上进行密钥管理。

密钥管理提供 AccessKey 和 SecretKey 供用户系统调用 OpenAPI 接口时进行认证。

管理密钥

用户登录后,鼠标移动到右上角用户名称,在下拉菜单中点击【密钥管理】,进入密钥管理页面。在密钥管理页面可以添加密钥、删除密钥和查看密钥信息。

keymanage.png

使用密钥

使用 AccessKey 和 SecretKey 可以获取用户 token,将token放到请求头可以请求 KubeCube 的 OpenAPI 接口。

HTTP Request:

GET /api/v1/cube/key/token

Query Parameters:

ParameterDescription
accessKeyAccessKey
secretKeySecretKey

Response:

CodeInfo
200{“token”: “token info”}

2.5.2 - Yaml 编排

本文档介绍了如何在 KubeCube 上使用 YAML 编排。

准备工作

创建一个租户,在租户下创建一个项目,在项目下一个创建一个命名空间,创建一个账号并赋予该命名空间操作权限。

YAML 编排

选择租户和项目,选择集群和空间,点击【 YAML 编排】 菜单,弹出 YAML 编排界面。

yamlcreate.png

填写要创建的资源的 YAML 格式定义,或者从文件导入,或者从已有资源导入,编辑完成后点击【确定】完成 YAML 编排。

3 - 日志

3.1 - 采集任务管理

采集任务管理,用于采集Kubernetes集群中容器的日志,包括容器的标准输出和容器中的日志文件。

创建日志采集任务

日志采集任务列表 如图所示,点击【创建日志任务】,创建指定服务的日志采集任务。

基础配置:

基础配置部分如图所示:
日志采集任务基础配置

  • 日志任务名称:可任意填写服务的日志采集任务名,比如nginx等;

  • 日志源类型:

    • 容器标准输出:容器中的标准输出流;
    • 容器日志:容器内产生的日志文件;
  • 标签选择器:标签选择器类似Kubernetes中的LabelSelector,用于指定日志采集任务匹配的Pods,需要和需要被采集日志的Pods中Label保持一致;

  • 日志采集路径:如果选择采集容器日志文件,需要输入日志路径,路径为glob表达式的形式,例如:/var/log/*.log。另外需注意的是,如果填写/var/log,不会采集目录下的所有文件,会被认为是采集/var目录下的log文件。如果填写/var/log/*,则会采集/var/log下本级的目录,如果需要遍历,可以填写/var/log/**

高级配置:

日志采集任务高级配置1

  • 容器:如果Pod中有多个容器,则建议指定具体的容器名称,否则会给采集所有容器下的日志;

  • 元信息/注入Pod标记:在日志配置中注入Pod的label(标签)、env(环境变量)、annotation(注解),可用作日志查询页面的筛选条件;

  • 元信息/自定义标记:自定义Key-Value值,可用作日志查询页面的筛选条件;

日志采集任务高级配置1

  • 日志多行配置:日志多行配置用于指定处理跨多行消息的处理方式

    • pattern:指定用于匹配多行的正则表达式;
    • negate:定义模式是否被否定;
    • match:指定如何把多行合并成一条;
  • 单条日志大小上限:避免单行日志太大会导致日志采集Agent OOM异常等;

  • 排除日志:该路径下的文件将被忽略,日志内容不被收集;支持正则匹配,建议排除压缩文件,例如:.gz$;

  • 忽略日志文件:将忽略日志任务创建时间起对应时间段内的日志文件;

  • 日志保留:可指定日志保留文件数或日志保留天数,日志Agent会帮助定时清理;

更新日志采集任务

在日志任务管理的列表中,点击操作列的设置即可,更新字段可参考上面创建部分。

删除日志采集任务

在日志任务管理的列表中,点击操作列的删除即可,删除后不再采集匹配的Pod的日志。

3.2 - 日志查询

搜索模式

查询条件

如下图所示,支持按以下条件筛选日志任务,查询日志数据:

日志查询

  • 日志任务:选择在日志任务管理中创建的日志采集任务;
  • 查询语句:输入查询语句,示例:status:200 AND extension:PHP;
  • 筛选条件:选择Key-Value值,可组合条件,快速筛选所需日志数据;
  • 时间范围:
    • 默认查询时间范围为近1小时;
    • 提供快捷选项,可快速选择日志查询时间范围;
    • 自定义时间:自定义选择开始日期和结束日期;点击【切换】,可自定义填写具体的开始时间和结束时间,时间粒度最小为秒级。

日志柱形图

返回日志数据结果后,日志查询页面将展示日志柱形图。日志柱形图是时间横轴、日志采集数纵轴组成的蓝色柱形图表。根据蓝色柱形的波动可以直观看出该时间段内日志产生数量的变化趋势。如果当前日志为服务器的访问日志,就可以快速地发现这段时间内整个服务的负载情况以及用户访问情况。
日志柱状图还提供了丰富的交互,用户可快速定位日志。点击柱形即可定位到更细粒度的时间区间;或者拖动选择所需查找的时间区间,前端立即返回该时间段内的日志数据。
鼠标移动至柱形,即可展示该柱形对应日志的入库时间以及日志数目。
日志柱形图上方展示完整时间区间内的日志采集条数,并支持自定义柱形图展示粒度,最小粒度为秒级。

日志内容展示

设置完成日志查询条件后,前端界面即可展示日志内容。左侧为日志采集时间,可正逆序排列。右侧为日志内容,点击左上方组件,可切换日志内容展示形式,提供的形式有原始日志以及Json形式。

自定义日志内容展示列
日志查询感兴趣字段
用户可自定义感兴趣字段,展示或者隐藏不必要的列信息。
如图所示,用户可按需选择字段,或输入字段名称进行模糊搜索,选择完成后,前端界面将展示用户所选字段的内容列。比如,选择namespacepod_name这个两个字段后,可在日志查询页面看到日志的namespace和产生的pod_name信息,便于排查问题。

实时流模式

实时流模式可用于上线场景,用户可实时关注与跟踪日志数据。通过设置刷新频率,前端界面实时滚动输出日志数据。

4 - 告警管理

4.1 - 平台组件告警

本文档介绍了如何在 KubeCube 中配置平台级告警,包括配置集群内的 Alertmanager 、告警通知联系人、通知路由规则、告警规则。

简介

默认情况下,KubeCube 会在平台部署kubecube-monitoring Chart,该 Chart 包含 Alertmanager 组件和默认的 Alertmanager Config Secret配置以及平台基础组件的告警规则。默认情况下,KubeCube 创建的 Alertmanager Config Secret 不会因为 Chart 的升级或删除操作而被修改,以防用户的配置丢失。

准备工作

以平台管理员角色登录 KubeCube 平台。

配置 AlertManager

登录到 KubeCube 平台,点击【运维管理】,侧边栏选择【告警–全局告警配置】,列表页可以看到各个集群的AlertManager 的配置信息,点击【设置】按钮进行配置,

全局配置

am-global

若使用企业邮箱作为告警通知方式,需要在全局配置中配置以下字段:

  • smtp_smarthost : 邮箱服务器域名和端口信息,e.g. imap.163.com:465
  • smtp_from : 发件人邮箱
  • smtp_auth_username : 邮件服务器认证用户名
  • smtp_auth_password : 邮件服务器认证密码或授权码

若使用企业微信作为告警通知方式,需要在全局配置中配置以下字段:

  • wechat_api_url : 默认使用https://qyapi.weixin.qq.com/cgi-bin/
  • wechat_api_secret : 第三方企业应用的密钥
  • wechat_api_corp_id : 企业微信账号唯一 ID

通知方式

目前页面支持配置Email、WeChat、Webhook三种联系方式,其他联系方式如Slack、OpsEngine等会在后续版本支持 am-receivers

更多字段含义请参考Alertmanager官方文档中关于receivers的定义

通知路由规则

相关配置如下:

  • receiver : 选择上一步骤中定义的联系人
  • group_by : 当前 route 节点的分组规则
  • matchers : 当前 route 节点的匹配规则
  • group_wait : 告警组内的发送一条告警通知的等待时间
  • group_interval : 告警组内发送两条告警通知的间隔时间
  • repeat_interval : 相同告警发送的间隔时间

am-route

更多字段含义请参考Alertmanager官方文档中关于route的定义,当前页面暂不支持子路由的配置,会在后续版本提供支持。

管理告警规则

查看告警规则组

登录到 KubeCube 平台,点击【运维管理】,侧边栏选择【告警–告警规则】,列表页可以看到各个集群的PrometheusRule 的配置信息,默认情况下, KubeCube 为每个集群内置了基础资源以及平台组件的 PrometheusRule,

component-alerting

配置告警规则内容

可以点击【设置】按钮查看并配置每条告警规则的具体内容,包括

  • 表达式 : Promql表达式
  • for : 告警持续时长
  • 告警程度 : 可以在上述 通知方式中配置不同告警程度对应的 Receiver 来接收告警通知
  • Annotations
    • 摘要: 接收告警通知的摘要信息
    • 描述信息: 接收告警通知的具体描述信息,如发生故障的 Pod 所在的集群,空间等
    • Runbook Url: 针对该告警规则的运维排障文档,应作为最佳实践在企业内部进行维护
    • 也可以【展开更多配置】,添加更多自定义的Annotations(键-值对)
  • Labels: 为告警规则附带的标签信息(键-值对),可以配合通知路由规则 实现告警通知的高级配置

component-PrometheusRule

更多字段含义请参考Prometheus-Operator的API文档

4.2 - 通知策略管理

本文档介绍了如何在 KubeCube 中管理项目级别的告警联系人与通知策略。

准备工作

登录 KubeCube 平台并创建租户、项目、空间

联系人管理

推荐在一个告警通知策略内配置多个联系人,代表联系人组信息,而不是为每个联系人都创建一个通知策略。

  1. 登录到 KubeCube 控制台,选择租户项目后,侧边栏展开【告警】菜单,选择【告警策略组】,并点击创建.

  2. 弹出对话框后,填写告警联系人基本信息,目前页面支持配置Email、WeChat、Webhook三种联系方式,其他联系方式如Slack、OpsEngine等会在后续版本支持,如有需求可以通过列表页的【yaml配置】进行设置。

  • 名称: 标识联系人组的名称,如"frontend",在后续创建告警规则时作为关联。

Email配置

create-amc-email

  • 是否接收告警恢复通知
  • 收件人: 收件人的邮箱地址
  • 更多配置: 注意:以下配置默认使用集群全局配置,可以询问集群管理员获知。
    • smarthost: 邮箱服务器域名和端口信息,e.g. imap.163.com:465
    • from: 发件人邮箱
    • authUsername: 邮件服务器认证用户名
    • authPassword: 邮件服务器认证密码,需要提前在项目空间(kubecube-project-)创建一个Secret,再指定Secret和key
      • Secret: 选择已创建的Secret的名称
      • key: 选择指定Secret的key

更多配置请参考EmailConfig

WeChat配置

create-amc-wechat

  • 是否接收告警恢复通知
  • toUser: 接收告警通知的企业微信用户名
  • toParty: 接收告警通知的企业微信用户组
  • toTag: 接收告警通知的企业微信用户标签
  • 更多配置: 注意:以下配置默认使用集群全局配置,可以询问集群管理员获知。
    • apiURL: 微信第三方通知的apiURL
    • corpID: 企业微信账号唯一 ID,可以在我的企业中查看。
    • agentID: 第三方企业应用的 ID,可以在已创建的第三方企业应用详情页面查看。
    • apiSecret: 需要根据第三方企业应用的密钥,提前在项目空间(kubecube-project-)创建一个Secret,再指定Secret和key
      • Secret: 选择已创建的Secret的名称
      • key: 选择指定Secret的key

更多配置请参考企业微信文档以及WeChatConfig

Webhook配置

create-amc-webhook

  • 是否接收告警恢复通知
  • url: Webhook的url,用来接受HTTP POST请求
  • max_alerts: Alertmanager一次发往webhook通知中,包含告警的最大数量,当超过该值,告警会被截断,默认为全部发送。

更多配置参考WebhookConfig

高级功能

KubeCube 告警通知策略组支持高级策略配置,如

  • 配置告警组内的发送一条告警通知的等待时间(group_wait)
  • 配置告警组内发送两条告警通知的间隔时间(group_interval)
  • 配置相同告警发送的间隔时间(repeat_interval)
  • 配置嵌套的告警路由策略
  • 配置告警抑制规则

如果需要实现更灵活的自定义通知策略,可以通过点击【列表】页面的【yaml设置】进行设置与修改,相关字段请参考AlertmanagerConfig-CRD文档, 具体字段含义请参考Alertmanager配置

4.3 - 告警规则管理

本文档介绍了如何在 KubeCube 中管理项目级告警规则。

准备工作

  1. 登录 KubeCube 平台并创建租户、项目、空间
  2. 创建告警通知策略

告警规则管理

创建告警规则

  1. 登录到 KubeCube 控制台,选择租户项目后,侧边栏展开【告警】菜单,选择【告警规则】,并点击创建.
  2. 填写告警规则基本信息:

create-alertrule

  • 告警名称: 告警规则名称
  • 表达式:promql表达式,具体配置方式请参考prometheus文档
  • 持续时间:代表告警规则表达式持续被触发的时长,如果达到该期望时间,就触发一条告警。
  • 告警程度:告警程度信息
  • 通知策略组:选择告警触发后需要通知的联系人与相应的通知策略。
  • 告警描述信息: 告警触发后发送的告警描述信息,具体配置方式请参考Prometheus告警规则模版配置

告警状态查询

list-alertrule

在告警规则列表页面,可以查看项目下所有告警规则的状态,状态包含以下三种:

  • normal: 代表该告警规则未触发告警
  • pending: 代表告警规则被触发,但未达到期望持续时间。
  • firing:代表告警规则被触发,并达到期望持续时间。

点击【告警名称】的状态,可以查看触发该告警规则的具体对象信息,如空间信息,Pod信息等,静默功能将在后续版本中支持。

5 - 集群监控

5.1 - 平台组件监控

本文档介绍了如何在 KubeCube 中查看平台核心组件监控。

准备工作

以平台管理员角色登录 KubeCube 平台。

查看组件监控视图

当前 KubeCube 平台支持对以下组件的监控视图可视化查询:

  • 管控面 Pod 监控
  • CoreDNS 监控
  • Etcd 监控
  • Kube ApiServer 监控
  • Kube Controller Manager 监控
  • Kube Proxy 监控
  • Kube Scheduler 监控
  • Kubelet 监控
  • Prometheus 监控
  • Thanos Query 监控

可以登录到 KubeCube 平台,点击【运维管理】,侧边栏选择【组件监控】,进行查看

component-monitoring

点击需要查看的组件,即可查看对应的监控视图,以平台组件 pod 监控为例,点击【control-plane-pods】后,可以查看不同集群中,管控组件 Pod 的资源使用情况;对于其他组件,可以查看相应的核心指标监控。

control-plane-pods

5.2 - 监控能力说明

本文档介绍了 KubeCube 的监控能力。

总体能力说明

监控内容采集源说明
k8s 核心组件监控各个 k8s 服务组件暴露的 metrics 接口监控 k8s api-server、controller-manager、kube-proxy、scheduler、etcd、coredns和kubelet组件的功能运行情况。查看指标时以组件名字开头+下划线。
k8s 节点监控node-exportnode-export 监控 k8s 集群 node 节点的 cpu、memory、network、disk 等信息。
k8s 容器指标cAdvisork8s kubelet 内置的 cAdvisor 会监控各个节点中运行的容器。
k8s 资源监控kube-state-metricskube-state-metrics 关注各种 k8s 资源对象的指标信息,监控各项 k8s 资源包括node、deployment、pod等。

常用指标说明

Node-exporter

Node-exporter 关注容器的指标,更多指标信息参考 Node-exporter

Metric nameDescription
instance:node_num_cpu:sum节点的CPU核数
instance:node_load1_per_cpu:ratio节点的CPU负载率
instance:node_memory_utilisation:ratio节点内存使用率
node_cpu_*节点CPU指标
node_memory_*节点内存指标
node_disk_*节点磁盘指标
node_network_*节点网络指标

CAdvisor

CAdcisor 关注容器的指标,更多指标信息参考 cAdvisor

Metric nameTypeDescriptionUnit (where applicable)option parameter
container_cpu_cfs_periods_totalCounter容器生命周期中度过的 cpu 周期总数cpu
container_cpu_cfs_throttled_periods_totalCounter容器生命周期中度过的受限的 cpu 周期总数cpu
container_cpu_cfs_throttled_seconds_totalCounter容器 cpu 受限制的持续时间secondscpu
container_cpu_load_average_10sGauge监控过去10秒cpu负载的平均值cpuLoad
container_cpu_system_seconds_totalCounter内核态累计消耗的 cpu 时间secondscpu
container_cpu_usage_seconds_totalCounter累计消耗的 cpu 时间secondscpu
container_cpu_user_seconds_totalCounter用户态累计消耗的 cpu 时间secondscpu
container_file_descriptorsGauge打开的文件描述符数process
container_fs_io_currentGauge当前正在进行IO操作的进程数diskIO
container_fs_limit_bytesGauge容器文件系统可使用的字节数bytesdisk
container_fs_usage_bytesGauge容器文件系统已使用的字节数bytesdisk
container_memory_cacheGauge内存cache字节数bytesmemory
container_memory_failcntCounter内存达到限制值的次数memory
container_memory_mapped_fileGauge内存映射文件大小bytesmemory
container_memory_max_usage_bytesGauge记录的最大内存使用值bytesmemory
container_memory_usage_bytesGauge当前内存使用情况,包括所有内存bytesmemory
container_network_receive_bytes_totalCounter容器网络接收的累积字节数bytesnetwork
container_network_receive_errors_totalCounter容器网络接收时遇到的累积错误次数network
container_network_receive_packets_dropped_totalCounter容器网络接收时丢掉的网络包数network
container_network_receive_packets_totalCounter容器网络累积接收的网络包数network
container_network_tcp_usage_totalGauge容器的TCP链接使用统计tcp
container_network_transmit_bytes_totalCounter容器网络传输的累积字节数bytesnetwork
container_network_transmit_errors_totalCounter容器网络传输时遇到的累积错误次数network
container_network_transmit_packets_dropped_totalCounter容器网络传输时丢掉的网络包数network
container_network_transmit_packets_totalCounter容器网络传输累积的网络包数network
container_processesGauge容器正在运行的进程数process
container_socketsGauge容器打开的sockets链接数process
container_spec_cpu_periodGauge容器的CPU周期-
container_spec_cpu_quotaGauge容器的CPU配额-
container_spec_memory_limit_bytesGauge容器的内存限制bytes-
container_tasks_stateGauge处于这些状态的任务数 (sleeping, running, stopped, uninterruptible, or ioawaiting)cpuLoad
container_threadsGauge容器正在运行的threads数吗process
container_threads_maxGauge容器允许的最大threads数码process

Kube-state-metrics

Kube-state-metrics 关注各种 k8s 资源对象的指标信息,详细指标说明参考 kube-state-metrics 指标说明

Pod Metrics

Metric nameMetric typeLabels/tags
kube_pod_status_phaseGaugepod=<pod-name> namespace=<pod-namespace> phase=<Pending/Running/Succeeded/Failed/Unknown>
kube_pod_container_infoGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> image=<image-name> image_id=<image-id> container_id=<containerid>
kube_pod_container_status_waiting_reasonGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> reason=<ContainerCreating/CrashLoopBackOff/ErrImagePull/ImagePullBackOff/CreateContainerConfigError/InvalidImageName/CreateContainerError>
kube_pod_container_status_runningGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace>
kube_pod_container_status_terminated_reasonGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> reason=<OOMKilled/Error/Completed/ContainerCannotRun/DeadlineExceeded>
kube_pod_container_status_readyGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace>
kube_pod_container_status_restarts_totalCountercontainer=<container-name> namespace=<pod-namespace> pod=<pod-name>
kube_pod_container_resource_requests_cpu_coresGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> node=< node-name>
kube_pod_container_resource_requestsGaugeresource=<resource-name> unit=<resource-unit> container=<container-name> pod=<pod-name> namespace=<pod-namespace> node=< node-name>
kube_pod_container_resource_limitsGaugeresource=<resource-name> unit=<resource-unit> container=<container-name> pod=<pod-name> namespace=<pod-namespace> node=< node-name>
kube_pod_init_container_infoGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> image=<image-name> image_id=<image-id> container_id=<containerid>
kube_pod_init_container_status_runningGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace>
kube_pod_init_container_status_terminated_reasonGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace> reason=<OOMKilled/Error/Completed/ContainerCannotRun/DeadlineExceeded>
kube_pod_init_container_status_readyGaugecontainer=<container-name> pod=<pod-name> namespace=<pod-namespace>
kube_pod_init_container_resource_limitsGaugeresource=<resource-name> unit=<resource-unit> container=<container-name> pod=<pod-name> namespace=<pod-namespace> node=< node-name>

Deployment Metrics

Metric nameMetric typeLabels/tags
kube_deployment_status_replicasGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_status_replicas_availableGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_status_replicas_unavailableGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_status_conditionGaugedeployment=<deployment-name> namespace=<deployment-namespace> condition=<deployment-condition> status=<true/false/unknown>
kube_deployment_spec_replicasGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_spec_pausedGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_spec_strategy_rollingupdate_max_unavailableGaugedeployment=<deployment-name> namespace=<deployment-namespace>
kube_deployment_spec_strategy_rollingupdate_max_surgeGaugedeployment=<deployment-name> namespace=<deployment-namespace>

DaemonSet Metrics

Metric nameMetric typeLabels/tags
kube_daemonset_status_current_number_scheduledGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_status_desired_number_scheduledGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_status_number_availableGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_status_number_misscheduledGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_status_number_readyGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_status_number_unavailableGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>
kube_daemonset_updated_number_scheduledGaugedaemonset=<daemonset-name> namespace=<daemonset-namespace>

Stateful Set Metrics

Metric nameMetric typeLabels/tags
kube_statefulset_status_replicasGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_status_replicas_currentGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_status_replicas_readyGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_status_replicas_updatedGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_replicasGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_createdGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace>
kube_statefulset_status_current_revisionGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace> revision=<statefulset-current-revision>
kube_statefulset_status_update_revisionGaugestatefulset=<statefulset-name> namespace=<statefulset-namespace> revision=<statefulset-update-revision>

Job Metrics

Metric nameMetric typeLabels/tags
kube_job_spec_parallelismGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_spec_completionsGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_spec_active_deadline_secondsGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_status_activeGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_status_succeededGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_status_failedGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_status_start_timeGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_status_completion_timeGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_completeGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_failedGaugejob_name=<job-name> namespace=<job-namespace>
kube_job_createdGaugejob_name=<job-name> namespace=<job-namespace>

CronJob Metrics

Metric nameMetric typeLabels/tags
kube_cronjob_next_schedule_timeGaugecronjob=<cronjob-name> namespace=<cronjob-namespace>
kube_cronjob_status_activeGaugecronjob=<cronjob-name> namespace=<cronjob-namespace>
kube_cronjob_status_last_schedule_timeGaugecronjob=<cronjob-name> namespace=<cronjob-namespace>
kube_cronjob_spec_suspendGaugecronjob=<cronjob-name> namespace=<cronjob-namespace>
kube_cronjob_spec_starting_deadline_secondsGaugecronjob=<cronjob-name> namespace=<cronjob-namespace>

PersistentVolume Metrics

Metric nameMetric typeLabels/tags
kube_persistentvolume_capacity_bytesGaugepersistentvolume=<pv-name>
kube_persistentvolume_status_phaseGaugepersistentvolume=<pv-name> phase=<Bound/Failed/Pending/Available/Released>
kube_persistentvolume_infoGaugepersistentvolume=<pv-name> storageclass=<storageclass-name>

PersistentVolumeClaim Metrics

Metric nameMetric typeLabels/tags
kube_persistentvolumeclaim_access_modeGaugeaccess_mode=<persistentvolumeclaim-access-mode> namespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name>
kube_persistentvolumeclaim_infoGaugenamespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> storageclass=<persistentvolumeclaim-storageclassname> volumename=<volumename>
kube_persistentvolumeclaim_resource_requests_storage_bytesGaugenamespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name>
kube_persistentvolumeclaim_status_phaseGaugenamespace=<persistentvolumeclaim-namespace> persistentvolumeclaim=<persistentvolumeclaim-name> phase=<Pending/Bound/Lost>

Node Metrics

Metric nameMetric typeLabels/tags
kube_node_infoGaugenode=<node-address> kernel_version=<kernel-version> os_image=<os-image-name> container_runtime_version=<container-runtime-and-version-combination> kubelet_version=<kubelet-version> kubeproxy_version=<kubeproxy-version> pod_cidr=<pod-cidr> provider_id=<provider-id>
kube_node_spec_taintGaugenode=<node-address> key=<taint-key> value=<taint-value> effect=<taint-effect>
kube_node_status_capacityGaugenode=<node-address> resource=<resource-name> unit=<resource-unit>
kube_node_status_allocatableGaugenode=<node-address> resource=<resource-name> unit=<resource-unit>
kube_node_status_conditionGaugenode=<node-address> condition=<node-condition> status=<true/false/unknown>

6 - 镜像仓库

KubeCube 支持主流的镜像仓库,如 registry.cn-hangzhou.aliyuncs.com,docker.io,hub.c.163.com 等,同时也支持私有仓库,KubeCube 推荐使用社区主流的 Harbor 进行私有仓库的搭建,下文详述了在 KubeCube 中部署 Harbor 的方法

安装 helm3

参考 helm安装

确认 StorageClass

你可以选择 KubeCube 内置的 local-path 作为默认的 StorageClass,也可以使用自定义的 StorageClass

-> kubectl get storageclasses
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  28d

创建 Harbor 的 Namespace

创建指定的 namespace 来部署 Harbor 的相关组件

kubectl create namespace harbor-system

创建自定义证书(可选)

安装 Harbor 推荐使用 HTTPS 协议,需要 TLS 证书,如果不提供证书,Harbor 将会自己生成一个,不过它的有效期仅为一年

  • 生成证书

⚠️ Common Name 必须要设置为和你要给 Harbor 的域名保持一致

# 获得证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt

# 生成证书签名请求
openssl req -newkey rsa:4096 -nodes -sha256 -keyout tls.key -out tls.csr

# 生成证书
openssl x509 -req -days 3650 -in tls.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt
  • 使用证书生成 secret
kubectl create secret generic harbor-tls --from-file=tls.crt --from-file=tls.key --from-file=ca.crt -n harbor-system

设置 Harbor 的自定义安装参数

通过编辑 values.yaml 来复写 Harbor Chart 的安装参数,完整的 values.yaml 文件可以参考 goharbor

KubeCube 内置了 nginx-ingress controller

#Ingress 网关入口配置
expose:
  type: ingress
  tls:
    ### 是否启用 https 协议
    enabled: true
  ingress:
    hosts:
      ### 配置 Harbor 的访问域名,需要注意的是配置 notary 域名要和 core 处第一个单词外,其余保持一致
      core: harbor.kubecube.io
      notary: notary.kubecube.io
    annotations:
      ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "0"
      #### 如果是 traefik ingress,则按下面配置:
#      kubernetes.io/ingress.class: "traefik"
#      traefik.ingress.kubernetes.io/router.tls: 'true'
#      traefik.ingress.kubernetes.io/router.entrypoints: websecure
      #### 如果是 nginx ingress,则按下面配置:
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
      nginx.org/client-max-body-size: "0"

## 如果Harbor部署在代理后,将其设置为代理的URL,这个值一般要和上面的 Ingress 配置的地址保存一致
externalURL: https://harbor.kubecube.io

### Harbor 各个组件的持久化配置,并设置各个组件 existingClaim 参数为上面创建的对应 PVC 名称
persistence:
  enabled: true
  ### 存储保留策略,当PVC、PV删除后,是否保留存储数据
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "local-path"
    chartmuseum:
      storageClass: "local-path"
    jobservice:
      storageClass: "local-path"
    database:
      storageClass: "local-path"
    redis:
      storageClass: "local-path"
    trivy:
      storageClass: "local-path"

### 默认用户名 admin 的密码配置,注意:密码中一定要包含大小写字母与数字
harborAdminPassword: "admin@123"

### 设置日志级别
logLevel: info

安装 Harbor

  • 添加 Helm 仓库
helm repo add harbor https://helm.goharbor.io
  • 部署 Harbor
helm install harbor harbor/harbor -f values.yaml -n harbor-system
  • 域名配置

如果没有 DNS 服务,需要自行在 hosts 文件中配置域名和 node ip 的映射

-> cat /etc/hosts
...
x.x.x.x harbor.kubecube.io

访问 harbor

在浏览器中输入 harbor.kubecube.io 来访问 Harbor 仓库

用户:admin
密码:admin@123

harbor-view

下载 Harbor 证书并在 Docker 中配置

在 Harbor 管理页面中证书

ca-down

进入服务器,创建以 Harbor 域名为名的文件夹

mkdir -p /etc/docker/certs.d/harbor.kubecube.io

将下载下来 ca.crt 放到该文件夹下面,然后登陆 Harbor 仓库

docker login -u admin -p admin@123 harbor.kubecube.io

测试

docker pull ubuntu:16.04
docker tag ubuntu:16.04 harbor.kubecube.io/library/ubuntu:16.04
docker push harbor.kubecube.io/library/ubuntu:16.04

7 - 网络存储

7.1 - NFS服务

本文档介绍了如何在 KubeCube 上接入 NFS 服务。

准备工作

登录 NFS 服务器

  1. 通过 NFS 导出文件为 KubeCube 分配服务器访问权限

    修改 /etc/exports 文件,添加 {导出目录} {KubeCube应用所在节点IP}(rw,sync,no_subtree_check,insecure)。如:

    nfs-6

  2. 重新启动 NFS 服务器

    systemctl restart nfs-kernel-server
    
  3. 为 KubeCube 打开防火墙

    ufw allow from {KubeCube所在节点IP} to any port nfs
    

登录 K8s 集群 worker 节点

  1. 安装 NFS Common

    apt-get install nfs-commonyum install nfs-utils等。

  2. 修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,添加- --feature-gates=RemoveSelfLink=false

创建 StorageClass

登录 KubeCube 所在节点,创建以下文件并 apply,请根据实际环境修改部分参数。

配置 account 及相关权限

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default        #根据实际环境设定namespace,下面类同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
    # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

创建 NFS Provisioner

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default  #与RBAC文件中的namespace保持一致
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: qgg-nfs-storage  #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致
            - name: NFS_SERVER
              value: 10.173.32.164   #NFS Server IP地址
            - name: NFS_PATH  
              value: /mnt/linuxidc    #NFS挂载卷
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.173.32.164  #NFS Server IP地址
            path: /mnt/linuxidc     #NFS 挂载卷

创建 StorageClass

方式一:命令行操作

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:  	      
  archiveOnDelete: "false"

方式二:页面操作

  1. 以平台管理员身份登录 KubeCube;
  2. 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。

nfs-1

创建 PVC

在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别可以选择已创建过的 StorageClass。

nfs-2

创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理

nfs-3

创建工作负载

在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。

nfs-4

具体配置说明见 工作负载管理

检查结果

创建挂载 PVC 的工作负载后,登录 NFS 服务器,进入导出目录,可以看到已经创建出一个新的文件夹,文件夹命名为 ${namespace}-${pvcName}-${pvName}。

nfs-5

7.2 - Ceph集群

本文档介绍了如何在 KubeCube 上接入 Ceph 集群。

示例环境说明

产品版本
Kubernetesv1.20.9
KubeCubev1.0.2
Ceph15.2.1

准备工作

登录 Ceph master 节点

  1. 获取管理 key

    ceph auth get-key client.admin | base64
    
  2. 在 Ceph 集群中创建一个 KubeCube 专用的 pool 和用户

    ceph osd pool create kube 8 8
    ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd
    
  3. 获取该用户 key

    ceph auth get-key client.kube|base64
    

登录 K8s 集群 worker 节点

  1. 安装 ceph-common

    apt-get install ceph-commonyum install ceph-common等。

  2. 使用外部的 Provisioner 提供服务

    git clone https://github.com/kubernetes-incubator/external-storage.git    # v5.5.0
    cd external-storage/ceph/rbd/deploy 
    sed -r -i "s/namespace: [^ ]+/namespace: kube-system/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml 
    kubectl -n kube-system apply -f ./rbac
    

创建 Secret

登录 KubeCube 所在节点,执行以下命令:

# 替换为 Ceph 集群生成的 key
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='QVFEcGpqbGhqczJnQWhBQTByN3NNbHB4cTAwdGR1eWdqWk1LaUE9PQ==' --namespace=kube-system
kubectl create secret generic ceph-kube-secret --type="kubernetes.io/rbd" --from-literal=key='QVFDTHhUcGhMS0VMQWhBQWx3NU1MNzZneVRpR1dNYVdVckgxN0E9PQ==' --namespace=default

创建 StorageClass

方式一:命令行操作

vi sc.yaml 文件并 apply,以下为示例,需要根据 Ceph 集群信息修改参数。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
  annotations:
     storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: ceph.com/rbd
parameters:
  monitors: 10.173.32.173:6789  #修改成实际 Ceph Monitor IP
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: kube
  userSecretName: ceph-kube-secret
  userSecretNamespace: default
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"

关于上面的 adminId 等字段的具体含义请参考 Ceph RBD

方式二:页面操作

  1. 以平台管理员身份登录 KubeCube;
  2. 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。

ceph-1

创建 PVC

在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别选择 Ceph 对应的 StorageClass。

nfs-2

创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理

创建工作负载

在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。

nfs-4

具体配置说明见 工作负载管理

检查结果

检查相关 pod 是否正常运行,如果正常则配置成功。

8 - 排障系统

本文档介绍了如何在 KubeCube 上集成 KubeDiag 排障系统。

准备工作

  1. 由于 KubeDiag 使用 CertManager 进行证书管理,如果集群中已安装 CertManager,可跳过这一步骤, 否则可参考官方文档进行安装,或运行以下命令进行快速安装。
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager.yaml

集成 KubeDiag

1、使用平台管理员账号登录 KubeCube;

2、点击页面右上角【切换到控制台】,点击任意空间,进入到控制台页面;

  1. 在左侧菜单栏点击【自定义资源CRD】,进入到集群级别 CRD 列表,可以点击右上方输入 “hotplug” 进行搜索,找到 “hotplugs.hotplug.kubecube.io” CRD,点击【v1】版本进入 CRD 详情页;

  2. 选择 common 实例,点击【设置YAML】,将 KubeDiag 的状态改为启用, 即可为所有集群开启kubediag系统,如下所示:

    - name: kubediag
      namespace: kubediag
      pkgName: kubediag-helm-0.1.1.tgz
-     status: disabled
+     status: enabled

使用 KubeDiag

如果希望非集群管理员角色的平台用户也能使用 KubeDiag 的资源进行集群诊断操作,需要将 KubeDiag 提供的相关 CRD 操作权限接入 KubeCube 的内置角色中,具体操作如下(在执行以下操作前,需要获取 Kubernetes 集群cluster-admin角色的 KubeConfig ):

# 为平台所有角色赋予view权限
kubectl label clusterrole kubediag-view rbac.authorization.k8s.io/aggregate-to-reviewer=true
kubectl label clusterrole kubediag-view rbac.authorization.k8s.io/aggregate-to-project-admin=true
kubectl label clusterrole kubediag-view rbac.authorization.k8s.io/aggregate-to-tenant-admin=true
kubectl label clusterrole kubediag-view rbac.authorization.k8s.io/aggregate-to-platform-admin=true

# 为项目管理员以上级别的角色赋予edit权限
kubectl label clusterrole kubediag-edit rbac.authorization.k8s.io/aggregate-to-project-admin=true
kubectl label clusterrole kubediag-edit rbac.authorization.k8s.io/aggregate-to-tenant-admin=true
kubectl label clusterrole kubediag-edit rbac.authorization.k8s.io/aggregate-to-platform-admin=true

完成以上操作后,即可使用平台用户登录 KubeCube 平台,在【自定义资源CRD】页面内,完成对 KubeDiag 相关 CRD 的管理,具体配置方式参考 KubeDiag API文档

create-diag