KubeSphere 使用
KubeSphere 体系架构
KubeSphere 的多租户系统分三个层级,即集群、企业空间和项目。KubeSphere 中的项目等同于 Kubernetes 的命名空间。
您需要创建一个新的企业空间进行操作,而不是使用系统企业空间,系统企业空间中运行着系统资源,绝大部分仅供查看。出于安全考虑,强烈建议给不同的租户授予不同的权限在企业空间中进行协作。
您可以在一个 KubeSphere 集群中创建多个企业空间,每个企业空间下可以创建多个项目。KubeSphere 为每个级别默认设有多个内置角色。此外,您还可以创建拥有自定义权限的角色。KubeSphere 多层次结构适用于具有不同团队或组织以及每个团队中需要不同角色的企业用户。
平台内置角色
创建用户
在用户中,点击创建。在弹出的对话框中,提供所有必要信息(带有*标记),然后在角色一栏选择 users-manager。请参考下图示例。
完成后,点击确定。新创建的帐户将显示在用户中的帐户列表中。
切换帐户使用 user-manager 重新登录,创建新帐户。
点击左上角 平台管理
,在遮罩层中选择访问控制,点击用户,选择创建创建对应的用户。
创建企业空间
点击左上角 平台管理
,在遮罩层中选择访问控制,点击企业空间,选择创建进入创建企业空间。
创建项目
使用空间管理员账号登入,选择对应的命名空间(wowaili,不建议使用系统命名看空间创建项目)。如果是CI/CD
项目选择DevOps项目, 普通项目选择项目即可。
OpenELB
为什么需要OpenELB?
在基于云的 Kubernetes 集群中,通常使用云供应商提供的负载均衡器来公开服务。但是,基于云的负载均衡器在裸机环境中不可用。 OpenELB 允许用户在裸机、边缘和虚拟化环境中创建 LoadBalancer 服务以供外部访问,并提供与基于云的负载均衡器相同的用户体验。
如何安装?
KubeSphere商店提供了开源的OpenELB应用,在商店安装即可。
如何使用(Layer2 Mode)?
-
允许strictARP
kubectl edit configmap kube-proxy -n kube-system
设置
data.config.conf.ipvs.strictARP
值为true
-
创建Eip对象
apiVersion: network.kubesphere.io/v1alpha2 kind: Eip metadata: name: layer2-eip annotations: eip.openelb.kubesphere.io/is-default-eip: "true" spec: address: 192.168.3.91-192.168.3.120 interface: ens192 protocol: layer2
PS:如果开启了
metadata.annotations.eip.openelb.kubesphere.io/is-default-eip
注解,则可以不用每个svc
都配置step 3
中的注解。 -
在每个需要LoadBalancer服务的svc中, 在
metadata.annotations
添加如下注解metadata: name: layer2-svc annotations: lb.kubesphere.io/v1alpha1: openelb protocol.openelb.kubesphere.io/v1alpha1: layer2 eip.openelb.kubesphere.io/v1alpha2: layer2-eip
验证OpenELB
Mysql高可用集群
安装RadonDB-Mysql-Operator
- 添加仓库
https://radondb.github.io/radondb-mysql-kubernetes
- 安装
mysql-operator
应用 - 执行脚本
kubectl apply -f https://github.com/radondb/radondb-mysql-kubernetes/releases/latest/download/mysql_v1alpha1_mysqlcluster.yaml --namespace=mysql-cluster
配置LoadBalancer访问
为mysql-leader
和mysql-follower
配置外网访问,选择LoadBalancer即可(前提是已经配置了metadata.annotations.eip.openelb.kubesphere.io/is-default-eip: "true"
, 如果未配置, 则在每个服务中均要添加对应的注解,参考如何使用(Layer2 Mode)
中的 step 3
)
使用root账号连接Radondb-MySql
使用默认集群配置文件创建的mysql集群,提供了一个可以远程访问(internal
)的root账号和密码,需要通过配置文件才能找到root帐户的密码(显示为Base64编码后的结果,需要Base64解码)。
Redis集群模式
Redis Sentinel与 Redis Cluster
Redis Sentinel支持多主多从、选举、故障转移,是redis高可用的解决方案。但是存在从节点下线后,sentinel是不会对其进行故障转移的,连接从节点的客户端无法获取新的可用从节点,且无法实现动态扩容。
Redis Cluster是Redis的分布式解决方案,当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。可实现动态扩容,自动故障转移。
Redis Sentinel中所有节点有数据的完整备份,Redis Cluster中节点只存储部分数据。
Redis Cluster安装
- 添加
bitnami
仓库https://charts.bitnami.com/bitnami
。 - 配置
values.yaml
文件,修改global.redis.password
、cluster.externalAccess.enabled
、cluster.externalAccess.service.loadBalancerIP
字段。global: imageRegistry: '' imagePullSecrets: [] storageClass: '' redis: password: Klaus123@. nameOverride: '' fullnameOverride: '' clusterDomain: cluster.local commonAnnotations: {} commonLabels: {} extraDeploy: [] diagnosticMode: enabled: false command: - sleep args: - infinity image: registry: docker.io repository: bitnami/redis-cluster tag: 7.0.4-debian-11-r4 digest: '' pullPolicy: IfNotPresent pullSecrets: [] debug: false networkPolicy: enabled: false allowExternal: true ingressNSMatchLabels: {} ingressNSPodMatchLabels: {} serviceAccount: create: false name: '' annotations: {} automountServiceAccountToken: false rbac: create: false role: rules: [] podSecurityContext: enabled: true fsGroup: 1001 runAsUser: 1001 sysctls: [] podDisruptionBudget: {} minAvailable: '' maxUnavailable: '' containerSecurityContext: enabled: true runAsUser: 1001 runAsNonRoot: true usePassword: true password: '' existingSecret: '' existingSecretPasswordKey: '' usePasswordFile: false tls: enabled: false authClients: true autoGenerated: false existingSecret: '' certificatesSecret: '' certFilename: '' certKeyFilename: '' certCAFilename: '' dhParamsFilename: '' service: ports: redis: 6379 nodePorts: redis: '' extraPorts: [] annotations: {} labels: {} type: ClusterIP clusterIP: '' loadBalancerIP: '' loadBalancerSourceRanges: [] externalTrafficPolicy: Cluster sessionAffinity: None sessionAffinityConfig: {} persistence: path: /bitnami/redis/data subPath: '' storageClass: '' annotations: {} accessModes: - ReadWriteOnce size: 8Gi matchLabels: {} matchExpressions: {} volumePermissions: enabled: false image: registry: docker.io repository: bitnami/bitnami-shell tag: 11-debian-11-r23 digest: '' pullPolicy: IfNotPresent pullSecrets: [] resources: limits: {} requests: {} podSecurityPolicy: create: false redis: command: [] args: [] updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 podManagementPolicy: Parallel hostAliases: [] hostNetwork: false useAOFPersistence: 'yes' containerPorts: redis: 6379 bus: 16379 lifecycleHooks: {} extraVolumes: [] extraVolumeMounts: [] customLivenessProbe: {} customReadinessProbe: {} customStartupProbe: {} initContainers: [] sidecars: [] podLabels: {} priorityClassName: '' configmap: '' extraEnvVars: [] extraEnvVarsCM: '' extraEnvVarsSecret: '' podAnnotations: {} resources: limits: {} requests: {} schedulerName: '' shareProcessNamespace: false livenessProbe: enabled: true initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: enabled: true initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 5 startupProbe: enabled: false path: / initialDelaySeconds: 300 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 6 successThreshold: 1 podAffinityPreset: '' podAntiAffinityPreset: soft nodeAffinityPreset: type: '' key: '' values: [] affinity: {} nodeSelector: {} tolerations: [] topologySpreadConstraints: [] updateJob: activeDeadlineSeconds: 600 command: [] args: [] hostAliases: [] annotations: {} podAnnotations: {} podLabels: {} extraEnvVars: [] extraEnvVarsCM: '' extraEnvVarsSecret: '' extraVolumes: [] extraVolumeMounts: [] initContainers: [] podAffinityPreset: '' podAntiAffinityPreset: soft nodeAffinityPreset: type: '' key: '' values: [] affinity: {} nodeSelector: {} tolerations: [] priorityClassName: '' resources: limits: {} requests: {} cluster: init: true nodes: 6 replicas: 1 externalAccess: enabled: true service: type: LoadBalancer port: 6379 loadBalancerIP: - 192.168.3.93 - 192.168.3.94 - 192.168.3.96 - 192.168.3.97 - 192.168.3.98 - 192.168.3.99 loadBalancerSourceRanges: [] annotations: {} update: addNodes: false currentNumberOfNodes: 6 currentNumberOfReplicas: 1 newExternalIPs: [] metrics: enabled: false image: registry: docker.io repository: bitnami/redis-exporter tag: 1.43.0-debian-11-r19 digest: '' pullPolicy: IfNotPresent pullSecrets: [] resources: {} extraArgs: {} podAnnotations: prometheus.io/scrape: 'true' prometheus.io/port: '9121' podLabels: {} containerSecurityContext: enabled: false allowPrivilegeEscalation: false serviceMonitor: enabled: false namespace: '' interval: '' scrapeTimeout: '' selector: {} labels: {} annotations: {} jobLabel: '' relabelings: [] metricRelabelings: [] prometheusRule: enabled: false additionalLabels: {} namespace: '' rules: [] priorityClassName: '' service: type: ClusterIP clusterIP: '' loadBalancerIP: '' annotations: {} labels: {} sysctlImage: enabled: false command: [] registry: docker.io repository: bitnami/bitnami-shell tag: 11-debian-11-r23 digest: '' pullPolicy: IfNotPresent pullSecrets: [] mountHostSys: false resources: limits: {} requests: {}
验证Redis Cluster
通过redis客户端以集群模式连接任意IP,此时会自动发现集群内其他主节点。