`
lykops
  • 浏览: 86327 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

Kubernetes服务之“运行单实例的有状态服务”,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

分享到:
评论

相关推荐

    kubernetes经典实例.zip

    《Kubernetes经典实例》这本书是Java开发者深入了解和学习Kubernetes平台的理想资料。Kubernetes,简称K8s,是Google开源的容器编排系统,已成为现代云原生应用部署的基石。它提供了一种自动化的方式来部署、扩展和...

    Kubernetes有状态集群服务部署与管理.pptx

    Kubernetes 的设计目标是使应用程序能够在不同的环境中运行,提供高可用性和可移植性,同时处理无状态和有状态服务。 在 Kubernetes 中,服务通常分为两类:无状态(Stateless)和有状态(Stateful)。无状态服务如...

    Kubernetes 有状态集群服务部署与管理39页.pdf

    有状态服务与无状态服务的区别在于,有状态服务需要维护状态信息,比如数据库、消息队列等,它们依赖于长时间运行并需要保存数据的实例。而无状态服务则是易于重启和替换的,例如Web服务器,它们不保存客户端状态,...

    Kubernetes容器云应用部署实例视频

    然后,通过使用kubeadm等工具,视频演示了如何初始化Kubernetes集群,配置主节点和从节点,并验证集群的运行状态。接下来,视频展示了如何使用kubectl命令创建一个Kubernetes部署,将WordPress应用和数据库(如MySQL...

    Kubernetes有状态集群服务部署与管理.rar

    本资料聚焦于Kubernetes中的有状态服务部署与管理,这对于运行需要持久化数据或依赖特定初始化顺序的应用至关重要。 一、有状态服务的概念 在Kubernetes中,服务分为两种类型:无状态服务(Stateless Services)和...

    Go-Agones是一个用于在Kubernetes上托管运行和扩展专用游戏服务器的库

    3. **Agones的架构**:Agones将游戏服务器视为Kubernetes中的Pod,每个Pod代表一个可独立运行的游戏实例。它提供了SDK(Software Development Kit),允许游戏服务器与Agones进行通信,进行生命周期管理,如启动、...

    Kubernetes的有状态服务实践.docx

    总之,理解并熟练运用Kubernetes的StatefulSet是确保有状态服务在云环境中高效、稳定运行的关键。通过合理的配置和最佳实践,可以充分利用StatefulSet的优势,为各种需要持久化数据的应用提供可靠的运行环境。

    kubernetes

    Kubernetes还提供了多种资源对象,如Namespace用于隔离资源,Service作为微服务间的抽象,Deployment用于声明性更新Pod和ReplicaSets,Secret用于管理敏感数据,StatefulSet用于部署和扩展有状态应用,DaemonSet确保...

    kubernetes官方文档中文版

    它主要管理的是无状态的应用程序和服务,但也可以支持有状态应用,比如数据库、缓存系统等。 ### Kubernetes概念和组件 #### 什么是Kubernetes? Kubernetes是一个自动部署、扩展和运行应用程序容器的开源系统。它...

    kubernetes指南.rar

    - **Pod**:Kubernetes的基本运行单元,可以包含一个或多个紧密关联的容器。 - **Service**:定义了一种方式来访问Pods,通过标签选择器动态地将流量路由到一组Pods。 - **Deployment**:用于声明式地更新应用,...

    kubernetes的资料笔记

    1. **Pod**:Kubernetes的基本运行单元,是部署和管理应用实例的容器化封装。每个Pod包含一个或多个紧密相关的容器,它们共享存储和网络资源。 2. **Service**:定义了访问Pods的方式,提供负载均衡和持久性IP,...

    Spring Cloud Kubernetes文档.pdf

    Spring Cloud Kubernetes支持Kubernetes的原生服务发现机制,即通过Kubernetes API来获取服务列表和实例信息,避免了额外的服务注册中心。 **5. Kubernetes PropertySource实现** Spring Cloud Kubernetes提供了两...

    grafana kubernetes json模板

    每个节点上运行一个Kubelet服务,用于管理和报告节点上的Pods和容器状态。Grafana模板中会包含对节点资源利用率、负载、磁盘空间等的监控。 “POD”是Kubernetes的基本运行单元,它封装了一个或多个容器,并提供...

    Kubernetes安装.docx

    * StatefulSet:提供有状态服务管理 * Job:提供批处理任务管理 * CronJob:提供定时任务管理 Kubernetes的安装过程包括: * 准备环境 * 安装Docker * 安装Kubernetes组件 * 配置Kubernetes集群 * 部署应用程序 ...

    Kubernetes in Action中英文

    在《Kubernetes in Action》这本书中,作者详细讲解了Kubernetes的基础概念,包括Pod(最小部署单元)、Service(服务发现和负载均衡)、Deployment(应用的声明式更新)、StatefulSet(有状态应用的管理)等核心...

    ppt what is kubernetes

    - Kubernetes 可以作为一种服务提供给用户,让用户能够在其之上构建和运行容器化应用。 **5. 自动化管理平台** - Kubernetes 支持自动化的部署、扩展以及滚动更新等功能。 **6. 服务即平台 (SaaP)** - 通过 ...

    Kubernetes入门.pdf

    工作节点是运行容器化应用实例的地方,每个节点上都运行着一个或多个Pod,Pod是Kubernetes中的最小部署单元,可以包含一个或多个容器。节点上还运行着一个名为kubelet的代理,负责与API服务器通信并管理节点上的Pod...

    Kubernetes存储系统介绍及机制实现

    通过结合使用`InitContainer`来进行集群初始化、`HeadlessService`来维持集群成员的稳定关系、动态存储供给来方便集群的扩展以及`StatefulSet`进行整体管理,可以有效地支持有状态集群服务的高效运行。 #### 二、...

    kubernetes.pdf

    6. **状态集 (StatefulSets)**:为有状态的应用程序提供服务,如数据库集群等。 #### 三、Kubernetes 架构 Kubernetes 采用 Master-Worker 架构: - **Master 节点**:负责集群管理,包括 API Server、Scheduler...

Global site tag (gtag.js) - Google Analytics