KubeSphere 使用

KubeSphere 体系架构

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

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

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

平台内置角色

内置角色

创建用户

在用户中,点击创建。在弹出的对话框中,提供所有必要信息(带有*标记),然后在角色一栏选择 users-manager。请参考下图示例。
完成后,点击确定。新创建的帐户将显示在用户中的帐户列表中。
切换帐户使用 user-manager 重新登录,创建新帐户。

点击左上角 平台管理,在遮罩层中选择访问控制,点击用户,选择创建创建对应的用户。

创建用户

用户体系

创建企业空间

点击左上角 平台管理,在遮罩层中选择访问控制,点击企业空间,选择创建进入创建企业空间。

访问控制

创建企业空间

创建项目

使用空间管理员账号登入,选择对应的命名空间(wowaili,不建议使用系统命名看空间创建项目)。如果是CI/CD项目选择DevOps项目, 普通项目选择项目即可。

创建普通项目

创建DevOps项目

OpenELB

为什么需要OpenELB?

在基于云的 Kubernetes 集群中,通常使用云供应商提供的负载均衡器来公开服务。但是,基于云的负载均衡器在裸机环境中不可用。 OpenELB 允许用户在裸机、边缘和虚拟化环境中创建 LoadBalancer 服务以供外部访问,并提供与基于云的负载均衡器相同的用户体验。

如何安装?

KubeSphere商店提供了开源的OpenELB应用,在商店安装即可。

如何使用(Layer2 Mode)?

  1. 允许strictARP

    kubectl edit configmap kube-proxy -n kube-system
    

    设置data.config.conf.ipvs.strictARP 值为 true

  2. 创建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中的注解。

  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

Eip对象

redis集群 外网配置

Mysql高可用集群

安装RadonDB-Mysql-Operator

  1. 添加仓库 https://radondb.github.io/radondb-mysql-kubernetes
  2. 安装mysql-operator应用
  3. 执行脚本
    kubectl apply -f https://github.com/radondb/radondb-mysql-kubernetes/releases/latest/download/mysql_v1alpha1_mysqlcluster.yaml --namespace=mysql-cluster
    

配置LoadBalancer访问

mysql外网

mysql-leadermysql-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解码)。

字典配置

root密码

Redis集群模式

Redis Sentinel与 Redis Cluster

sentinel & cluster

Redis Sentinel支持多主多从、选举、故障转移,是redis高可用的解决方案。但是存在从节点下线后,sentinel是不会对其进行故障转移的,连接从节点的客户端无法获取新的可用从节点,且无法实现动态扩容。

Redis Cluster是Redis的分布式解决方案,当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。可实现动态扩容,自动故障转移。

Redis Sentinel中所有节点有数据的完整备份,Redis Cluster中节点只存储部分数据。

Redis Cluster安装

  1. 添加bitnami仓库 https://charts.bitnami.com/bitnami
  2. 配置values.yaml文件,修改global.redis.passwordcluster.externalAccess.enabledcluster.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 Cluster安装结果

redis客户端连接

通过redis客户端以集群模式连接任意IP,此时会自动发现集群内其他主节点。