Kubernetes---运行一个单实例有状态应用

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.
# 删除成功

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...