• Kubernetes---运行一个单实例有状态应用


    Kubernetes—运行一个单实例有状态应用


    一、部署 MySQL

    你可以通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到 某已有的 PV 卷来运行一个有状态的应用。 例如,这里的 YAML 描述的是一个运行 MySQL 的 Deployment,其中引用了 PVC 申领。 文件为 /var/lib/mysql 定义了加载卷,并创建了一个 PVC 申领,寻找一个 20G 大小的卷。 该申领可以通过现有的满足需求的卷来满足,也可以通过动态供应卷的机制来满足。

    [root@master k8s]# cat mysql-deployment.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
      - port: 3306
      selector:
        app: mysql
      clusterIP: None
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - image: mysql:5.6
            name: mysql
            env:
              #在实际中使用 secret
            - 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    [root@master k8s]# cat mysql-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql-pv-volume
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/data"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    部署 YAML 文件中定义的 PV 和 PVC:

    [root@master k8s]# kubectl apply -f mysql-pv.yaml
    persistentvolume/mysql-pv-volume created
    persistentvolumeclaim/mysql-pv-claim created
    
    • 1
    • 2
    • 3

    部署 YAML 文件中定义的 Deployment:

    [root@master k8s]# kubectl apply -f mysql-deployment.yaml
    service/mysql created
    deployment.apps/mysql created
    
    • 1
    • 2
    • 3

    展示 Deployment 相关信息:

    [root@master k8s]# kubectl describe deployment mysql
    Name:               mysql
    Namespace:          default
    CreationTimestamp:  Wed, 24 Aug 2022 16:45:44 +0800
    Labels:             <none>
    Annotations:        deployment.kubernetes.io/revision: 1
    Selector:           app=mysql
    Replicas:           1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:       Recreate
    MinReadySeconds:    0
    Pod Template:
      Labels:  app=mysql
      Containers:
       mysql:
        Image:      mysql:5.6
        Port:       3306/TCP
        Host Port:  0/TCP
        Environment:
          MYSQL_ROOT_PASSWORD:  password
        Mounts:
          /var/lib/mysql from mysql-persistent-storage (rw)
      Volumes:
       mysql-persistent-storage:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  mysql-pv-claim
        ReadOnly:   false
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   mysql-6879db89b4 (1/1 replicas created)
    Events:
      Type    Reason             Age    From                   Message
      ----    ------             ----   ----                   -------
      Normal  ScalingReplicaSet  2m54s  deployment-controller  Scaled up replica set mysql-6879db89b4 to 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    列举出 Deployment 创建的 pods:

    [root@master k8s]# kubectl get pods -l app=mysql
    NAME                     READY   STATUS    RESTARTS   AGE
    mysql-6879db89b4-xtxpz   1/1     Running   0          3m38s
    
    • 1
    • 2
    • 3

    查看 PersistentVolumeClaim:

    [root@master k8s]# kubectl describe pvc mysql-pv-claim
    Name:          mysql-pv-claim
    Namespace:     default
    StorageClass:  manual
    Status:        Bound
    Volume:        mysql-pv-volume
    Labels:        <none>
    Annotations:   pv.kubernetes.io/bind-completed: yes
                   pv.kubernetes.io/bound-by-controller: yes
    Finalizers:    [kubernetes.io/pvc-protection]
    Capacity:      20Gi
    Access Modes:  RWO
    VolumeMode:    Filesystem
    Used By:       mysql-6879db89b4-xtxpz
    Events:
      Type     Reason              Age    From                         Message
      ----     ------              ----   ----                         -------
      Warning  ProvisioningFailed  4m48s  persistentvolume-controller  storageclass.storage.k8s.io "manual" not found
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    二、访问 MySQL 实例

    前面 YAML 文件中创建了一个允许集群内其他 Pod 访问的数据库服务。该服务中选项 clusterIP: None 让服务 DNS 名称直接解析为 Pod 的 IP 地址。 当在一个服务下只有一个 Pod 并且不打算增加 Pod 的数量这是最好的.

    运行 MySQL 客户端以连接到服务器:

    [root@master k8s]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
    If you don't see a command prompt, try pressing enter.
    
    mysql>
    
    • 1
    • 2
    • 3
    • 4

    此命令在集群内创建一个新的 Pod 并运行 MySQL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MySQL 数据库正处于运行状态。

    三、更新

    Deployment 中镜像或其他部分同往常一样可以通过 kubectl apply 命令更新。 以下是特定于有状态应用的一些注意事项:

    不要对应用进行规模扩缩。这里的设置仅适用于单实例应用。下层的 PersistentVolume 仅只能挂载到一个 Pod 上。对于集群级有状态应用,请参考 StatefulSet 文档.
    在 Deployment 的 YAML 文件中使用 strategy: type: Recreate。 该选项指示 Kubernetes 不 使用滚动升级。滚动升级无法工作,因为这里一次不能 运行多个 Pod。在使用更新的配置文件创建新的 Pod 前,Recreate 策略将 保证先停止第一个 Pod。

    四、删除 Deployment

    通过名称删除部署的对象:

    [root@master k8s]# kubectl delete pvc mysql-pv-claim
    persistentvolumeclaim "mysql-pv-claim" deleted
    [root@master k8s]# kubectl delete pv mysql-pv-volume
    persistentvolume "mysql-pv-volume" deleted
    [root@master k8s]# kubectl get pods -l app=mysql
    No resources found in default namespace.
    # 删除成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

  • 相关阅读:
    C#实现Windows服务安装卸载开启停止
    【矩阵论】2. 矩阵分解——高低分解
    Github 2024-07-11 开源项目日报 Top10
    【生日快乐】SpringBoot SpringBoot 基础篇(第一篇) 第4章 SpringBoot 综合案例 4.7 修改客户功能
    【面试分享】Java 面试题(Spring Boot / Spring Cloud)
    静态库与动态库笔记
    基于C#+MySQL的“零售店”商品销售与管理系统
    python开发环境安装问题集合
    计算机视觉基础(9)——相机标定与对极几何
    2020南京icpc M 树形背包
  • 原文地址:https://blog.csdn.net/AnNan1997/article/details/126507744