您的位置:首页 > 其它

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

2017-07-13 15:51 537 查看

目标

  在你的环境中创建一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息