Kubernetes中如何实现运行单实例的有状态服务

75次阅读
没有评论

共计 4137 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 Kubernetes 中如何实现运行单实例的有状态服务,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

目标

在你的环境中创建一个 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 中如何实现运行单实例的有状态服务”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计4137字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)