Skip to main content

部署有状态应用

部署一个 mysql 实例

注意:密码这里直接写配置里是不安全的

定义部署文件

apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
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

定义持久化存储和声明

apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

部署 pv 和 pvc 配置

kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml

部署 mysql 服务

kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml

查看 mysql 服务

kubectl describe deployment mysql

查看 pods

kubectl get pods -l app=mysql

查看 pvc

kubectl describe pvc mysql-pv-claim

访问 mysql 服务

部署的配置项 clusterIP: None 让服务的 DNS 名称可以直接解析到 pod 的 ip 上。这是服务只有一个 pod,并且后期不会增加的情况下最理想的选择。

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

更新

  • 不能扩展应用,以上操作只适用于单实例应用,pv 只能挂在到 一个 pod。
  • strategy: type: Recreate 指定不能滚动更新,更新的时候,会先停止原来的 pod,再创建新的 pod。

删除部署

kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume

If you manually provisioned a PersistentVolume, you also need to manually delete it, as well as release the underlying resource. If you used a dynamic provisioner, it automatically deletes the PersistentVolume when it sees that you deleted the PersistentVolumeClaim. Some dynamic provisioners (such as those for EBS and PD) also release the underlying resource upon deleting the PersistentVolume.

参考