zoukankan      html  css  js  c++  java
  • Kubernetes服务之“运行单实例的有状态服务”

    目标

      在你的环境中创建一个PV
      创建一个MySQl的Deployment
      在集群中以DNS名称的方式,将MySQL暴露给其他的pod

    开始之前

      你需要一个Kubernetes集群,一个可以连接到集群的kubectl命令行工具。如果你没有集群,你可以使用Minikube来创建。
      我们会创建一个PV(PersistentVolume)用于数据存储。点击这里来查看PV支持的类型,该指导会使用GCEPersistentDisk来演示,但其实任何的PV类型都可以正常工作。GCEPersistentDisk只能在Google Compute Engine(GCE)上工作。

    在你的环境中创建磁盘

      在Google Compute Engine,运行:

    gcloud compute disks create --size=20GB mysql-disk
    

      然后创建一个PV,指向刚刚创建的mysql-disk。下面是一个创建PV的配置文件,指向上面提到的GCE磁盘:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql-pv
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      gcePersistentDisk:
        pdName: mysql-disk
        fsType: ext4
    

      注意pdName: mysql-disk这一行匹配上面GCE环境创建磁盘的名称。如果要在其他环境中创建PV,可以查看Persistent Volumes来获取详细信息。
      创建PV:

    kubectl create -f https://k8s.io/docs/tasks/run-application/gce-volume.yaml
    

    部署MySQL

      你可以通过Kubernetes Deployment的方式来创建一个有状态服务,然后使用PVC(PersistentVolumeClaim)来连接已经存在的PV。比如,下面的YAML文件描述了一个运行MySQL并使用PVC的Deployment。文件定义了一个mount到/var/lib/mysql的卷,并创建了一个需要20G卷大小的PVC。
      注意:密码定义在YAML配置文件中,这是不安全的。查看Kubernetes Secrets获取更安全的方案。

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
        - port: 3306
      selector:
        app: mysql
      clusterIP: None
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: mysql
    spec:
      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
    

      1. 部署YAML文件中的内容。

    kubectl create -f https://k8s.io/docs/tasks/run-application/mysql-deployment.yaml
    

      2. 显示Deployment的信息。

    kubectl describe deployment mysql
    
     Name:                 mysql
     Namespace:            default
     CreationTimestamp:    Tue, 01 Nov 2016 11:18:45 -0700
     Labels:               app=mysql
     Selector:             app=mysql
     Replicas:             1 updated | 1 total | 0 available | 1 unavailable
     StrategyType:         Recreate
     MinReadySeconds:      0
     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
    

      3. 显示Deployment创建的pod。

    kubectl get pods -l app=mysql
    
     NAME                   READY     STATUS    RESTARTS   AGE
     mysql-63082529-2z3ki   1/1       Running   0          3m
    

      4. 检查PV。

     kubectl describe pv mysql-pv
    
     Name:            mysql-pv
     Labels:          <none>
     Status:          Bound
     Claim:           default/mysql-pv-claim
     Reclaim Policy:  Retain
     Access Modes:    RWO
     Capacity:        20Gi
     Message:    
     Source:
         Type:        GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)
         PDName:      mysql-disk
         FSType:      ext4
         Partition:   0
         ReadOnly:    false
     No events.
    

      5. 检查PVC。

     kubectl describe pvc mysql-pv-claim
    
     Name:         mysql-pv-claim
     Namespace:    default
     Status:       Bound
     Volume:       mysql-pv
     Labels:       <none>
     Capacity:     20Gi
     Access Modes: RWO
     No events.
    

    访问MySQL实例

      前面的YAML文件创建了一个服务,允许集群的其他Pod可以访问数据库。服务选项clusterIP:None使得服务的DNS名直接解析为Pod的IP地址。当你的服务只有一个Pod,并且你不打算增加Pod的数量时,这是一种最佳的使用方式。
      运行一个Mysql客户端来连接Mysql服务:

    kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h <pod-ip> -ppassword
    

      上面的命令在集群中创建了一个新的Pod,该Pod运行了一个mysql客户端,连接着上面服务的Mysql Server。如果它连接成功,也就说明了这个有状态的MySQL数据库成功启动和运行了。

    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> 
    

    更新

      更新Deployment的镜像或者其他部分,同样可以照例使用kubectl apply命令来完成。以下是使用有状态应用时需要注意的地方:

    •   不要扩容该应用。该应用只针对单例应用。下面的PV只能映射给一个Pod。对于集群的有状态应用,请查看StatefulSet文档
    •   在Deployment的YAML配置文档中使用strategy: type: Recreate。它会告诉Kubernetes不要使用rolling update。因为Rolling update不会工作,因此不会有多个Pod同时运行。策略Recreate会在使用更新配置创建一个新的Pod时删除之前的Pod。

    删除Deployment

      通过名称来删除Deployment对象:

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

      另外,如果你使用的是GCE disk,还需要删除对应的disk:

    gcloud compute disks delete mysql-disk
    
  • 相关阅读:
    C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件
    C# Winform ListView控件
    MongoDB3.6.3 windows安装配置、启动
    史蒂夫•乔布斯在斯坦福大学的演讲
    SpringBoot配置文件 application.properties详解
    Elasticsearch分布式安装启动失败
    Couldn't connect to host, port: smtp.163.com, 25; timeout -1;
    CentOS 7 安装jdk9
    生成唯一的随机数(时间+随机数)
    idea 设置背景图片
  • 原文地址:https://www.cnblogs.com/styshoo/p/7148662.html
Copyright © 2011-2022 走看看