Kubernetes服务之“运行单实例的有状态服务”
发布日期:2025-04-03 13:20:49 浏览次数:11 分类:精选文章

本文共 2988 字,大约阅读时间需要 9 分钟。

Kubernetes服务之“运行单实例的有状态服务”

Target:

  • 在环境中创建一个Persistent Volume (PV)
  • 创建一个MySQL的Deployment
  • 以DNS名称的方式,将MySQL服务暴露给集群中的其它Pod
  • Before you begin:

    • 您需要一个Kubernetes集群,并安装了kubectl命令行工具。如果您没有集群,您可以使用Minikube创建。
    • 我们将使用一个Persistent Volume(PV)来存储数据。以下步骤将使用Google Compute Engine 的GCEPersistentDisk示例,但其他类型的PV也都可以正常工作。

    Creating the Disk:

  • 在Google Compute Engine执行以下命令创建一个20GB的磁盘:
    gcloud compute disks create --size=20GB mysql-disk
  • 配置一个Persistent Volume(PV),它将引用刚刚创建的mysql-disk:
    apiVersion: v1kind: PersistentVolumemetadata:  name: mysql-pvspec:  capacity:    storage: 20Gi  accessModes:    - ReadWriteOnce  gcePersistentDisk:    pdName: mysql-disk    fsType: ext4
  • 创建PV:
    kubectl create -f https://k8s.io/docs/tasks/run-application/gce-volume.yaml
  • Deploying MySQL:

  • 使用Kubernetes Deployment配置文件配置一个有状态服务,并使用Persistent Volume Claim(PVC)连接已经存在的PV。以下配置文件定义了一个将PV挂载到/var/lib/mysql的MySQL数据库,并创建了一个20GB的PVC:
    apiVersion: v1kind: Servicemetadata:  name: mysqlspec:  ports:    - port: 3306  selector:    app: mysql  clusterIP: None---apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: mysql-pv-claimspec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 20Gi---apiVersion: apps/v1beta1kind: Deploymentmetadata:  name: mysqlspec:  strategy:    type: Recreate  template:    metadata:      labels:        app: mysql    spec:      containers:        - image: mysql:5.6          name: mysql          env:            - name: MYSQL_ROOT_PASSWORD              value: password          ports:            - containerPort: 3306              name: mysql          volumeMounts:            - name: mysql-persistent-storage              mountPath: /var/lib/mysql      volumes:        - name: mysql-persistent-storage          persistentVolumeClaim:            claimName: mysql-pv-claim
  • 将上述YAML文件应用到Kubernetes集群中:
    kubectl create -f https://k8s.io/docs/tasks/run-application/mysql-deployment.yaml
  • 查看Deployment的详细信息:
    kubectl describe deployment mysql
  • 查看创建的Pod:
    kubectl get pods -l app=mysql
  • 查看PV和PVC的状态:
    kubectl describe pv mysql-pvkubectl describe pvc mysql-pv-claim
  • Accessing the MySQL Instance:

  • 服务配置允许集群中的其他Pod访问数据库。服务选项clusterIP: None使得服务的DNS名称直接解析为Pod的IP地址。由于我们只运行一个Pod,并且不会增加Pod的数量,这是一种最佳的配置方式。2.运行一个MySQL客户端连接到MySQL服务:
    kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h 
    -p

    如果连接成功,这就意味着有状态的MySQL数据库已成功启动和运行。

  • Updating the Deployment:

  • 如需更新Deployment的镜像或其他部分,可以使用kubectl apply命令进行操作:
    kubectl apply -f https://k8s.io/docs/tasks/run-application/mysql-deployment.yaml
  • 注意事项:
    • 不进行扩展:这只适用于单实例应用。上述PV只能映射到一个Pod。对于有状态的集群应用,请使用StatefulSet。
    • 使用策略type: Recreate:在Deployment YAML配置中使用该策略。它告诉Kubernetes不要使用滚动更新。由于滚动更新在这里不会工作,所以不会有多个Pod同时运行。策略Recreate会在使用新的配置创建一个新的Pod时删除之前的Pod。
  • Deleting the Deployment:

  • 删除 Deployment 和 Service:
    kubectl delete deployment,svc mysql
  • 删除 PVC 和 PV:
    kubectl delete pvc mysql-pv-claimkubectl delete pv mysql-pv
  • 如果是使用Google Compute Engine 的磁盘,还需要删除磁盘:
    gcloud compute disks delete mysql-disk
  • 以上步骤涵盖了从创建PV到部署MySQL服务,再到访问和管理的全过程。通过这些步骤,您可以在Kubernetes集群中成功运行一个有状态的单实例MySQL服务。

    上一篇:Kubernetes服务发现ingress详解
    下一篇:Kubernetes数据存储机制详解

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月13日 08时11分14秒