1 - Prometheus
KubeCube 在部署时会自动安装 Prometheus 等监控组件,以实现监控功能。本文档介绍了如何在 KubeCube 中接入用户已有的 Prometheus。
准备工作
在集群部署好 Prometheus,Prometheus 可以正常监控到集群资源的数据;
在集群中部署好 KubeCube;
说明:部署好 KubeCube 后,由于集群内已有 Prometheus operator,多个 operator 会导致集群内 Prometheus 相关功能不可用,需要卸载 KubeCube 监控组件或删除本地 operator。
以平台管理员角色登录 KubeCube 管控集群。
步骤
1、添加 Label
由于 KubeCube 需要实现多集群监控,因此在 KubeCube 查询监控数据时,都会在 query 表达式中添加 cluster={clusterName}
来进行集群过滤。用户需要在 Prometheus 的 exporter 中添加这一 label,前端查询监控数据时才能查询到结果。
2、卸载 KubeCube 监控组件
方式一 页面操作:
点击页面右上角【切换到控制台】,点击任意空间,进入到控制台页面;
在左侧菜单栏点击【自定义资源CRD】,进入到集群级别 CRD 列表,可以点击右上方输入 “hotplug” 进行搜索,找到 “hotplugs.hotplug.kubecube.io” CRD,点击【v1】版本进入 CRD 详情页;
选择 common 实例,点击【设置YAML】,找到 spec.component. name=kubecube-monitoring,将 “status” 改成 “disabled”,即卸载 KubeCube 自带监控组件。
方式二 命令行操作:
kubectl edit hotplug common
- 找到 spec.component. name=kubecube-monitoring,将 “status” 改成 “disabled”。
详细配置说明见 热插拔 。
3、部署 ServiceMonitor
查看集群资源
查看控制台内监控数据,需要部署两个 ServiceMonitor:kubelet 和 kube-state-metrics 的 ServiceMonitor,样例如下:
部署 kubecube-monitoring-kubelet
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kubecube-monitoring-kubelet namespace: kubecube-monitoring spec: endpoints: - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token honorLabels: true port: https-metrics relabelings: - sourceLabels: - __metrics_path__ targetLabel: metrics_path scheme: https tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token honorLabels: true path: /metrics/cadvisor port: https-metrics relabelings: - sourceLabels: - __metrics_path__ targetLabel: metrics_path scheme: https tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token honorLabels: true path: /metrics/probes port: https-metrics relabelings: - sourceLabels: - __metrics_path__ targetLabel: metrics_path scheme: https tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: true jobLabel: k8s-app namespaceSelector: matchNames: - kube-system selector: matchLabels: k8s-app: kubelet
部署 kubecube-monitoring-kube-state-metrics
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kubecube-monitoring-kube-state-metrics namespace: kubecube-monitoring spec: endpoints: - honorLabels: true port: http selector: matchLabels: app.kubernetes.io/instance: kubecube-monitoring app.kubernetes.io/name: kube-state-metrics
查看组件监控
当前 KubeCube 平台支持对组件的监控视图可视化查询,详细说明见 平台组件监控 。接入外部监控后,用户可按需在集群内部署对应组件的 ServiceMonitor。
各个 ServiceMonitor 的 yaml 可参考 https://github.com/kubecube-io/charts/tree/main/kubecube-monitoring/templates/exporters。
4、部署 Dashboard
查看集群资源(控制台内监控数据),需要部署:
- cube-resource-cluster.yaml
- cube-resource-namespace.yaml
- cube-resource-node.yaml
- cube-resource-persistentvolume.yaml
- cube-resource-pod.yaml
- cube-resource-workload.yaml
- default-rolebinding.yaml
查看组件监控,可以部署对应的 Dashboard:
- component-control-plane-pods.yaml
- component-coredns.yaml
- component-etcd.yaml
- component-kube-apiserver.yaml
- component-kube-controller-manager.yaml
- component-kube-proxy.yaml
- component-kube-scheduler.yaml
- component-kubelet.yaml
- component-prometheus.yaml
- component-thanos.yaml
5、修改 Nginx 配置
使用命令行:
kubectl edit configmap nginx-config -n kubecube-system
找到原有的地址配置,修改为自有 Prometheus 地址
upstream monitoring { server kubecube-thanos-query.kubecube-monitoring:9090; }
即 将
kubecube-thanos-query.kubecube-monitoring:9090
替换为外部地址。重启 pod:
kubectl delete pod frontend-xxxxxx-xxxxx -n kubecube-system
2 - ElasticSearch
KubeCube 提供了日志服务和操作审计服务,默认关闭。用户在开启后,日志服务和操作审计服务均会将日志发送到 ElasticSearch 进行存储,由 ElasticSearch 对日志进行管理。用户可以在 热插拔 中修改配置,安装内部 ElasticSearch,也可以配置外部的 ElasticSearch 地址,对接已有的 ElasticSearch。下面分别介绍如何在这两个功能中接入外部 ElasticSearch。
日志
方式一 页面操作:
点击页面右上角【切换到控制台】,点击任意空间,进入到控制台页面;
在左侧菜单栏点击【自定义资源CRD】,进入到集群级别 CRD 列表,可以点击右上方输入 “hotplug” 进行搜索,找到 “hotplugs.hotplug.kubecube.io” CRD,点击【v1】版本进入 CRD 详情页;
选择 common 实例,点击【设置YAML】,找到 spec.component. name=logseer,添加环境变量,如:
- name: logseer
namespace: logseer
pkgName: logseer-v1.0.0.tgz
status: disabled
env: |
address: elasticsearch-master.elasticsearch.svc
方式二 命令行操作:
kubectl edit hotplug pivot-cluster
- 找到 spec.component. name=logseer,添加环境变量,同上。
详细配置说明见 热插拔 。
操作审计
kubectl edit deploy audit -n kubecube-system
添加环境变量: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。
其他详细说明见:操作审计 。
3 - 第三方认证系统
外部认证系统接入
KubeCube 中包含一套自有的认证系统,同时也支持多种类型的外部认证系统的接入。本文档介绍了如何在 KubeCube 中接入 GitHub、Ldap 以及通用认证接口三种认证系统的操作步骤。
GitHub 认证
1. 登记应用信息
在 GitHub 注册一个 Oauth 应用,Homepage URL 和 Authorization callback URL 均填写 http://{kubecube_host}/#/login
,创建成功后 Github 生成一个 ClientId,再手动创建一个 Client secret。
2. 修改配置文件
在管控集群修改 configmap:kubectl edit cm kubecube-auth-config -n kubecube-system
,修改内容如下:
apiVersion: v1
kind: ConfigMap
data:
github: |
enabled: true
clientId: 80b802dc59eeb847ed00
clientSecret: 83dc8eb788f706de3449d45e61f45ebdca433de2
host: http://10.219.196.107:30080
参数说明如下:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
enabled | 是否开启 Github 登录 | boolean | false |
clientId | GitHub 授权的 ClientId | string | |
clientSecret | GitHub 授权的 Client secret | string | |
host | KubeCube 服务器地址 | string |
3. 访问前端登录页面
访问 KubeCube 前端登录页面,选择使用GitHub账号登录;
授权应用,点击 Authorize xxxapp,即可登录到 KubeCube。
KubeCube 会使用 Github 返回的信息自动在集群中创建该用户,并标记该用户的 “LOGINTYPE” 为 “github”。
Ldap 认证
KubeCube 支持接入用户已部署的 LDAP 来进行认证。具体步骤如下。
1. 添加启动参数
为 KubeCube Deployment 添加启动参数,参数说明如下:
参数 | 说明 | 类型 | 是否必填 | 默认值 | 示例 |
---|---|---|---|---|---|
ldap-is-enable | 是否开启 Ldap 登录 | boolean | 是 | false | true |
ldap-server | Ldap 服务器地址 | string | 是 | 10.219.196.107 | |
ldap-port | Ldap 服务器端口号 | string | 否 | 389 | 389 |
ldap-base | Ldap 查询分区 | string | 是 | dc=example,dc=com | |
ldap-admin-user-account | Ldap 管理员账号 | string | 是 | cn=admin,dc=example,dc=com | |
ldap-admin-password | Ldap 管理员密码 | string | 是 | admin123456 | |
ldap-object-class | Ldap 对象类 | string | 否 | person | person |
ldap-login-name-config | 用户名所在配置 | string | 否 | uid | cn |
ldap-object-category | Ldap objectcategory | string | 否 | dc=example,dc=com |
示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubecube
namespace: kubecube-system
spec:
template:
spec:
containers:
- args:
- -ldap-is-enable=true
- -ldap-object-class=person
- -ldap-server=10.219.196.107
- -ldap-base=dc=example,dc=com
- -ldap-admin-user-account=cn=admin,dc=example,dc=com
- -ldap-admin-password=admin123456
- -ldap-login-name-config=cn
2. 请求登录
接口路径
/api/v1/cube/login
接口方法
POST
请求参数
参数名称 | 参数说明 | 参数来源 | 参数类型 | 是否必须 | 备注 |
---|---|---|---|---|---|
name | 用户名 | body | string | 是 | |
password | 密码 | body | string | 是 | |
loginType | 登录方式 | body | string | 是 | ldap |
响应
如果 Ldap 返回认证成功,KubeCube 在集群中创建该用户,并标记该用户的 “LOGINTYPE” 为 “ldap”。
响应码 | 状态 | 描述 | 响应体 |
---|---|---|---|
200 | OK | 请求成功,返回在集群中创建的User信息 | User |
数据模型
User
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
---|---|---|---|---|
kind | User | string | 是 | |
apiVersion | user.kubecube.io/v1 | string | 是 | |
metadata | 元数据 | Metadata | 是 | |
spec | UserSpec | 是 | ||
status | UserStatus | 是 |
Metadata
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
---|---|---|---|---|
name | 该用户在集群中的名称 | string | 是 | |
labels | 标签 | map[string]string | 否 | Ldap返回的真实用户名保存在标签中 |
creationTimestamp | 创建此对象时的时间戳 | Time | 否 | |
generation | 所需状态的特定生成的序列号 | integer | 否 | |
uid | 资源对象在集群中的唯一标识 | string | 否 | |
selfLink | 资源关联的url | string | 否 |
UserSpec
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
---|---|---|---|---|
loginType | 登录方式 | string | 是 | ldap |
UserStatus
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
---|---|---|---|---|
lastLoginTime | 上次登录时间 | Time | 否 | |
lastLoginIP | 上次登录IP | string | 否 |
请求示例
curl https://0.0.0.0:7443/api/v1/cube/login -X POST -d '{"name": "test123","password":"123456","loginType":"ldap"}' --header "Content-Type: application/json"
返回示例
{
"kind": "User",
"apiVersion": "user.kubecube.io/v1",
"metadata": {
"labels": {
"name": "test123"
},
"spec": {
"loginType": "ldap",
},
"status": {
"lastLoginTime": "2022-07-06T06:25:37Z",
"lastLoginIP": "10.219.196.107"
}
}
通用认证
通用认证指的是通过请求第三方接口的方式进行认证。KubeCube 提供了一种通用的接入方式,但对接口的返回有一定要求。具体步骤如下。
1. 接口准备
第三方认证接口要求:
- 请求 url 为配置的固定值,KubeCube 会将请求携带的 header 进行转发,因此第三方接口对 header 进行认证;
- 接口返回格式为
map[string]interface{}
,其中包含一组值为 key=“name”,value=“{用户名}”。
2. 添加启动参数
为 KubeCube Deployment 添加启动参数,参数说明如下:
参数 | 说明 | 类型 | 是否必填 | 默认值 | 示例 |
---|---|---|---|---|---|
generic-auth-is-enable | 是否开启通用认证方式 | boolean | 是 | false | true |
generic-auth-url | 第三方认证url | string | 是 | https://kubecube123.com/api/v1/demo/auth | |
generic-auth-method | 第三方认证请求方式 | string | 是 | GET | |
generic-auth-scheme | 请求协议 | string | 否 | http | https |
generic-auth-insecure-skip-verify | 是否跳过安全校验 | string | 否 | true | |
generic-auth-tls-cert | tls证书 | string | 否 | LS0NGc9PQotLS0tLUVOFURS0tLS0t | |
generic-auth-tls-key | tls密钥 | string | 否 | LS0NsfGcQotfdLS0tLUVOFURtLS0ta1 |
示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubecube
namespace: kubecube-system
spec:
template:
spec:
containers:
- args:
- -generic-auth-is-enable=true
- -generic-auth-url=https://kubecube123.com/api/v1/demo/auth
- -generic-auth-method=GET
- -generic-auth-scheme=https
- -generic-auth-insecure-skip-verify=true
开启通用认证方式后,用户可跳过登录直接访问 KubeCube。KubeCube 会将请求携带的 header 转发给配置的第三方认证平台,由第三方认证平台返回的结果决定请求是否通过认证。