Kubesphere 保姆级分析

时间:2024-03-12 10:54:10

应用场景

KubeSphere 适用于多种场景,为企业提供容器化的环境,借助完善的管理和运维功能,让企业在数字化转型过程中从容应对各种挑战和各类业务场景,如多云多集群管理、敏捷软件开发、自动化运维、微服务治理、流量管理以及 DevOps 持续集成与交付等。

架构原理

一. 简介

KubeSphere 将 前端 与 后端 分开,实现了面向云原生的设计,后端的各个功能组件可通过 REST API 对接外部系统。 KubeSphere 无底层的基础设施依赖,可以运行在任何 Kubernetes、私有云、公有云、VM 或物理环境(BM)之上。 此外,它可以部署在任何 Kubernetes 发行版上。

二. 组网图及架构说明

组织架构

如下图所示,KubeSphere 整体组织结构分为前端、后端,以及基础设施三层。(注:以下提及的部分功能并非核心功能,需按需安装可插拔组件。)

  1. 前端
  1.   前端即页面,为用户提供直接的 web 交互入口。主要包含以下部分:
  2. 普通用户页面(normal user): 平台上部署维护自己项目服务的普通用户界面,主要包含微服务,Devops,应用和负载等。
  3. 管理员页面(admin/manager): 平台上维护整个平台的管理员页面,主要包含项目管理,账户/角色管理,节点管理,存储管理,工作空间管理几部分
  4. 平台监控页面: 为用户提供集群的整体情况概览,主要有平台监控,日志,事件,调用监控分析等部分。
  1. 后台
  1.   后台主要是在 kubernetes 的基础设施上构建用户需要的业务的具体支持,主要包含以下几部分:
  2. 系统管理(system): 账户管理,终端Console管理,API Server交互中心,api 网关,业务逻辑等核心功能。
  3. 监控管理(monitoring):日志监控等外围附带的监控系统服务。
  4. 自动化运维(Devops): 自动化流水线和服务网格等支持。
  5.   以下是和基础设施 kubernetes 交互,完成后台基础设置的部分
  6. 权限安全系统(Security): 以例如RBAC模式的登录鉴权和权限控制。
  7. 存储管理(Storage): 存储虚拟化,在k8s的csi下连接外部的nfs,ceph等存储系统完成存储支持。
  8. 网络支持(SDN): 网络虚拟化,在k8s的cni下使用calico或flannel等网络插件完成网络虚拟化。
  1. 基础设施
  1.   底层设施主要是运行KubeSphere的底层云平台,使用虚拟机和kubernetes等搭建的最底层的平台支持。
模块组网

KubeSphere 的基本模块组网如下图所示:

KubeSphere 在主要由以下几个组件构成:

  1. ks-console:前端服务组件,提供 KubeSphere 的控制台服务,为用户提供便捷的可视化操作界面。
  2. ks-apiserver:后端服务组件,是整个集群管理的 API 接口和集群内部各个模块之间通信的枢纽,同时负责集群安全控制。
  3. ks-controller-manager:资源状态维护组件,实现业务逻辑的,例如创建企业空间时,为其创建对应的权限;或创建服务策略时,生成对应的Istio配置等。
  4. plugin:可插拔组件,KubeSphere 解耦了一些核心功能组件。这些组件设计成了可插拔式,可以在安装之前或之后启用它们。如果不启用它们,KubeSphere 可以最小化进行安装部署。不同的可插拔组件部署在不同的命名空间中。

三. 架构原理分析

ks-console

ks-console是用户和KubeSphere交互的入口,主要为用户提供页面的交互方式,以及少量API接口。

功能的角度来分析,如图 一-3所示,ks-console 的功能上,第一层级主要包含会话管理,其他API,页面功能三部分。

图 一-3 ks-console的功能层级示意图

  1. 会话管理主要负责在登录授权后,维持用户token等用户权限的cache管理。
  2. 其他API主要是提供了部分直接和镜像仓库交互或者页面下载指令的部分API。
  3. 页面主要提供用户的交互入口,提供可视化的操作界面。
  1.   将页面功能细化,又可以分为管理页面和终端页面,终端页面是提供在页面上使用命令行直接与kubernetes 的交互界面,管理页面则是集成对整个 KubeSphere 所提供功能的交互界面。管理业面又可分为集群管理,权限管理和系统设置三部分。
  2. 集群管理:管理集群的整体资源
  3. 权限管理:管理用户或用户组的权限
  4. 系统设置:对系统邮箱,webhook 等全局配置进行管理

架构上来看,如图 一-4所示,ks-console 包含图中上面四层,包括路由层、会话层、路由分发层、页面逻辑层

图 一-4 ks-console的架构层级示意图

  • 路由层是整个前端系统的入口,主要使用 Koa(基于Node.js平台的web开发框架)提供了最外层的服务框架,其中嵌入了配置管理config和部分交互数据压缩等中间件工具utils。
  • 会话层主要提供了用户的登录,以及登录后的 session 数据维持管理;提供页面的访问入口。此外还有镜像仓库等API接口。
  • 路由分发层则为页面上的业务请求做了功能分发,根据路由的路径不同,去查询对应打包文件中的页面入口,从而真正让用户进入终端页面(terminal)和管理页面(KubeSphere pages)。
  • 页面逻辑层中才是管理页面的真正实现,使用 React(用于构建用户界面的 JavaScript 库)框架,完成了页面功能的支持。
  • 管理页面或者终端页面最终都是在后台API层通过 ks-apiserver 与后台交互。

ks-apiserver

ks-apiserver 是 KubeSphere 核心的后端组件,负责后端数据的交互,请求的代理分发、认证与鉴权。ks-apiserver 聚合整个系统的业务功能,对外提供统一的API入口,下图是 ks-apiserver 的架构图:

图 一-5 ks-apiserver的架构示意图

从请求的链路来分析,所有的请求都经过一个统一的入口,其中以 /kapi 和 /kapis 开头的是 KubeSphere 拓展聚合的API,/api 和 /apis 开头的都属于 Kubernetes 原生的API,此外还有KubeSphere 提供的认证相关API。所有的请求在经过 Access control 的认证Authe和鉴权Autho之后,再完成审计Auduting(可选)后由请求分发 Request Dispatch 功能将请求发送到不同的后端。针对原生 Kubernetes 资源的请求,会被转发到集群的 kube-apiserver 来操作和管理原生资源。KubeSphere 拓展聚合的API也是通过动态注册的方式拓展对 K8s API 的扩展,通过CRD 对资源进行抽象,再通过controller监听资源变化维护资源状态。

下图展示的是 ks-apiserver 聚合的功能对象主要类型:

图 一-6 ks-apiserver聚合的功能对象

  1. kubernetes 原生的对象,由 ks-apiserver 连接 k8s-apiserver,直接获取更改 etcd 中 kubernetes 的原始数据(origin data)即可,操作的对象即 kubernetes 原生的 configmap. deployment 等对象。
  2. ks-controller-manager 封装的对象,ks-controller-manager 的封装功能逻辑以 crd 对象的方式表现在 etcd中,ks-apiserver 通过连接 k8s-apiserver 操作 etcd 中的 crd 数据(crd data)即可,操作ks-controller-manager 扩展的逻辑功能。
  3. 第三方的 operator 对象,如 prometheus-operator 等第三方完成的模块以 operator 的方式运行在系统中,其功能对应的对象也以 crd 的形式存放在 etcd 中,ks-apiserver 也是通过和 k8s-apiserver 交互操作对应的 crd 完成。
  4. 普通的服务对象,如 jenkins,sonarqube 等以普通服务的方式运行在系统中,ks-apiserver 直接通过网络调用和此类对象交互
ks-controller-manager

ks-controller-manager 作为管理控制器,通过监听etcd中资源的变化,同步配置对应资源的状态,以达到最终状态的一致性。功能与 controller-manager 的功能类似,不过主要为维护 KubeSphere 新增的资源。ks-controller-manager 整体结构如下图所示:

图 一-7 ks-controller-manager整体结构

主要由两部分组成,InformerFactory和controller。

  1. InformerFactory
  1.   InformerFactory是watch etcd中指定资源并获取同步信息的一个适配器:
  2. 同步watch的资源变化并触发用户注册的处理回调
  3. 提供更新etcd中资源的接口。

ks-controller-manager就是是通过每个 InformerFactory 完成资源信息的同步,这里有多个Shared InformerFactory,如 kubernetes, KubeSphere, istio 等,主要负责对应相关资源类的信息同步。

虽然有多个 InformerFactory 句柄,但 KubeSphere,istio 等都是从 kubernetes 句柄衍生出来的,因此各个 Shared InformerFactory 最终都是通过kubernetes操作etcd资源。

  1. controller

controller 是在 InformerFactory 同步到资源变化后,根据资源变化具体操作对应资源的控制逻辑。例如,当 istio InformerFactory 获取到网络治理相关配置发生变化时,virtual service 就会操作istio 创建或更新网络策略。controller 中的 application, cluster, globalrole, helm 等分别提供对应资源同步时的具体操作。

plugin

从2.1.0版本开始,KubeSphere解耦了一些核心功能组件。这些组件设计成了可插拔式,可以在安装之前或之后启用它们。不同的可插拔组件部署在不同的命名空间中。可以根据需求启用任意组件。下面的表格列出了KubeSphere的所有可插拔组件:

表格 还在加载中,请等待加载完成后再尝试复制

使用指南

一. 使用软硬环境

硬件要求

通用x86服务器

操作系统

支持以下操作系统及版本

类型

版本

Ubuntu

16.04,18.04,20.04

Debian

Buster,Stretch

CentOS

7.x

Red Hat Enterprise Linux

7

SUSE Linux Enterprise Server 15 /openSUSE Leap

15.2

目前使用的是 Ubuntu 20.04.3 LTS server

浏览器

建议使用 chrome 或者 Firefox浏览器

软件包

安装 KubeSphere 需要存储类支持以动态创建 pvc , 以下是安装 NFS 所需deb包:

  keyutils_1.5.9-9.2ubuntu2_amd64.deb

  libtirpc1_0.2.5-1.2ubuntu0.1_amd64.deb

  rpcbind_0.2.3-0.6ubuntu0.18.04.4_amd64.deb

  libnfsidmap2_0.25-5.1_amd64.deb

  nfs-common_1%3a1.3.4-2.1ubuntu5.5_amd64.deb

该文档中介绍的是在 Kubernetes 集群上以容器的方式部署 KubeSphere,需要的镜像列表如下所示:

##k8s-images
kubesphere/kube-apiserver:v1.23.7
kubesphere/kube-controller-manager:v1.23.7
kubesphere/kube-proxy:v1.23.7
kubesphere/kube-scheduler:v1.23.7
kubesphere/kube-apiserver:v1.24.1
kubesphere/kube-controller-manager:v1.24.1
kubesphere/kube-proxy:v1.24.1
kubesphere/kube-scheduler:v1.24.1
kubesphere/kube-apiserver:v1.22.10
kubesphere/kube-controller-manager:v1.22.10
kubesphere/kube-proxy:v1.22.10
kubesphere/kube-scheduler:v1.22.10
kubesphere/kube-apiserver:v1.21.13
kubesphere/kube-controller-manager:v1.21.13
kubesphere/kube-proxy:v1.21.13
kubesphere/kube-scheduler:v1.21.13
kubesphere/pause:3.7
kubesphere/pause:3.6
kubesphere/pause:3.5
kubesphere/pause:3.4.1
coredns/coredns:1.8.0
coredns/coredns:1.8.6
calico/cni:v3.20.0
calico/kube-controllers:v3.20.0
calico/node:v3.20.0
calico/pod2daemon-flexvol:v3.20.0
calico/typha:v3.20.0
kubesphere/flannel:v0.12.0
openebs/provisioner-localpv:2.10.1
openebs/linux-utils:2.10.0
library/haproxy:2.3
kubesphere/nfs-subdir-external-provisioner:v4.0.2
kubesphere/k8s-dns-node-cache:1.15.12
##kubesphere-images  
kubesphere/ks-installer:v3.3.0
kubesphere/ks-apiserver:v3.3.0
kubesphere/ks-console:v3.3.0
kubesphere/ks-controller-manager:v3.3.0
kubesphere/kubectl:v1.22.0
kubesphere/kubectl:v1.21.0
kubesphere/kubectl:v1.20.0
kubesphere/kubefed:v0.8.1
kubesphere/tower:v0.2.0
minio/minio:RELEASE.2019-08-07T01-59-21Z
minio/mc:RELEASE.2019-08-07T23-14-43Z
csiplugin/snapshot-controller:v4.0.0
kubesphere/nginx-ingress-controller:v1.1.0
mirrorgooglecontainers/defaultbackend-amd64:1.4
kubesphere/metrics-server:v0.4.2
redis:5.0.14-alpine
haproxy:2.0.25-alpine
alpine:3.14
osixia/openldap:1.3.0
kubesphere/netshoot:v1.0
##kubeedge-images
kubeedge/cloudcore:v1.9.2
kubeedge/iptables-manager:v1.9.2
kubesphere/edgeservice:v0.2.0
##gatekeeper-images
openpolicyagent/gatekeeper:v3.5.2
##openpitrix-images
kubesphere/openpitrix-jobs:v3.2.1
##kubesphere-devops-images
kubesphere/devops-apiserver:v3.3.0
kubesphere/devops-controller:v3.3.0
kubesphere/devops-tools:v3.3.0
kubesphere/ks-jenkins:v3.3.0-2.319.1
jenkins/inbound-agent:4.10-2
kubesphere/builder-base:v3.2.2
kubesphere/builder-nodejs:v3.2.0
kubesphere/builder-maven:v3.2.0
kubesphere/builder-maven:v3.2.1-jdk11
kubesphere/builder-python:v3.2.0
kubesphere/builder-go:v3.2.0
kubesphere/builder-go:v3.2.2-1.16
kubesphere/builder-go:v3.2.2-1.17
kubesphere/builder-go:v3.2.2-1.18
kubesphere/builder-base:v3.2.2-podman
kubesphere/builder-nodejs:v3.2.0-podman
kubesphere/builder-maven:v3.2.0-podman
kubesphere/builder-maven:v3.2.1-jdk11-podman
kubesphere/builder-python:v3.2.0-podman
kubesphere/builder-go:v3.2.0-podman
kubesphere/builder-go:v3.2.2-1.16-podman
kubesphere/builder-go:v3.2.2-1.17-podman
kubesphere/builder-go:v3.2.2-1.18-podman
kubesphere/s2ioperator:v3.2.1
kubesphere/s2irun:v3.2.0
kubesphere/s2i-binary:v3.2.0
kubesphere/tomcat85-java11-centos7:v3.2.0
kubesphere/tomcat85-java11-runtime:v3.2.0
kubesphere/tomcat85-java8-centos7:v3.2.0
kubesphere/tomcat85-java8-runtime:v3.2.0
kubesphere/java-11-centos7:v3.2.0
kubesphere/java-8-centos7:v3.2.0
kubesphere/java-8-runtime:v3.2.0
kubesphere/java-11-runtime:v3.2.0
kubesphere/nodejs-8-centos7:v3.2.0
kubesphere/nodejs-6-centos7:v3.2.0
kubesphere/nodejs-4-centos7:v3.2.0
kubesphere/python-36-centos7:v3.2.0
kubesphere/python-35-centos7:v3.2.0
kubesphere/python-34-centos7:v3.2.0
kubesphere/python-27-centos7:v3.2.0
quay.io/argoproj/argocd:v2.3.3
quay.io/argoproj/argocd-applicationset:v0.4.1
ghcr.io/dexidp/dex:v2.30.2
redis:6.2.6-alpine
##kubesphere-monitoring-images
jimmidyson/configmap-reload:v0.5.0
prom/prometheus:v2.34.0
kubesphere/prometheus-config-reloader:v0.55.1
kubesphere/prometheus-operator:v0.55.1
kubesphere/kube-rbac-proxy:v0.11.0
kubesphere/kube-state-metrics:v2.3.0
prom/node-exporter:v1.3.1
prom/alertmanager:v0.23.0
thanosio/thanos:v0.25.2
grafana/grafana:8.3.3
kubesphere/kube-rbac-proxy:v0.8.0
kubesphere/notification-manager-operator:v1.4.0
kubesphere/notification-manager:v1.4.0
kubesphere/notification-tenant-sidecar:v3.2.0
##kubesphere-logging-images
kubesphere/elasticsearch-curator:v5.7.6
kubesphere/elasticsearch-oss:6.8.22
kubesphere/fluentbit-operator:v0.13.0
docker:19.03
kubesphere/fluent-bit:v1.8.11
kubesphere/log-sidecar-injector:1.1
elastic/filebeat:6.7.0
kubesphere/kube-events-operator:v0.4.0
kubesphere/kube-events-exporter:v0.4.0
kubesphere/kube-events-ruler:v0.4.0
kubesphere/kube-auditing-operator:v0.2.0
kubesphere/kube-auditing-webhook:v0.2.0
##istio-images
istio/pilot:1.11.1
istio/proxyv2:1.11.1
jaegertracing/jaeger-operator:1.27
jaegertracing/jaeger-agent:1.27
jaegertracing/jaeger-collector:1.27
jaegertracing/jaeger-query:1.27
jaegertracing/jaeger-es-index-cleaner:1.27
kubesphere/kiali-operator:v1.38.1
kubesphere/kiali:v1.38
##example-images
busybox:1.31.1
nginx:1.14-alpine
joosthofman/wget:1.0
nginxdemos/hello:plain-text
wordpress:4.8-apache
mirrorgooglecontainers/hpa-example:latest
java:openjdk-8-jre-alpine
fluent/fluentd:v1.4.2-2.0
perl:latest
kubesphere/examples-bookinfo-productpage-v1:1.16.2
kubesphere/examples-bookinfo-reviews-v1:1.16.2
kubesphere/examples-bookinfo-reviews-v2:1.16.2
kubesphere/examples-bookinfo-details-v1:1.16.2
kubesphere/examples-bookinfo-ratings-v1:1.16.3
##weave-scope-images
weaveworks/scope:1.13.0

其中的主要镜像分类介绍如下:

  • k8s-images:Kubernetes 组件相关镜像(可选,如果自己部署k8s集群无需下载)
  • kubesphere-images:Kubesphere 组件相关镜像(必选)
  • kubeedge-images:Kubesphere 上边支持 KubeEdge 可插拔组件镜像(可选,可按需下载)
  • gatekeeper-images:基于 OPA(Open Policy Agent) 的一个 Kubernetes 策略解决方案(可选)
  • openpitrix-images:Kubesphere 上边应用商店可插拔组件镜像(可选,可按需下载)
  • kubesphere-devops-images:Kubesphere 上DevOps 系统功能可插拔组件相关的镜像(可选,可按需下载)
  • kubesphere-monitoring-images:KubeSphere 上监控组件(开启监控功能,必选)
  • kubesphere-logging-images:KubeSphere 上日志系统组件(开启日志功能,必选)
  • istio-images:KubeSphere 服务网格,提供细粒度的流量治理、可观测性、流量追踪以及可视化流量拓扑图(可选)
  • example-images:应用商店示例应用(可选)
  • weave-scope-images:查看应用和容器的服务间通信拓扑图(可选)

二. 安装部署

安装 NFS

安装NFS的原因是 KubeSphere 安装过程需要依赖于集群中默认的 storageClass,这里选择NFS作为为集群提供默认 storageClass。

  1. 安装NFS相关deb包
dpkg -i *.deb
  1. 设置 nfs 服务
mkdir -p /opt/nfs
vim /etc/export # /opt/nfs *(rw,no_root_squash)
service nfs-kernel-server restart
  1. 创建 rbac.yaml
  1.   根据当前的 namespace 来配置 rbac,为nfs-provisioner 提供 rbac 权限内容参考以下文件:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  - 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
  # replace with namespace where provisioner is deployed
  namespace: default
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
  1. 创建deployment.yaml文件
  1.   nfs-provisioner的部署文件,其中环境变量env中的NFS_SERVER和NFS_PATH的value值要根据前面步骤2设置nfs服务中保持一致,参考文件:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: x.x.x.x
            - name: NFS_PATH
              value: /home/kubesphere/nfsdata
      volumes:
        - name: nfs-client-root
          nfs:
            server: x.x.x.x
            path: /home/kubesphere/nfsdata
  1. 创建class.yaml文件
  1.   该文件是为了设置集群中的默认 default storageClass,参考文件如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"  # 标记为默认 sc
  name: nfs-client-kubesphere
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}" # waits for nfs.io/storage-path annotation, if not specified will accept as empty string.
  onDelete: delete
安装 KubeSphere
  1. 设置安装配置文件 cluster-configuration.yaml
  1.   该文件是kubeSphere安装的配置文件,其中包括私有镜像仓库地址设置,可插拔组件的启用开关等,例如按下面设置私有仓库地址
---
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
metadata:
  name: ks-installer
  namespace: kubesphere-system
  labels:
    version: v3.3.0
spec:
  persistence:
    storageClass: ""        # If there is no default StorageClass in your cluster, you need to specify an existing StorageClass here.
  authentication:
    jwtSecret: ""           # Keep the jwtSecret consistent with the Host Cluster. Retrieve the jwtSecret by executing "kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret" on the Host Cluster.
  local_registry: "x.x.x.x"        # Add your private registry address if it is needed.
  # dev_tag: ""               # Add your kubesphere image tag you want to install, by default it's same as ks-installer release version.
  etcd:
    monitoring: false       # Enable or disable etcd monitoring dashboard installation. You have to create a Secret for etcd before you enable it.
    endpointIps: localhost  # etcd cluster EndpointIps. It can be a bunch of IPs here.
    port: 2379              # etcd port.
    tlsEnable: true
  common:
    core:
      console:
        enableMultiLogin: true  # Enable or disable simultaneous logins. It allows different users to log in with the same account at the same time.
        port: 30880
        type: NodePort
    # apiserver:            # Enlarge the apiserver and controller manager's resource requests and limits for the large cluster
    #  resources: {}
    # controllerManager:
    #  resources: {}
    redis:
      enabled: false
      enableHA: false
      volumeSize: 2Gi # Redis PVC size.
    openldap:
      enabled: false
      volumeSize: 2Gi   # openldap PVC size.
    minio:
      volumeSize: 20Gi # Minio PVC size.
    monitoring:
      # type: external   # Whether to specify the external prometheus stack, and need to modify the endpoint at the next line.
      endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090 # Prometheus endpoint to get metrics data.
      GPUMonitoring:     # Enable or disable the GPU-related metrics. If you enable this switch but have no GPU resources, Kubesphere will set it to zero.
        enabled: false
    gpu:                 # Install GPUKinds. The default GPU kind is nvidia.com/gpu. Other GPU kinds can be added here according to your needs.
      kinds:
      - resourceName: "nvidia.com/gpu"
        resourceType: "GPU"
        default: true
    es:   # Storage backend for logging, events and auditing.
      # master:
      #   volumeSize: 4Gi  # The volume size of Elasticsearch master nodes.
      #   replicas: 1      # The total number of master nodes. Even numbers are not allowed.
      #   resources: {}
      # data:
      #   volumeSize: 20Gi  # The volume size of Elasticsearch data nodes.
      #   replicas: 1       # The total number of data nodes.
      #   resources: {}
      logMaxAge: 7             # Log retention time in built-in Elasticsearch. It is 7 days by default.
      elkPrefix: logstash      # The string making up index names. The index name will be formatted as ks-<elk_prefix>-log.
      basicAuth:
        enabled: false
        username: ""
        password: ""
      externalElasticsearchHost: ""
      externalElasticsearchPort: ""
  alerting:                # (CPU: 0.1 Core, Memory: 100 MiB) It enables users to customize alerting policies to send messages to receivers in time with different time intervals and alerting levels to choose from.
    enabled: false         # Enable or disable the KubeSphere Alerting System.
    # thanosruler:
    #   replicas: 1
    #   resources: {}
  auditing:                # Provide a security-relevant chronological set of records,recording the sequence of activities happening on the platform, initiated by different tenants.
    enabled: false         # Enable or disable the KubeSphere Auditing Log System.
    # operator:
    #   resources: {}
    # webhook:
    #   resources: {}
  devops:                  # (CPU: 0.47 Core, Memory: 8.6 G) Provide an out-of-the-box CI/CD system based on Jenkins, and automated workflow tools including Source-to-Image & Binary-to-Image.
    enabled: false             # Enable or disable the KubeSphere DevOps System.
    # resources: {}
    jenkinsMemoryLim: 2Gi      # Jenkins memory limit.
    jenkinsMemoryReq: 1500Mi   # Jenkins memory request.
    jenkinsVolumeSize: 8Gi     # Jenkins volume size.
    jenkinsJavaOpts_Xms: 1200m  # The following three fields are JVM parameters.
    jenkinsJavaOpts_Xmx: 1600m
    jenkinsJavaOpts_MaxRAM: 2g
  events:                  # Provide a graphical web console for Kubernetes Events exporting, filtering and alerting in multi-tenant Kubernetes clusters.
    enabled: false         # Enable or disable the KubeSphere Events System.
    # operator:
    #   resources: {}
    # exporter:
    #   resources: {}
    # ruler:
    #   enabled: true
    #   replicas: 2
    #   resources: {}
  logging:                 # (CPU: 57 m, Memory: 2.76 G) Flexible logging functions are provided for log query, collection and management in a unified console. Additional log collectors can be added, such as Elasticsearch, Kafka and Fluentd.
    enabled: false         # Enable or disable the KubeSphere Logging System.
    logsidecar:
      enabled: true
      replicas: 2
      # resources: {}
  metrics_server:                    # (CPU: 56 m, Memory: 44.35 MiB) It enables HPA (Horizontal Pod Autoscaler).
    enabled: false                   # Enable or disable metrics-server.
  monitoring:
    storageClass: ""                 # If there is an independent StorageClass you need for Prometheus, you can specify it here. The default StorageClass is used by default.
    node_exporter:
      port: 9100
      # resources: {}
    # kube_rbac_proxy:
    #   resources: {}
    # kube_state_metrics:
    #   resources: {}
    # prometheus:
    #   replicas: 1  # Prometheus replicas are responsible for monitoring different segments of data source and providing high availability.
    #   volumeSize: 20Gi  # Prometheus PVC size.
    #   resources: {}
    #   operator:
    #     resources: {}
    # alertmanager:
    #   replicas: 1          # AlertManager Replicas.
    #   resources: {}
    # notification_manager:
    #   resources: {}
    #   operator:
    #     resources: {}
    #   proxy:
    #     resources: {}
    gpu:                           # GPU monitoring-related plug-in installation.
      nvidia_dcgm_exporter:        # Ensure that gpu resources on your hosts can be used normally, otherwise this plug-in will not work properly.
        enabled: false             # Check whether the labels on the GPU hosts contain "nvidia.com/gpu.present=true" to ensure that the DCGM pod is scheduled to these nodes.
        # resources: {}
  multicluster:
    clusterRole: none  # host | member | none  # You can install a solo cluster, or specify it as the Host or Member Cluster.
  network:
    networkpolicy: # Network policies allow network isolation within the same cluster, which means firewalls can be set up between certain instances (Pods).
      # Make sure that the CNI network plugin used by the cluster supports NetworkPolicy. There are a number of CNI network plugins that support NetworkPolicy, including Calico, Cilium, Kube-router, Romana and Weave Net.
      enabled: false # Enable or disable network policies.
    ippool: # Use Pod IP Pools to manage the Pod network address space. Pods to be created can be assigned IP addresses from a Pod IP Pool.
      type: none # Specify "calico" for this field if Calico is used as your CNI plugin. "none" means that Pod IP Pools are disabled.
    topology: # Use Service Topology to view Service-to-Service communication based on Weave Scope.
      type: none # Specify "weave-scope" for this field to enable Service Topology. "none" means that Service Topology is disabled.
  openpitrix: # An App Store that is accessible to all platform tenants. You can use it to manage apps across their entire lifecycle.
    store:
      enabled: false # Enable or disable the KubeSphere App Store.
  servicemesh:         # (0.3 Core, 300 MiB) Provide fine-grained traffic management, observability and tracing, and visualized traffic topology.
    enabled: false     # Base component (pilot). Enable or disable KubeSphere Service Mesh (Istio-based).
    istio:  # Customizing the istio installation configuration, refer to https://istio.io/latest/docs/setup/additional-setup/customize-installation/
      components:
        ingressGateways:
        - name: istio-ingressgateway
          enabled: false
        cni:
          enabled: false
  edgeruntime:          # Add edge nodes to your cluster and deploy workloads on edge nodes.
    enabled: false
    kubeedge:        # kubeedge configurations
      enabled: false
      cloudCore:
        cloudHub:
          advertiseAddress: # At least a public IP address or an IP address which can be accessed by edge nodes must be provided.
            - ""            # Note that once KubeEdge is enabled, CloudCore will malfunction if the address is not provided.
        service:
          cloudhubNodePort: "30000"
          cloudhubQuicNodePort: "30001"
          cloudhubHttpsNodePort: "30002"
          cloudstreamNodePort: "30003"
          tunnelNodePort: "30004"
        # resources: {}
        # hostNetWork: false
      iptables-manager:
        enabled: true 
        mode: "external"
        # resources: {}
      # edgeService:
      #   resources: {}
  gatekeeper:        # Provide admission policy and rule management, A validating (mutating TBA) webhook that enforces CRD-based policies executed by Open Policy Agent.
    enabled: false   # Enable or disable Gatekeeper.
    # controller_manager:
    #   resources: {}
    # audit:
    #   resources: {}
  terminal:
    # image: 'alpine:3.15' # There must be an nsenter program in the image
    timeout: 600         # Container timeout, if set to 0, no timeout will be used. The unit is seconds
  1. 设置安装工具配置文件 kubesphere-installer.yaml
  1.   该文件是kubeSphere安装工具的配置文件,其中包括安装工具的权限设置,运行安装工具的Pod配置。
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: clusterconfigurations.installer.kubesphere.io
spec:
  group: installer.kubesphere.io
  versions:
    - name: v1alpha1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              x-kubernetes-preserve-unknown-fields: true
            status:
              type: object
              x-kubernetes-preserve-unknown-fields: true
  scope: Namespaced
  names:
    plural: clusterconfigurations
    singular: clusterconfiguration
    kind: ClusterConfiguration
    shortNames:
      - cc

---
apiVersion: v1
kind: Namespace
metadata:
  name: kubesphere-system

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ks-installer
  namespace: kubesphere-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ks-installer
rules:
- apiGroups:
  - ""
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apps
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - batch
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apiregistration.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - tenant.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - certificates.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - devops.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - monitoring.coreos.com
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - logging.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - jaegertracing.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - storage.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - policy
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - autoscaling
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - networking.istio.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - config.istio.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - iam.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - notification.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - auditing.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - events.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - core.kubefed.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - installer.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - storage.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - security.istio.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - monitoring.kiali.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - kiali.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - networking.k8s.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - edgeruntime.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - types.kubefed.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - monitoring.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'
- apiGroups:
  - application.kubesphere.io
  resources:
  - '*'
  verbs:
  - '*'


---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ks-installer
subjects:
- kind: ServiceAccount
  name: ks-installer
  namespace: kubesphere-system
roleRef:
  kind: ClusterRole
  name: ks-installer
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ks-installer
  namespace: kubesphere-system
  labels:
    app: ks-installer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ks-installer
  template:
    metadata:
      labels:
        app: ks-installer
    spec:
      serviceAccountName: ks-installer
      containers:
      - name: installer
        image: xxxx
        imagePullPolicy: "IfNotPresent"
        resources:
          limits:
            cpu: "1"
            memory: 1Gi
          requests:
            cpu: 20m
            memory: 100Mi
        volumeMounts:
        - mountPath: /etc/localtime
          name: host-time
          readOnly: true
      volumes:
      - hostPath:
          path: /etc/localtime
          type: ""
        name: host-time
  1. 开始安装
  1.   KubeSphere 官方提供了 ks-installer 镜像来执行安装过程,只需要部署前面的配置文件和 ks-installer 镜像即可完成安装。
kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml
部署成功验证

通过查看ks-installer的日志信息,可以看到安装的过程,最终安装成功后会输出登录提示信息。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-installer -o jsonpath='{.items[0].metadata.name}') -f

三. 使用步骤

修改用户密码

管理员账户用户名为admin,初始密码为P@88w0rd。修改方法如下:

  1. 首次登录
  1.   首次登录时,会自动提示用户修改密码,按照页面提示操作即可。
  1. 非首次登录
  1.   点击右上角用户名,在弹出框中选择用户设置

在用户设置弹出页面中,选择密码设置,按提示的密码要求修改密码即可。

创建企业空间、项目、用户和平台角色

KubeSphere 的多租户系统分三个层级,即集群、企业空间和项目。KubeSphere 中的项目等同于 Kubernetes 的命名空间。

用户一般需要创建一个新的企业空间进行操作,而不是使用系统企业空间(安装后自动生成的默认企业空间),系统企业空间中运行着系统资源,绝大部分仅供查看。出于安全考虑,强烈建议给不同的租户授予不同的权限在企业空间中进行协作。

可以在一个KubeSphere集群中创建多个企业空间,每个企业空间下可以创建多个项目。KubeSphere为每个级别默认设有多个内置角色。此外,还可以创建拥有自定义权限的角色。KubeSphere多层次结构适用于具有不同团队或组织以及每个团队中需要不同角色的企业用户。

步骤1:创建用户

一开始,系统默认只有一个用户admin,具有platform-admin角色。在本教程中,将创建一个示例用户user-manager,然后使用user-manager创建新用户。

  1. 以 admin 身份使用默认帐户和密码 (admin/P@88w0rd) 登录Web控制台。
  2. 点击左上角的平台管理,然后选择访问控制。在左侧导航栏中,选择平台角色。该处可以查看当前平台的内置角色。内置角色由KubeSphere创建,无法编辑或删除。
  3. 用户中,点击创建。在弹出的对话框中,提供所有必要信息(带有*标记),然后在平台角色一栏选择 users-manager。完成后,点击确定。新创建的用户将显示在用户页面。

当前除了默认用户admin之外,创建了一个具有user-manager平台角色的用户user-manager-zhangsan,其职责是负责管理用户。

  1. 切换用户使用 user-manager-zhangsan 重新登录(点击右上角用户名选择登出),创建如下四个新用户。

用户

指定的平台角色

用户权限

ws-manager

workspaces-manager

创建和管理所有企业空间。

ws-admin

platform-regular

被邀请到企业空间后,管理该企业空间中的所有资源(在此示例中,此用户用于邀请新成员加入该企业空间)。

project-admin

platform-regular

创建和管理项目以及 DevOps 项目,并邀请新成员加入项目。

project-regular

platform-regular

project-regular 将由 project-admin 邀请至项目或 DevOps 项目。该用户将用于在指定项目中创建工作负载、流水线和其他资源。

步骤2:创建企业空间

在本步骤中,需要使用上一个步骤中创建的用户ws-manager创建一个企业空间。作为管理项目、DevOps项目和组织成员的基本逻辑单元,企业空间是KubeSphere多租户系统的基础。

  1. 以ws-manager身份登录KubeSphere。点击左上角的平台管理,选择访问控制。在企业空间中,可以看到仅列出了一个默认企业空间 system-workspace,即系统企业空间,其中运行着与系统相关的组件和服务,无法删除该企业空间。
  2. 点击右侧的创建,将新企业空间命名为 demo-workspace,并将用户 ws-admin 设置为企业空间管理员。完成后,点击创建。
  3. 登出控制台,然后以 ws-admin 身份重新登录。在企业空间设置中,选择企业空间成员,然后点击邀请。邀请project-admin和project-regular进入企业空间,分别授予 demo-workspace-self-provisioner和demo-workspace-viewer角色,点击确定。
步骤3:创建项目

在此步骤中,需要使用在上一步骤中创建的帐户project-admin来创建项目。KubeSphere中的项目与Kubernetes中的命名空间相同,为资源提供了虚拟隔离。

  1. 以project-admin用户登录KubeSphere Web控制台,在项目中,点击创建。
  2. 输入项目名称(例如 demo-project),点击确定。您还可以为项目添加别名和描述。
  3. 在项目中,点击刚创建的项目查看其详情页面。
  4. 在项目的概览页面,默认情况下未设置项目配额。您可以点击编辑配额并根据需要指定资源请求和限制(例如:CPU 和内存的限制分别设为 1 Core 和 1000 Gi)。
  5. 在项目设置 > 项目成员中,邀请 project-regular 至该项目,并授予该用户 operator 角色。
步骤4:创建角色

完成上述步骤后,已实验了解可以为不同级别的用户授予不同角色。先前步骤中使用的角色都是KubeSphere提供的内置角色。在此步骤中,将实验如何创建自定义角色。

  1. 再次以 admin 身份登录KubeSphere Web控制台,转到访问控制。
  2. 点击左侧导航栏中的平台角色,再点击右侧的创建。
  3. 在创建平台角色对话框中,设置角色标识符(例如,clusters-admin)、角色名称和描述信息,然后点击编辑权限。(此处演示如何创建负责集群管理的角色。)
  4. 在编辑权限对话框中,设置角色权限(例如,选择集群管理)并点击确定。
  5. 在平台角色页面,可以点击所创建角色的名称查看角色详情,点击三个点以编辑角色、编辑角色权限或删除该角色。
  6. 在用户页面,可以在创建用户或编辑现有用户时为用户分配该角色。
启用可插拔组件

此处的教程仅介绍在成功部署KubeSphere之后如何启用可插拔组件,如需在部署之前就选择启用组件,操作过程与部署后类似,只需修改cluster-configuration.yaml中对应的参数后再执行安装部署过程即可。

编辑ks-installer的配置文件
  1. 使用admin用户登录控制台,点击左上角的平台管理,选择集群管理。
  2. 点击定制资源定义,在搜索栏中输入clusterconfiguration,点击结果查看其详细页面。
  3. 在自定义资源中,点击ks-installer右侧的三个点,选择编辑YAML。

具体每个组件的编辑内容,请参考后面每个组件的启用介绍。

  1. 编辑保存后,在kubectl中执行以下命令检查安装过程:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsnotallow='{.items[0].metadata.name}') -f

可以在控制台右下角的锤子按钮中找到 kubectl 工具

启用KubeSphere应用商店
  1. 在YAML文件中,搜索openpitrix,将enabled的false改为true。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

在登录控制台后,如果能看到页面左上角的应用商店以及其中的应用,则说明安装成功。可以在不登录控制台的情况下直接访问<节点 IP 地址>:30880/apps 进入应用商店。

启用KubeSphere DevOps系统
  1. 在YAML文件中,搜索devops,将enabled的false改为true。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

启用KubeSphere 日志系统
  1. 在YAML文件中,搜索 logging,将enabled的false改为true。完成后,点击右下角的确定,保存配置。
  1. 备注:默认情况下,如果启用了日志系统,将以容器方式安装内置Elasticsearch。对于生产环境,如果现有环境中已有Elasticsearch等组件的情况下想启用日志系统,强烈建议在config-sample.yaml中设置以下值,尤其是externalElasticsearchHost和externalElasticsearchPort。在安装前提供以下信息后,将直接对接已有的外部Elasticsearch,不再安装内置Elasticsearch。
  1. 验证组件的安装

执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

启用KubeSphere 事件系统
  1. 在YAML文件中,搜索events,将enabled的false改为true。完成后,点击右下角的确定,保存配置。

备注:默认情况下,如果启用了事件系统,将以容器方式安装内置Elasticsearch。对于生产环境,如果现有环境中已有Elasticsearch等组件的情况下想启用日志系统,强烈建议在config-sample.yaml中设置以下值,尤其是externalElasticsearchHost和externalElasticsearchPort。在安装前提供以下信息后,将直接对接已有的外部Elasticsearch,不再安装内置Elasticsearch。

  1. 验证组件的安装

执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

启用KubeSphere 告警系统
  1. 在YAML文件中,搜索alerting,将enabled的false改为true。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

如果可以在集群管理页面看到告警消息告警策略,则说明安装成功。

启用KubeSphere 审计日志
  1. 在YAML文件中,搜索auditing,将enabled的false改为true。完成后,点击右下角的确定,保存配置。

备注:默认情况下,如果启用了事件系统,将以容器方式安装内置Elasticsearch。对于生产环境,如果现有环境中已有Elasticsearch等组件的情况下想启用日志系统,强烈建议在config-sample.yaml中设置以下值,尤其是externalElasticsearchHost和externalElasticsearchPort。在安装前提供以下信息后,将直接对接已有的外部Elasticsearch,不再安装内置Elasticsearch。

  1. 验证组件的安装

验证可以使用右下角工具箱中的审计日志查询功能。

启用KubeSphere 服务网格
  1. 在YAML文件中,搜索servicemesh,将enabled的false改为true。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

启用服务拓补图
  1. 在YAML文件中,搜索network,将network.topology.type的值改为weave-scope。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

启用容器组IP池
  1. 在YAML文件中,搜索network,将network.ippool.type的值改为calico。完成后,点击右下角的确定,保存配置。
  2. 验证组件的安装

在集群管理页面,可以在网络下看到容器组 IP 池。

启用KubeEdge
  1. 在YAML文件中,搜索edgeruntime和kubeedge,然后将它们enabled值从false更改为true以便开启所有KubeEdge组件。完成后保存文件。
  2. 验证组件的安装

在集群管理页面,您可以看到节点下出现边缘节点板块。

或者执行以下命令来检测容器组的状态:

如果组件运行成功,输出结果如下:

卸载可插拔组件

在卸载除服务拓扑图和容器组 IP 池之外的可插拔组件之前,必须将 CRD 配置文件 ClusterConfiguration 中的 ks-installer 中的 enabled 字段的值从 true 改为 false。

使用下列任一方法更改 enabled 字段的值:

  • 运行以下命令编辑 ks-installer:

  • 使用 admin 身份登录KubeSphere Web控制台,左上角点击平台管理,选择集群管理,在定制资源定义中搜索 ClusterConfiguration。
卸载KubeSphere应用商店

将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 openpitrix.store.enabled 字段的值从 true 改为 false。

卸载KubeSphere DevOps系统

将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 openpitrix.store.enabled 字段的值从 true 改为 false。

卸载 DevOps:

1.helm uninstall -n kubesphere-devops-system devops
2.kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "remove", "path": "/status/devops"}]'
3.kubectl patch -n kubesphere-system cc ks-installer --type=json -p='[{"op": "replace", "path": "/spec/devops/enabled", "value": false}]'

删除 DevOps 资源:

# 删除所有 DevOps 相关资源
for devops_crd in $(kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io"); do
    for ns in $(kubectl get ns -ojsonpath='{.items..metadata.name}'); do
        for devops_res in $(kubectl get $devops_crd -n $ns -oname); do
            kubectl patch $devops_res -n $ns -p '{"metadata":{"finalizers":[]}}' --type=merge
        done
done
done
# 删除所有 DevOps CRD
kubectl get crd -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | grep "devops.kubesphere.io" | xargs -I crd_name kubectl delete crd crd_name
# 删除 DevOps 命名空间
kubectl delete namespace kubesphere-devops-system
卸载KubeSphere日志系统
  1. 将CRD ClusterConfiguration配置文件中ks-installer参数的logging.enabled字段的值从 true改为false。
  2. 仅禁用日志收集:
kubectl delete inputs.logging.kubesphere.io -n kubesphere-logging-system tail
kubectl delete crd fluentbitconfigs.logging.kubesphere.io
kubectl delete crd fluentbits.logging.kubesphere.io
kubectl delete crd inputs.logging.kubesphere.io
kubectl delete crd outputs.logging.kubesphere.io
kubectl delete crd parsers.logging.kubesphere.io
kubectl delete deployments.apps -n kubesphere-logging-system fluentbit-operator
helm uninstall elasticsearch-logging --namespace kubesphere-logging-system

警告:此操作可能导致审计、事件和服务网格的异常。

  1. 运行以下命令:
kubectl delete deployment logsidecar-injector-deploy -n kubesphere-logging-system
kubectl delete ns kubesphere-logging-system
卸载KubeSphere事件系统
  1. 将将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 events.enabled 字段的值从 true 改为 false。
  2. 运行以下命令:
helm delete ks-events -n kubesphere-logging-system
卸载KubeSphere告警系统
  1. 将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 alerting.enabled 字段的值从 true 改为 false。
  2. 运行以下命令:
kubectl -n kubesphere-monitoring-system delete thanosruler kubesphere
卸载KubeSphere审计日志
  1. 将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 auditing.enabled 字段的值从 true 改为 false。
  2. 运行以下命令:
helm uninstall kube-auditing -n kubesphere-logging-system
kubectl delete crd rules.auditing.kubesphere.io
kubectl delete crd webhooks.auditing.kubesphere.io
卸载KubeSphere服务网格
  1. 将 CRD ClusterConfiguration 配置文件中 ks-installer 参数的 servicemesh.enabled 字段的值从 true 改为 false。
  2. 运行以下命令:
curl -L https://istio.io/downloadIstio | sh -
istioctl x uninstall --purge
   
kubectl -n istio-system delete kiali kiali
helm -n istio-system delete kiali-operator
   
kubectl -n istio-system delete jaeger jaeger
helm -n istio-system delete jaeger-operator
卸载服务拓补图
  1. 将 CRD ClusterConfiguration 配置文件中参数 ks-installer 中 network.topology.type 的值从 weave-scope 改为 none。
  2. 运行以下命令:
kubectl delete ns weave
卸载容器组IP池

将 CRD ClusterConfiguration 配置文件中参数 ks-installer 中 network.ippool.type 的值从 calico 改为 none。

卸载KubeEdge
  1. 将CRD ClusterConfiguration 配置文件中参数 ks-installer 中 kubeedege.enabled 和 edgeruntime.enabled 的值从 true 改为 false。
  2. 运行以下命令:
helm uninstall kubeedge -n kubeedge
kubectl delete ns kubeedge
集群管理
节点管理

Kubernetes将容器放入容器组(Pod)中并在节点上运行,从而运行工作负载。取决于具体的集群环境,节点可以是虚拟机,也可以是物理机。

准备工作

需要一个被授予集群管理权限的用户。例如,可以直接用 admin 用户登录控制台,或创建一个具有集群管理权限的角色然后将此角色授予一个用户。

节点状态

只有集群管理员可以访问集群节点。由于一些节点指标对集群非常重要,集群管理员应监控这些指标并确保节点可用。请按照以下步骤查看节点状态。

  1. 点击左上角的平台管理,然后选择集群管理。
  2. 如果您已启用了​​多集群功能​​并已导入了成员集群,您可以选择