K8S 有状态的应用和示例 1
本示例演示了在 Kubernetes 上安装 WordPress 和 MySQL,这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。
PersistentVolume(PV)是一块集群里由管理员手动提供,或 kubernetes 通过 StorageClass 动态创建的存储。 PersistentVolumeClaim(PVC)是一个满足对 PV 存储需要的请求。PersistentVolumes 和 PersistentVolumeClaims 独立于 Pod 生命周期,在 Pod 重启、重新调度或删除过程中均能保存数据。
⚠️
本示例中使用的是单实例 WordPress 和 MySQL Pods,故而不适用于生产环境。
💁♂️
本教程中提供的文件使用 GA Deployment API,并且特定于 kubernetes 1.9 或更高版本。如果您希望将本教程与 Kubernetes 的早期版本一起使用,请相应地更新 API 版本,或参考本教程的早期版本。
一、教程目标
- 创建 PersistentVolumeClaims 和 PersistentVolumes
- 创建
kustomization.yaml
使用- Secret 生成器
- MySQL 资源配置
- WordPress 资源配置
- 应用整个 kustomization 目录
kubectl apply -k ./
- 清除示例
二、准备开始
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。
如果你还没有集群,参考 用 kubeadm 在 Debian 或 Ubuntu 中创建 k8s 集群。
三、教程开始
1 创建 PersistentVolumeClaims 和 PersistentVolumes
MySQL 和 Wordpress 都需要一个 PersistentVolume 来存储数据。他们的 PersistentVolumeClaims 将在部署步骤中创建。
许多集群环境都安装了默认的 StorageClass。如果在 PersistentVolumeClaim 中未指定 StorageClass,则使用集群的默认 StorageClass。
创建 PersistentVolumeClaim 时,将根据 StorageClass 配置动态设置 PersistentVolume。
⚠️
在本地群集中,默认的 StorageClass 使用
hostPath
供应器。hostPath
卷仅适用于开发和测试。使用hostPath
卷,您的数据位于 Pod 调度到的节点上的/tmp
中,并且不会在节点之间移动。如果 Pod 死亡并被调度到集群中的另一个节点,或者该节点重新启动,则数据将丢失。
💁♂️
如果要建立需要使用
hostPath
设置程序的集群,则必须在 controller-manager 组件中设置--enable-hostpath-provisioner
标志。
因为使用 StorageClass 必须要有一个存储后端服务器,通常在云服务商中使用 Kubernetes 集群时会提供,本地环境下想要使用,还需在本地自行创建一个存储服务器或虚拟机。
这不是本教程的重点,所以本教程使用手动创建的 PersistentVolume。
后面在创建 PVC 时,mysql 和 wordpress 都会申请一个 5G 的空间,此处将每个 PV 的空间设置为 5 G:
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-mysql-pv-volume-1
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
将上述两个配置文件补充到 kustomization.yaml
:
cat <<EOF >>./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
4 应用和验证
kustomization.yaml
包含用于部署 WordPress 网站的所有资源以及 MySQL 数据库。您可以通过以下方式应用目录:
kubectl apply -k ./
4.1 验证
-
通过运行以下命令验证 Secret 是否存在
kubectl get secrets
结果:
NAME TYPE DATA AGE mysql-pass-kkcc2b926b Opaque 1 9s
-
验证是否已动态配置 PersistentVolume
kubectl get pvc
使用 StoreClass 动态创建 PV 时可能要花费几分钟,使用本地创建的 PV 很快就可以绑定。
结果:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound wordpress-mysql-pv-volume-2 5Gi RWO 15s wp-pv-claim Bound wordpress-mysql-pv-volume-1 5Gi RWO 15s
-
验证 Pod 是否正在运行
kubectl get pods
NAME READY STATUS RESTARTS AGE wordpress-c9cdf4bcb-f6q8s 1/1 Running 0 2m15s wordpress-mysql-575f8bcc5d-fhmx5 1/1 Running 0 2m15s
-
验证服务是否正在运行
kubectl get services wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.96.85.77 <pending> 80:31927/TCP 3m55s
对外公开的端口为 31927。
-
访问 WordPress
可以使用任一节点的 IP加上面获取到的端口进行访问。
本例中地址为 http://192.168.31.221:31927 或 http://192.168.31.222:31927 或 http://192.168.31.231:31927。
如果使用的是云服务商,那么上面的
EXTERNAL-IP
将会有一个可访问的 IP 地址,使用此 IP 地址加上面获取到的端口即可访问 WordPress 页面了。
5 删除示例
运行下面的命令即可删除本教程创建的示例。
kubectl delete -k ./
手动删除 PV。
kubectl delete -f pv.yaml