一个计算机技术爱好者与学习者

0%

好好学K8S:K8S中安装配置KubeSphere

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
2
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml
wget https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml

2、修改集群配置 cluster-configuration.yaml
ks-apiserver和ks-controller-manager的资源调整示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
spec:
common:
core:
console:
enableMultiLogin: true
port: 30880
apiserver:
resources:
requests:
cpu: 100m
memory: 400Mi
limits:
cpu: "2"
memory: 8Gi
controllerManager:
resources:
requests:
cpu: 100m
memory: 400Mi
limits:
cpu: "2"
memory: 8Gi
minio:
volumeSize: 200Gi # Minio PVC size.

因为ks-apiserver和ks-controller-manager容易OOM,所以内存上限设置高一些。

kubesphere的一些功能(数据备份、日志存储、应用数据存储)需要依赖minio,因此把minio的存储调大一些。

opensearch一般用不到,opensearch.enabled 改成false。

3、提交资源清单到k8s集群

1
2
kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml

4、查看安装过程

1
2
k describe pod/ks-installer-xxx-xxx -n kubesphere-system
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

5、查看ks状态

1
2
kubectl get all -n kubesphere-system
kubectl get svc/ks-console -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
2
3
4
5
6
spec:
containers:
- command:
- kube-apiserver
- --...
- --feature-gates=RemoveSelfLink=false

2、重建apiserver pod
因为apiserver是static pod,所以在修改完kube-apiserver.yaml后会自动重建。

参考文档:

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
2
3
4
5
kubectl get cm kubesphere-config -n kubesphere-system -oyaml
kubectl edit cm kubesphere-config -n kubesphere-system # 例如修改使用集群外部的Prometheus

kubectl get clusterconfiguration ks-installer -n kubesphere-system -oyaml
kubectl edit clusterconfiguration ks-installer -n kubesphere-system # 例如修改Pod资源

修改ks-installer配置后,相关pod会自动重启(请耐心等待,大概5分钟内会自动重启)。

参考文档:

6.2. 修改使用外部Prometheus

1
kubectl edit cm -n kubesphere-system kubesphere-config

monitoring 部分修改为:

1
2
monitoring:
endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090

参考文档:集成您自己的 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
2
3
4
helm search repo bitnami/grafana -l
helm pull bitnami/grafana --version 9.0.7
tar -xzvf grafana-9.0.7.tgz
vim grafana/values.yaml

3、values.yaml 修改配置

  • global.storageClass 修改为期望的storageclass
  • admin.user 改为期望的用户名
  • admin.password 改为期望的密码
  • service.type 改为NodePort

4、安装grafana

1
2
helm install grafana grafana \
-n grafana --create-namespace

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
2
3
4
5
6
7
8
9
10
spec:
template:
spec:
nodeSelector:
nodetype: infra
tolerations:
- key: "nodetype"
operator: "Equal"
value: "infra"
effect: "NoSchedule"

3、deployment批量添加节点亲和性

1
2
kubectl get deployment -n kubesphere-system -o=jsonpath='{.items[*].metadata.name}' | xargs kubectl patch deployment --type=merge --patch-file data.yaml -n kubesphere-system
kubectl get deployment -n kubesphere-monitoring-system -o=jsonpath='{.items[*].metadata.name}' | xargs kubectl patch deployment --type=merge --patch-file data.yaml -n kubesphere-monitoring-system

4、准备亲和性配置 data2.yaml

1
2
3
4
5
6
7
8
spec:
nodeSelector:
nodetype: infra
tolerations:
- key: "nodetype"
operator: "Equal"
value: "infra"
effect: "NoSchedule"

4、自定义资源添加节点亲和性

1
2
3
4
5
6
7
8
kubectl get prometheus k8s -n kubesphere-monitoring-system
kubectl patch prometheus k8s --type=merge --patch-file=data2.yaml -n kubesphere-monitoring-system

kubectl get alertmanager main -n kubesphere-monitoring-system
kubectl patch alertmanager main --type=merge --patch-file=data2.yaml -n kubesphere-monitoring-system

kubectl get notificationmanager -n kubesphere-monitoring-system
kubectl patch notificationmanager/notification-manager --type=merge --patch-file=data2.yaml -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
2
kubectl get servicemonitor -n kubesphere-monitoring-system -oyaml > servicemonitor.yaml
kubectl get servicemonitor -n kubesphere-monitoring-system | awk '{print $1}' | grep -v "NAME" | xargs kubectl delete servicemonitor -n kubesphere-monitoring-system

参考文档:pod监控都没有数据展示

8. KubeSphere多集群

参考文档:

8.1. 主集群配置

1、设置为主集群

1
kubectl edit cc ks-installer -n kubesphere-system

修改配置:

1
2
multicluster:
clusterRole: host

2、获取jwtSecret

1
kubectl -n kubesphere-system get cm kubesphere-config -o yaml | grep -v "apiVersion" | grep jwtSecret

8.2. 成员集群配置

1、设置为成员集群

1
kubectl edit cc ks-installer -n kubesphere-system

修改配置:

1
2
3
4
5
authentication:
jwtSecret: gfIwilcc0WjNGKJ5DLeksf2JKfcLgTZU

multicluster:
clusterRole: member

其中,authentication.jwtSecret 修改和主集群保持一致;multicluster.clusterRole 修改为member。

8.3. 导入成员集群

1、以 admin 身份登录 KubeSphere 控制台,转到集群管理页面点击添加集群。

2、在导入集群页面,输入要导入的集群的基本信息。您也可以点击右上角的编辑模式以 YAML 格式查看并编辑基本信息。编辑完成后,点击下一步。

3、在连接方式,选择直接连接 Kubernetes 集群,复制 kubeconfig 内容并粘贴至文本框。您也可以点击右上角的编辑模式以 YAML 格式编辑的 kubeconfig。请确保 server 地址为该 member 集群可访问的 kube-apiserver 地址(主集群的任何节点都能访问)。

4、点击创建,然后等待集群初始化完成。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-k8s-kubesphere/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~