目标
在你的环境中创建一个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对象:
另外,如果你使用的是GCE disk,还需要删除对应的disk:kubectl delete deployment,svc mysql kubectl delete pvc mysql-pv-claim kubectl delete pv mysql-pv
gcloud compute disks delete mysql-disk
相关推荐
《Kubernetes经典实例》这本书是Java开发者深入了解和学习Kubernetes平台的理想资料。Kubernetes,简称K8s,是Google开源的容器编排系统,已成为现代云原生应用部署的基石。它提供了一种自动化的方式来部署、扩展和...
Kubernetes 的设计目标是使应用程序能够在不同的环境中运行,提供高可用性和可移植性,同时处理无状态和有状态服务。 在 Kubernetes 中,服务通常分为两类:无状态(Stateless)和有状态(Stateful)。无状态服务如...
有状态服务与无状态服务的区别在于,有状态服务需要维护状态信息,比如数据库、消息队列等,它们依赖于长时间运行并需要保存数据的实例。而无状态服务则是易于重启和替换的,例如Web服务器,它们不保存客户端状态,...
然后,通过使用kubeadm等工具,视频演示了如何初始化Kubernetes集群,配置主节点和从节点,并验证集群的运行状态。接下来,视频展示了如何使用kubectl命令创建一个Kubernetes部署,将WordPress应用和数据库(如MySQL...
本资料聚焦于Kubernetes中的有状态服务部署与管理,这对于运行需要持久化数据或依赖特定初始化顺序的应用至关重要。 一、有状态服务的概念 在Kubernetes中,服务分为两种类型:无状态服务(Stateless Services)和...
3. **Agones的架构**:Agones将游戏服务器视为Kubernetes中的Pod,每个Pod代表一个可独立运行的游戏实例。它提供了SDK(Software Development Kit),允许游戏服务器与Agones进行通信,进行生命周期管理,如启动、...
总之,理解并熟练运用Kubernetes的StatefulSet是确保有状态服务在云环境中高效、稳定运行的关键。通过合理的配置和最佳实践,可以充分利用StatefulSet的优势,为各种需要持久化数据的应用提供可靠的运行环境。
Kubernetes还提供了多种资源对象,如Namespace用于隔离资源,Service作为微服务间的抽象,Deployment用于声明性更新Pod和ReplicaSets,Secret用于管理敏感数据,StatefulSet用于部署和扩展有状态应用,DaemonSet确保...
它主要管理的是无状态的应用程序和服务,但也可以支持有状态应用,比如数据库、缓存系统等。 ### Kubernetes概念和组件 #### 什么是Kubernetes? Kubernetes是一个自动部署、扩展和运行应用程序容器的开源系统。它...
- **Pod**:Kubernetes的基本运行单元,可以包含一个或多个紧密关联的容器。 - **Service**:定义了一种方式来访问Pods,通过标签选择器动态地将流量路由到一组Pods。 - **Deployment**:用于声明式地更新应用,...
1. **Pod**:Kubernetes的基本运行单元,是部署和管理应用实例的容器化封装。每个Pod包含一个或多个紧密相关的容器,它们共享存储和网络资源。 2. **Service**:定义了访问Pods的方式,提供负载均衡和持久性IP,...
Spring Cloud Kubernetes支持Kubernetes的原生服务发现机制,即通过Kubernetes API来获取服务列表和实例信息,避免了额外的服务注册中心。 **5. Kubernetes PropertySource实现** Spring Cloud Kubernetes提供了两...
每个节点上运行一个Kubelet服务,用于管理和报告节点上的Pods和容器状态。Grafana模板中会包含对节点资源利用率、负载、磁盘空间等的监控。 “POD”是Kubernetes的基本运行单元,它封装了一个或多个容器,并提供...
* StatefulSet:提供有状态服务管理 * Job:提供批处理任务管理 * CronJob:提供定时任务管理 Kubernetes的安装过程包括: * 准备环境 * 安装Docker * 安装Kubernetes组件 * 配置Kubernetes集群 * 部署应用程序 ...
在《Kubernetes in Action》这本书中,作者详细讲解了Kubernetes的基础概念,包括Pod(最小部署单元)、Service(服务发现和负载均衡)、Deployment(应用的声明式更新)、StatefulSet(有状态应用的管理)等核心...
- Kubernetes 可以作为一种服务提供给用户,让用户能够在其之上构建和运行容器化应用。 **5. 自动化管理平台** - Kubernetes 支持自动化的部署、扩展以及滚动更新等功能。 **6. 服务即平台 (SaaP)** - 通过 ...
工作节点是运行容器化应用实例的地方,每个节点上都运行着一个或多个Pod,Pod是Kubernetes中的最小部署单元,可以包含一个或多个容器。节点上还运行着一个名为kubelet的代理,负责与API服务器通信并管理节点上的Pod...
通过结合使用`InitContainer`来进行集群初始化、`HeadlessService`来维持集群成员的稳定关系、动态存储供给来方便集群的扩展以及`StatefulSet`进行整体管理,可以有效地支持有状态集群服务的高效运行。 #### 二、...
6. **状态集 (StatefulSets)**:为有状态的应用程序提供服务,如数据库集群等。 #### 三、Kubernetes 架构 Kubernetes 采用 Master-Worker 架构: - **Master 节点**:负责集群管理,包括 API Server、Scheduler...