在你的环境中创建一个 PV
创建一个 MySQl 的 Deployment
在集群中以 DNS 名称的方式,将 MySQL 暴露给其他的 pod
你需要一个 Kubernetes 集群,一个可以连接到集群的 kubectl 命令行工具。如果你没有集群,你可以使用 Minikube 来创建。
我们会创建一个 PV(PersistentVolume)用于数据存储。点击这里来查看 PV 支持的类型,该指导会使用
来演示,但其实任何的 PV 类型都可以正常工作。
- GCEPersistentDisk
只能在 Google Compute Engine(GCE)上工作。
- GCEPersistentDisk
在 Google Compute Engine,运行:
- gcloud compute disks create--size = 20GB mysql - disk
然后创建一个 PV,指向刚刚创建的
。下面是一个创建 PV 的配置文件,指向上面提到的 GCE 磁盘:
- mysql-disk
- apiVersion: v1 kind: PersistentVolume metadata: name: mysql - pv spec: capacity: storage: 20Gi accessModes: -ReadWriteOnce gcePersistentDisk: pdName: mysql - disk fsType: ext4
注意
这一行匹配上面 GCE 环境创建磁盘的名称。如果要在其他环境中创建 PV,可以查看 Persistent Volumes 来获取详细信息。
- pdName: mysql-disk
- kubectl create - f https: //k8s.io/docs/tasks/run-application/gce-volume.yaml
你可以通过 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.
前面的 YAML 文件创建了一个服务,允许集群的其他 Pod 可以访问数据库。服务选项
使得服务的 DNS 名直接解析为 Pod 的 IP 地址。当你的服务只有一个 Pod,并且你不打算增加 Pod 的数量时,这是一种最佳的使用方式。 运行一个 Mysql 客户端来连接 Mysql 服务:
- clusterIP:None
- 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
。它会告诉 Kubernetes 不要使用 rolling update。因为 Rolling update 不会工作,因此不会有多个 Pod 同时运行。策略
- strategy: type: Recreate
会在使用更新配置创建一个新的 Pod 时删除之前的 Pod。
- Recreate
另外,如果你使用的是 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
来源: http://www.cnblogs.com/styshoo/p/7148662.html