微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/wenti/3282369.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐