Kubernetes服务之“运行单实例的有状态服务”
2017-08-04 00:00
483 查看
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[/code]
部署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[/code] 2. 显示Deployment的信息。kubectl describe deployment mysql Name: mysql Namespace: default CreationTi 3ff0 mestamp: 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服务之“运行单实例的有状态服务”
- Kubernetes服务之“运行单实例的有状态服务”
- Kubernetes服务之“运行单实例的有状态服务”
- Kubernetes服务之“运行单实例的有状态服务”
- 利用 istio 来对运行在 Kubernetes 上的微服务进行管理
- linux -查看当前服务运行状态
- 解决:无法终止无法挂起BizTalk正在运行的服务实例的问题
- android判断服务是否是运行状态
- kubernetes要实现的目标——随机关掉一台机器,看你的服务能否正常;减少的应用实例能否自动迁移并恢复到其他节点;服务能否随着流量进行自动伸缩
- 实例脚本,判断是否加入开机自启动,服务状态、脚本规范
- 使用 Docker 和 Kubernetes 将 MongoDB 作为微服务运行
- 除非Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站
- StatefulSet: Kubernetes 中对有状态应用的运行和伸缩
- 如何让服务只运行单个实例
- C#开发Windows服务实例之实现禁止QQ运行
- android判断服务是否是运行状态
- 服务 {49A27252-A326-4EF1-B698-6EBC7068833C} 的计时器作业 id {573BE459-DF82-481C-84BD-CA14D287450B} 配置刷新的上一个实例仍在运行,因此将跳过当前的实例。请考虑增加作业之间的时间间隔。
- 实例脚本,判断是否加入开机自启动,服务状态、脚本规范
- 微软公众云服务运行状态监控
- memcached运行多个实例服务