KubeKey创建k8s集群、k8s监控、KubeSphere可视化安装mysql中间件并暴露服务,中间件扩容缩容

本文详细指导了如何使用KubeKey创建Kubernetes集群,并在KubeSphere界面安装MySQL,包括创建企业空间、项目,配置NFS文件系统挂载,以及设置MySQL工作负载、服务和访问。同时介绍了安装Metrics监控组件的可选步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下步骤如未说明,每个节点都要执行

一、前置条件

1、三台或者更多兼容的 Linux 主机(建议CentOS 7.9),每台机器 2 GB 或更多的 RAM,2 CPU 核或更多。
2、各个主机网络互通(公网和内网均可)。
3、 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。

注意:分别在三个主机执行以下三行命令

#各个机器设置自己的域名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

#查看主机名
hostname

二、使用KubeKey创建集群

1、下载KubeKey

export KKZONE=cn

curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -

chmod +x kk

2、创建集群配置yaml文件

./kk create config --with-kubernetes v1.20.4 --with-kubesphere v3.1.1

在这里插入图片描述
执行完成会生成一个config-sample.yaml的配置文件,打开修改以下内容为自己的节点hostname、IP、用户名和密码:
在这里插入图片描述

3、创建集群

./kk create cluster -f config-sample.yaml

如果提示没有conntrack执行yum install -y conntrack
在这里插入图片描述

正常安装,输入yes继续在这里插入图片描述4、查看安装进度

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

在这里插入图片描述
安装完成访问
在这里插入图片描述

三、安装NFS文件系统

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS服务器可以让主机将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;利用这个特点我们可以保存有状态应用的一些数据或者配置,比如MySQL的数据文件或者配置文件。
1、安装nfs

# 在每个机器。
yum install -y nfs-utils


# 在master 执行以下全部命令 
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports


# 执行以下命令,启动 nfs 服务;创建共享目录
mkdir -p /nfs/data

systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server

# 使配置生效
exportfs -r

#检查配置是否生效
exportfs

在这里插入图片描述

2、配置默认存储,保存以下到storage.yaml中,注意修改中间的两个IP为自己master的IP

## 创建了一个存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "true"  ## 删除pv的时候,pv的内容是否要备份

---
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: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
          # resources:
          #    limits:
          #      cpu: 10m
          #    requests:
          #      cpu: 10m
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 172.31.0.2 ## 指定自己nfs服务器地址
            - name: NFS_PATH  
              value: /nfs/data  ## nfs服务器共享的目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 172.31.0.2
            path: /nfs/data
---
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
kubectl apply -f storage.yaml

四、KubeSphere可视化界面安装mysql

1、创建企业空间

登录KubeSphere点击企业空间
在这里插入图片描述
点击创建
在这里插入图片描述
输入企业空间名称
在这里插入图片描述

2、创建项目

点击左上角工作台退出来,点击企业空间,点击刚刚创建的企业空间test,点击项目管理,点击创建
在这里插入图片描述
输入项目名称,点击创建
在这里插入图片描述
创建完成点击项目名称

在这里插入图片描述

3、创建mysql工作负载

首先分析一下,k8s最小单元是pod,而pod是一组docker容器,所以安装mysql就是用docker安装mysql,参照第二节:Docker使用命令,第10小节:docker安装mysql,docker的安装命令是:

docker run -p 3306:3306 --name mysql-01 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
-d mysql:5.7 

需要考虑:

  • 挂载配置文件到主机,在配置中心添加配置
  • 执行参数MYSQL_ROOT_PASSWORD来给mysql配置登录密码,添加环境变量
  • 挂载mysql数据到主机,添加PVC使用nfs来挂载

对应上面:

(1)、增加mysql配置

点击配置中心=>配置=>创建
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
输入key,输入值,点击对号,点击创建

[client]
default-character-set=utf8mb4
 
[mysql]
default-character-set=utf8mb4
 
[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

在这里插入图片描述

(2)、创建工作负载,配置mysql镜像,配置端口号

点击应用负载,选择有状态副本集,点击创建
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
点击添加容器镜像
在这里插入图片描述
输入mysql:5.7,点击回车,等到搜索结果出来,点击使用默认端口
在这里插入图片描述

(3)、增加环境变量

勾选环境变量输入MYSQL_ROOT_PASSWORD,值为123456(此环境变量是给mysql设置登录密码);勾选时区,点击对号
在这里插入图片描述
点击下一步

在这里插入图片描述

(4)、添加存储卷模板,挂载mysql数据到nfs

点击添加存储卷模板
在这里插入图片描述
输入新建存储卷名称;存储类型选择nfs-storage(如果没有这个选项,参照第三节:安装nfs文件系统),访问模式选择单个节点读写;容量输入5;挂载路径选择读写,路径为/var/lib/mysql,点击对号

在这里插入图片描述
点击挂载配置文件或者秘钥
在这里插入图片描述
选择mysql-conf,选择只读,路径为:/etc/mysql/conf.d,点击对号,点击下一步,再点击下一步,点击创建
在这里插入图片描述
可以看到已经创建了一个部署mysql

在这里插入图片描述
点击容器组,点击mysql
在这里插入图片描述
点击事件,等待拉取镜像、容器创建并启动完成
在这里插入图片描述

4、创建服务,暴露mysql外网访问接口

点击服务,点击创建

在这里插入图片描述
选择指定工作负载
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
点击指定工作负载,选择有状态副本集,选择mysql,点击确定
在这里插入图片描述
端口号输入mysql默认端口号3306,点击下一步
在这里插入图片描述
勾选外网访问,访问方式选择NodePort,点击创建
在这里插入图片描述
可以看到暴露的端口号
在这里插入图片描述

5、测试mysql链接

此时用任意节点的外网IP加上刚才端口号即可连接mysql
在这里插入图片描述
7、mysql扩容缩容
扩容缩容,点击上下即可实现
在这里插入图片描述
扩容完成
在这里插入图片描述

五、安装集群指标监控组件Metrics(选做)

Metrics Server是k8s内置的集群范围资源使用情况的数据聚合器,为集群提供Node、Pods资源利用率指标等功能。
保存以下配置到metrics.yaml中

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --kubelet-insecure-tls
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/metrics-server:v0.4.3
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          periodSeconds: 10
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100
kubectl apply -f metrics.yaml
<think>好的,我现在需要回答用户关于在Kubernetes上部署前后端应用实现多部分数据同步的问题。首先,我得理清用户的需求。用户提到了“多部分的数据同步”,可能指的是不同组件或服务之间的数据同步,比如前端和后端之间,或者不同微服务之间的数据同步。同时,用户还提到了“最佳实践”,所以需要结合Kubernetes的特性给出推荐的方法。 首先,我应该回顾一下Kubernetes的基本资源类型,比如Deployment、Service、ConfigMap、Secret等,这些是部署应用的基础。然后,数据同步可能涉及数据库、消息队列、或者使用存储卷来持久化数据。另,多部分的数据同步可能需要考虑状态同步、事件驱动架构或者使用中间件如Redis、Kafka等。 接下来,我需要考虑如何将这些元素整合到Kubernetes的部署中。例如,前后端应用通常是无状态的,可以用Deployment来部署,通过Service暴露。对于数据同步,可能需要使用StatefulSet来管理有状态的应用,比如数据库。同时,数据同步可以通过应用层实现,比如使用消息队列进行事件通知,或者通过数据库的复制机制。 用户提到的引用中有关于使用StreamPark处理Paimon数据迁移作业的内,这可能涉及到数据集成和批处理任务。引用中还提到了CSI插件用于存储,这可能与持久化存储有关,确保数据在不同Pod之间同步时的一致性。 另,用户的问题可能还涉及到CI/CD流程中的版本控制和文档记录,这虽然与部署和数据同步直接关系不大,但也是整体最佳实践的一部分,需要考虑自动化部署和配置管理。 需要分步骤来组织回答:首先是前后端应用的部署,然后是数据同步的实现方式,最后是存储和网络的最佳实践。同时,要结合引用中的信息,比如使用PVC和CSI插件来管理存储,确保数据的安全性和持久性。 可能需要提到的点包括: 1. 使用Deployment和Service部署前后端应用,保证高可用和负载均衡。 2. 数据库使用StatefulSet结合持久化存储,确保数据持久化。 3. 数据同步机制,如消息队列(Kafka)、缓存(Redis)或数据库复制。 4. 配置管理使用ConfigMap和Secret,避免硬编码。 5. 网络策略和Ingress控制流量,确保前后端通信安全。 6. 监控和日志收集,使用Prometheus和ELK栈等工具。 7. 自动化部署和回滚策略,结合CI/CD流程。 需要验证这些方法是否符合Kubernetes的最佳实践,比如是否推荐使用特定存储类,或者是否有推荐的网络插件。同时,引用[2]提到设计K8s资源方案时要考虑集群规模、负载特性、可用性需求,所以可能需要建议根据应用的具体需求调整资源配置,比如资源限制和请求,以及水平扩的设置。 对于数据同步的具体实现,可能需要分情况讨论: - 如果是数据库之间的同步,可以使用主从复制或者使用工具如Debezium进行变更数据捕获(CDC)。 - 如果是应用层的数据同步,比如缓存更新,可以使用消息队列来传递事件,确保各服务间数据一致性。 - 文件存储的同步可以使用共享存储卷,如NFS或者云存储,通过CSI插件挂载到多个Pod中。 还需要注意数据一致性问题,不同的同步方式有不同的权衡。例如,异步消息队列可能提高性能但引入最终一致性,而同步数据库事务可能影响性能。需要根据应用场景选择合适的方法。 此,安全性方面,数据同步过程中需要考虑加密传输,如使用TLS证书,以及存储加密,可以通过Kubernetes的Secrets来管理敏感信息。 最后,需要总结这些实践,确保引用了用户提供的参考资料,特别是关于存储方案和CI/CD的部分,以增强回答的可信度。</think>### 在Kubernetes上部署前后端应用实现多部分数据同步的最佳实践 #### 一、前后端应用部署 1. **基础架构设计** - 使用 **Deployment** 部署无状态的前后端应用,通过`replicas`配置副本数实现高可用。 - 通过 **Service** 暴露服务:前端使用`ClusterIP`或`NodePort`,后端根据需求选择`ClusterIP`(内部通信)或`LoadBalancer`(部访问)。 - 示例后端Deployment配置片段: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: replicas: 3 template: spec: containers: - name: backend image: backend:latest envFrom: - configMapRef: name: backend-config ``` 2. **配置管理** - 使用 **ConfigMap** 存储环境变量(如API端点、功能开关)。 - 敏感信息(如数据库密码)通过 **Secret** 管理,避免硬编码[^3]。 3. **网络与流量控制** - 通过 **Ingress** 统一管理部流量,支持HTTPS和路由规则(如按路径分发到前端或后端)。 - 使用 **NetworkPolicy** 限制Pod间通信,增强安全性。 --- #### 二、多部分数据同步实现方式 1. **数据库层同步** - **有状态服务部署**:对MySQL、PostgreSQL等数据库使用 **StatefulSet**,配合持久化存储(如CSI插件挂载云盘或分布式存储)[^4]。 - **主从复制**:通过数据库内置的主从机制(如MySQL Binlog)实现读写分离和数据同步。 - **变更数据捕获(CDC)**:使用工具如 **Debezium** 监听数据库变更事件,推送至消息队列(如Kafka)供其他服务消费[^1]。 2. **应用层同步** - **消息队列(事件驱动)**: - 部署Kafka或RabbitMQ集群,后端服务将数据变更事件发布到队列。 - 其他服务订阅队列,实现异步数据同步(如更新缓存、通知前端)。 - 示例架构: $$ \text{后端服务} \xrightarrow{\text{事件}} \text{Kafka} \xrightarrow{\text{订阅}} \text{前端/其他服务} $$ - **缓存同步**: - 使用Redis作为集中式缓存,通过**读写穿透模式**保证数据一致性。 - 通过**哨兵模式**或**集群模式**实现缓存高可用。 3. **文件存储同步** - 使用**共享存储卷**(如NFS、CephFS)挂载到多个Pod,确保文件一致性。 - 通过CSI插件创建**ReadWriteMany**类型的PVC,支持多节点同时读写[^4]。 --- #### 三、最佳实践与优化 1. **存储方案** - **动态存储供给**:定义`StorageClass`自动创建PV,例如使用云厂商的CSI驱动(如AWS EBS、Azure Disk)。 - **数据备份**:定期快照PVC或使用Velero实现集群级备份。 2. **自动化与监控** - **CI/CD流水线**:通过GitOps工具(如Argo CD)实现自动部署,结合版本控制记录每次变更[^3]。 - **监控告警**:部署Prometheus收集指标(如Pod资源使用率、数据库连接数),Grafana可视化展示。 3. **跨区域同步(异地多活)** - **数据库跨集群复制**:使用云数据库的全球表功能(如AWS Aurora Global Database)。 - **服务多区域部署**:在多个K8s集群中部署应用,通过**服务网格(如Istio)**实现流量镜像和故障转移[^2]。 --- #### 四、安全与合规 - **数据传输加密**:服务间通信启用mTLS(如通过Istio自动管理证书)。 - **存储加密**:PVC启用加密卷(如AWS EBS加密或KMS集成)。 - **访问控制**:使用RBAC限制ServiceAccount权限,避免过度授权。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值