Kubernetes—运行一个单实例有状态应用
一、部署 MysqL
你可以通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到 某已有的 PV 卷来运行一个有状态的应用。 例如,这里的 YAML 描述的是一个运行 MysqL 的 Deployment,其中引用了 PVC 申领。 文件为 /var/lib/MysqL 定义了加载卷,并创建了一个 PVC 申领,寻找一个 20G 大小的卷。 该申领可以通过现有的满足需求的卷来满足,也可以通过动态供应卷的机制来满足。
[root@master k8s]# cat MysqL-deployment.yaml
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:
#在实际中使用 secret
- 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
[root@master k8s]# cat MysqL-pv.yaml
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
部署 YAML 文件中定义的 PV 和 PVC:
[root@master k8s]# kubectl apply -f MysqL-pv.yaml
persistentvolume/MysqL-pv-volume created
persistentvolumeclaim/MysqL-pv-claim created
部署 YAML 文件中定义的 Deployment:
[root@master k8s]# kubectl apply -f MysqL-deployment.yaml
service/MysqL created
deployment.apps/MysqL created
展示 Deployment 相关信息:
[root@master k8s]# kubectl describe deployment MysqL
Name: MysqL
Namespace: default
CreationTimestamp: Wed, 24 Aug 2022 16:45:44 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=MysqL
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: Recreate
MinReadySeconds: 0
Pod Template:
Labels: app=MysqL
Containers:
MysqL:
Image: MysqL:5.6
Port: 3306/TCP
Host Port: 0/TCP
Environment:
MysqL_ROOT_PASSWORD: password
Mounts:
/var/lib/MysqL from MysqL-persistent-storage (rw)
Volumes:
MysqL-persistent-storage:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: MysqL-pv-claim
ReadOnly: false
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewreplicasetAvailable
Oldreplicasets: <none>
Newreplicaset: MysqL-6879db89b4 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
normal Scalingreplicaset 2m54s deployment-controller Scaled up replica set MysqL-6879db89b4 to 1
列举出 Deployment 创建的 pods:
[root@master k8s]# kubectl get pods -l app=MysqL
NAME READY STATUS RESTARTS AGE
MysqL-6879db89b4-xtxpz 1/1 Running 0 3m38s
查看 PersistentVolumeClaim:
[root@master k8s]# kubectl describe pvc MysqL-pv-claim
Name: MysqL-pv-claim
Namespace: default
StorageClass: manual
Status: Bound
Volume: MysqL-pv-volume
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 20Gi
Access Modes: RWO
VolumeMode: Filesystem
Used By: MysqL-6879db89b4-xtxpz
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ProvisioningFailed 4m48s persistentvolume-controller storageclass.storage.k8s.io "manual" not found
二、访问 MysqL 实例
前面 YAML 文件中创建了一个允许集群内其他 Pod 访问的数据库服务。该服务中选项 clusterIP: None 让服务 DNS 名称直接解析为 Pod 的 IP 地址。 当在一个服务下只有一个 Pod 并且不打算增加 Pod 的数量这是最好的.
运行 MysqL 客户端以连接到服务器:
[root@master k8s]# kubectl run -it --rm --image=MysqL:5.6 --restart=Never MysqL-client -- MysqL -h MysqL -ppassword
If you don't see a command prompt, try pressing enter.
MysqL>
此命令在集群内创建一个新的 Pod 并运行 MysqL 客户端,并通过 Service 连接到服务器。 如果连接成功,你就知道有状态的 MysqL 数据库正处于运行状态。
三、更新
Deployment 中镜像或其他部分同往常一样可以通过 kubectl apply 命令更新。 以下是特定于有状态应用的一些注意事项:
不要对应用进行规模扩缩。这里的设置仅适用于单实例应用。下层的 PersistentVolume 仅只能挂载到一个 Pod 上。对于集群级有状态应用,请参考 StatefulSet 文档.
在 Deployment 的 YAML 文件中使用 strategy: type: Recreate。 该选项指示 Kubernetes 不 使用滚动升级。滚动升级无法工作,因为这里一次不能 运行多个 Pod。在使用更新的配置文件创建新的 Pod 前,Recreate 策略将 保证先停止第一个 Pod。
四、删除 Deployment
[root@master k8s]# kubectl delete pvc MysqL-pv-claim
persistentvolumeclaim "MysqL-pv-claim" deleted
[root@master k8s]# kubectl delete pv MysqL-pv-volume
persistentvolume "MysqL-pv-volume" deleted
[root@master k8s]# kubectl get pods -l app=MysqL
No resources found in default namespace.
# 删除成功
原文地址:https://www.jb51.cc/wenti/3282369.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。