1. KubeSphere简介
KubeSphere 愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。
简单来说,KubeSphere(下文简称ks)就是一个容器管理平台,可以图形化管理多个K8S集群。
相关链接:
2. 安装准备
参考在 Kubernetes 上安装 KubeSphere - 准备工作,确认环境满足ks安装需求。
2.1. K8S版本需求
计划安装kubesphere-v3.3.0版本,需要确认 Kubernetes 版本必须为:v1.19.x,v1.20.x,v1.21.x,v1.22.x 或 v1.23.x(实验性支持)。
2.2. 资源需求
CPU > 1 核;内存 > 2 G。CPU 必须为 x86_64,暂时不支持 Arm 架构的 CPU。
2.3. StorageClass需求
Kubernetes 集群已配置默认 StorageClass(请使用 kubectl get sc
进行确认)。
这一条是最重要的,因为k8s集群默认并不会配置storageclass,需要我们自己单独配置。
storage安装配置方法参考《K8S中安装配置StorageClass》
3. 安装KubeSphere
参考在 Kubernetes 上安装 KubeSphere - 概述,安装kubesphere-v3.3.0版本
1、下载manifests
1 | wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml |
2、修改集群配置 cluster-configuration.yaml
ks-apiserver和ks-controller-manager的资源调整示例如下:
1 | spec: |
因为ks-apiserver和ks-controller-manager容易OOM,所以内存上限设置高一些。
kubesphere的一些功能(数据备份、日志存储、应用数据存储)需要依赖minio,因此把minio的存储调大一些。
opensearch一般用不到,opensearch.enabled 改成false。
3、提交资源清单到k8s集群
1 | kubectl apply -f kubesphere-installer.yaml |
4、查看安装过程
1 | k describe pod/ks-installer-xxx-xxx -n kubesphere-system |
5、查看ks状态
1 | kubectl get all -n kubesphere-system |
4. StorageClass问题排查
ks的redis没有ready,一直处于pending状态,查看详情
1 | kubectl describe pod/redis-d744b7468-45sh4 -n kubesphere-system |
报错:0/x nodes are available: x pod has unbound immediate PersistentVolumeClaims.
查看nfs-client-provisioner日志
1 | kubectl logs --tail=100 nfs-client-provisioner-7975f9b954-7fw5l |
报错:
provision “kubesphere-system/redis-pvc” class “nfs-storage”: unexpected error getting claim reference: selfLink was empty, can’t make reference
这是因为,1.20.x之后的k8s版本,selflink已经弃用了。而nfs-client-provisioner的实现基于selflink,因此报错。
解决办法:apiserver启动时添加参数--feature-gates=RemoveSelfLink=false
1、编辑kube-apiserver.yaml
1 | sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml |
如下修改:
1 | spec: |
2、重建apiserver pod
因为apiserver是static pod,所以在修改完kube-apiserver.yaml后会自动重建。
参考文档:
- unexpected error getting claim reference: selfLink was empty, can’t make reference
- kubernetes1.20版本 nfs-provisioner报错问题:”selfLink was empty”
5. 验证KubeSphere
KS默认对外开放 30880 端口,通过 NodePort (IP:30880) 使用默认帐户和密码 (admin/P@88w0rd) 访问 Web 控制台。
http://192.168.56.101:30880/login
第一次登录时,会提示修改密码。
6. KubeSphere常用操作
6.1. 修改KubeSphere配置
如果ks已经安装完成,想要修改ks集群配置的话,可以通过修改 kubesphere-config 和 ks-installer 配置来实现。
1 | kubectl get cm kubesphere-config -n kubesphere-system -oyaml |
修改ks-installer配置后,相关pod会自动重启(请耐心等待,大概5分钟内会自动重启)。
参考文档:
6.2. 修改使用外部Prometheus
1 | kubectl edit cm -n kubesphere-system kubesphere-config |
monitoring 部分修改为:
1 | monitoring: |
参考文档:集成您自己的 Prometheus
6.3. 安装Grafana
KubeSphere 3.3.0 版本的Grafana需要自行安装。
1、添加helm chart仓库
1 | helm repo add bitnami https://charts.bitnami.com/bitnami |
2、获取redis的配置
这里选择chart版本9.0.7,app版本10.0.3
1 | helm search repo bitnami/grafana -l |
3、values.yaml 修改配置
- global.storageClass 修改为期望的storageclass
- admin.user 改为期望的用户名
- admin.password 改为期望的密码
- service.type 改为NodePort
4、安装grafana
1 | helm install grafana grafana \ |
5、查看安装
1 | kubectl get all -n grafana |
6.4. 重置KubeSphere密码
如果忘记了ks的密码,可以通过kubectl命令进行重置。参考文档Reset the Account Password
1 | kubectl patch users <USERNAME> -p '{"spec":{"password":"<YOURPASSWORD>"}}' --type='merge' && kubectl annotate users <USERNAME> iam.kubesphere.io/password-encrypted- |
6.5. 添加项目到企业空间
Kubernetes命名空间就是KubeSphere项目,这些项目可以在 平台管理->集群管理->具体集群->项目 中查看到。
添加现有KubeSphere项目到企业空间:
1、以管理员身份登录KubeSphere控制台,转到集群管理页面。点击项目,可以查看在当前集群中运行的所有项目。
2、通过 kubectl 创建的命名空间不属于任何企业空间。请点击右侧的三个点,选择分配企业空间。
3、在弹出的对话框中,为该项目选择一个企业空间和项目管理员,然后点击确定。
4、转到企业空间,可以在项目页面看到该项目已显示。
参考文档:
6.6. 批量添加项目到企业空间
1 | kubectl get ns |grep voidking | awk '{print $1}' | xargs kubectl patch ns -p 'metadata: {labels: {kubesphere.io/workspace: "voidking"}, annotations: {kubesphere.io/creator: "haojin"}}' |
6.7. 修改KS组件亲和性
安装KS时,是不支持配置KS组件的亲和性的。
如果自己通过脚本批量修改,会被ks-intaller自动改回,并且不同资源修改的方法是不同的。
下面是一个可行的办法:
1、关闭 ks-intaller
1 | kubectl scale --replicas=0 deployment ks-installer -n kubesphere-system |
2、准备亲和性配置 data.yaml
1 | spec: |
3、deployment批量添加节点亲和性
1 | kubectl get deployment -n kubesphere-system -o=jsonpath='{.items[*].metadata.name}' | xargs kubectl patch deployment --type=merge --patch-file data.yaml -n kubesphere-system |
4、准备亲和性配置 data2.yaml
1 | spec: |
4、自定义资源添加节点亲和性
1 | kubectl get prometheus k8s -n kubesphere-monitoring-system |
参考文档:
7. KubeSphere问题记录
7.1. Could not connect to the container
问题描述:配置好nginx,通过域名访问ks正常,但是在ks页面上访问容器终端时报错:
1 | Could not connect to the container. Do you have sufficient privileges? |
解决办法:因为页面访问终端需要websocket支持,所以nginx配置中需要添加websocket支持,配置方法参考《Nginx入门篇》。
7.2. Pod详情页没有监控数据
问题描述:安装了Prometheus套装后,Pod详情页看不到监控数据。访问获取监控数据的API,看到报错:
1 | error: "execution: found duplicate series for the match group {namespace="xxx", pod="xxx"} on the right hand-side of the operation: [{__name__="kube_pod_owner", container="kube-rbac-proxy-main", instance="10.244.92.200:8443", job="kube-state-metrics", namespace="xxx", owner_is_controller="true", owner_kind="ReplicaSet", owner_name="xxx", pod="xxx", uid="xxx"}, {__name__="kube_pod_owner", container="kube-rbac-proxy-main", instance="10.244.218.131:8443", job="kube-state-metrics", namespace="act", owner_is_controller="true", owner_kind="ReplicaSet", owner_name="xxx", pod="xxx"}];many-to-many matching not allowed: matching labels must be unique on one side" |
原因分析:ks自带的Prometheus,和Prometheus套装,两个Prometheus的serviceMonitor存在重合,导致获取了两遍数据。
解决办法:删除两个Prometheus的其中一份serviceMonitor。
1 | kubectl get servicemonitor -n kubesphere-monitoring-system -oyaml > servicemonitor.yaml |
参考文档:pod监控都没有数据展示
8. KubeSphere多集群
参考文档: