zoukankan      html  css  js  c++  java
  • 在kubernetes中运行单节点有状态MySQL应用

    Deploy MySQL

    https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

    You can run a stateful application by creating a Kubernetes Deployment and connecting it to an existing PersistentVolume using a PersistentVolumeClaim. For example, this YAML file describes a Deployment that runs MySQL and references the PersistentVolumeClaim. The file defines a volume mount for /var/lib/mysql, and then creates a PersistentVolumeClaim that looks for a 20G volume. This claim is satisfied by any existing volume that meets the requirements, or by a dynamic provisioner.

    Note: The password is defined in the config yaml, and this is insecure. See Kubernetes Secrets for a secure solution.

    application/mysql/mysql-deployment.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
      - port: 3306
      selector:
        app: mysql
      clusterIP: None
    ---
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    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:
              # Use secret in real usage
            - 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
    
    application/mysql/mysql-pv.yaml 
    kind: PersistentVolume
    apiVersion: v1
    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
    
    • 现成的kubernetes集群
    • 持久存储-PersistentVolume
    • 持久存储容量声明-PersistentVolumeClaim

    k8s不会真正检查存储的访问模式或根据访问模式做访问限制,只是对真实存储的描述,最终的控制权在真实的存储端。目前支持三种访问模式:

    • ReadWriteOnce – PV以read-write 挂载到一个节点
    • ReadWriteMany – PV以read-write 方式挂载到多个节点
    • ReadOnlyMany – PV以read-only 方式挂载到多个节点
    1. Deploy the PV and PVC of the YAML file:

      kubectl create -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
      
    2. Deploy the contents of the YAML file:

      kubectl create -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
      
    3. Display information about the Deployment:

      kubectl describe deployment mysql
      
      Name:                 mysql
      Namespace:            default
      CreationTimestamp:    Tue, 01 Nov 2016 11:18:45 -0700
      Labels:               app=mysql
      Annotations:          deployment.kubernetes.io/revision=1
      Selector:             app=mysql
      Replicas:             1 desired | 1 updated | 1 total | 0 available | 1 unavailable
      StrategyType:         Recreate
      MinReadySeconds:      0
      Pod Template:
        Labels:       app=mysql
        Containers:
         mysql:
          Image:      mysql:5.6
          Port:       3306/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     False   MinimumReplicasUnavailable
        Progressing   True    ReplicaSetUpdated
      OldReplicaSets:       <none>
      NewReplicaSet:        mysql-63082529 (1/1 replicas created)
      Events:
        FirstSeen    LastSeen    Count    From                SubobjectPath    Type        Reason            Message
        ---------    --------    -----    ----                -------------    --------    ------            -------
        33s          33s         1        {deployment-controller }             Normal      ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
      
    4. List the pods created by the Deployment:

      kubectl get pods -l app=mysql
      
      NAME                   READY     STATUS    RESTARTS   AGE
      mysql-63082529-2z3ki   1/1       Running   0          3m
      
    5. Inspect the PersistentVolumeClaim:

      kubectl describe pvc mysql-pv-claim
      
      Name:         mysql-pv-claim
      Namespace:    default
      StorageClass:
      Status:       Bound
      Volume:       mysql-pv-volume
      Labels:       <none>
      Annotations:    pv.kubernetes.io/bind-completed=yes
                      pv.kubernetes.io/bound-by-controller=yes
      Capacity:     20Gi
      Access Modes: RWO
      Events:       <none>
      

    Accessing the MySQL instance

    The preceding YAML file creates a service that allows other Pods in the cluster to access the database. The Service option clusterIP: None lets the Service DNS name resolve directly to the Pod’s IP address. This is optimal when you have only one Pod behind a Service and you don’t intend to increase the number of Pods.

    Run a MySQL client to connect to the server:

    kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
    

    This command creates a new Pod in the cluster running a MySQL client and connects it to the server through the Service. If it connects, you know your stateful MySQL database is up and running.

    Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
    If you don't see a command prompt, try pressing enter.
    
    mysql>
    

    Updating

    The image or any other part of the Deployment can be updated as usual with the kubectl apply command. Here are some precautions that are specific to stateful apps:

    • Don’t scale the app. This setup is for single-instance apps only. The underlying PersistentVolume can only be mounted to one Pod. For clustered stateful apps, see the StatefulSet documentation.
    • Use strategy: type: Recreate in the Deployment configuration YAML file. This instructs Kubernetes to not use rolling updates. Rolling updates will not work, as you cannot have more than one Pod running at a time. The Recreate strategy will stop the first pod before creating a new one with the updated configuration.

    Deleting a deployment

    Delete the deployed objects by name:

    kubectl delete deployment,svc mysql
    kubectl delete pvc mysql-pv-claim
    kubectl delete pv mysql-pv-volume
    

    If you manually provisioned a PersistentVolume, you also need to manually delete it, as well as release the underlying resource. If you used a dynamic provisioner, it automatically deletes the PersistentVolume when it sees that you deleted the PersistentVolumeClaim. Some dynamic provisioners (such as those for EBS and PD) also release the underlying resource upon deleting the PersistentVolume.

    What's next

  • 相关阅读:
    Qt 学习之路:Canvas
    Qt 学习之路:模型-视图高级技术
    Qt 学习之路 :视图代理
    Qt 学习之路 :动态视图
    Qt 学习之路 :Repeater
    Qt 学习之路 :Qt Quick Controls
    mysql-gdb--oracle
    redis-BOOK
    2016qconbeijing
    LINUX 内核月报 taobao
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10069989.html
Copyright © 2011-2022 走看看