k8s 部署mysql+statefulset+storage+nfs

1、创建命名空间
[root@node1 statefulset-mysql]# cat mysql-ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: mydb
2、provisioner授权sa账户
[root@node1 statefulset-mysql]# cat rabc.yaml 
##唯一需要修改的地方只有namespace,根据实际情况定义
apiVersion: v1
kind: ServiceAccount #  创建一个账户,主要用来管理NFS provisioner在k8s集群中运行的权限
metadata: 
  name: nfs-client-provisioner
  namespace: mydb
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get","list","watch","create","delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get","list","watch","update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create","update","patch"]
  - apiGroups: [""]
    resources: ["endpoints"]  #需要授权操作,否则在非默认命名空间无法动态创建PV
    verbs: ["get","list","watch","create","update","patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: mydb
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role # 创建角色
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner # 角色名
  namespace: mydb # Role需要指定名称空间,ClusterRole 不需要
rules: # 角色权限
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get","list","watch","create","update","patch"]
---
kind: RoleBinding # 角色绑定
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
subjects: # 角色绑定对象
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: mydb
roleRef: # 绑定哪个角色
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
 3、创建动态storageClass并配置动态PV驱动provisioner
[root@node1 statefulset-mysql]# cat mysql-sc.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: mysql-nfs-storage-name #PVC中的取值
provisioner: mysql-nfs-storage-pro
parameters:
  archiveOndelete: "false"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-nfs-storage
  namespace: mydb
  labels:
    app: mysql-nfs-storage
spec:
  selector:
    matchLabels:
      app: mysql-nfs-storage
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql-nfs-storage
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: mysql-nfs-storage
          image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: mysql-nfs-storage-pro #需要storageClass中的provisioner值保持一致
            - name: NFS_SERVER
              value: 192.168.58.130
            - name: NFS_PATH
              value: /opt/k8s
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.58.130
            path: /opt/k8s
 4、为statefulset创建无头服务(headless service)
[root@node1 statefulset-mysql]# cat mysql-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mydb
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None
  selector:
    app: mysql
 5、使用statefulset资源创建mysql
[root@node1 statefulset-mysql]# cat mysql-sts.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: mydb
spec:
  selector:
    matchLabels:
      app: mysql #必须匹配 .spec.template.metadata.labels
  serviceName: "mysql"  #声明它属于哪个Headless Service.
  replicas: 2 #副本数
  template:
    metadata:
      labels:
        app: mysql # 必须配置 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysql
        image: mysql:5.7
        ports:
        - containerPort: 3306
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
        volumeMounts:
        - name: mysql-pvc
          mountPath: /var/lib/mysql

  volumeClaimTemplates:   #可看作pvc的模板
  - metadata:
      name: mysql-pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "mysql-nfs-storage-name"  #存储类名,改为集群中已存在的
      resources:
        requests:
          storage: 100Mi
6、服务部署
[root@node1 statefulset-mysql]# kubectl  apply -f ./
namespace/mydb created
storageclass.storage.k8s.io/mysql-nfs-storage-name created
deployment.apps/mysql-nfs-storage created
statefulset.apps/mysql created
service/mysql created
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
persistentvolumeclaim/test-claim created
[root@node1 statefulset-mysql]# kubectl  get all -n mydb
NAME                                     READY   STATUS    RESTARTS   AGE
pod/mysql-0                              1/1     Running   0          35s
pod/mysql-1                              1/1     Running   0          29s
pod/mysql-nfs-storage-578bb5595c-nnkr6   1/1     Running   0          35s

NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/mysql   ClusterIP   None         <none>        3306/TCP   35s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql-nfs-storage   1/1     1            1           35s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-nfs-storage-578bb5595c   1         1         1       35s

NAME                     READY   AGE
statefulset.apps/mysql   2/2     35s
[root@node1 statefulset-mysql]# kubectl  get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                       STORAGECLASS             REASON   AGE
pvc-1288f88d-231f-4226-872d-7a7145cc5cd1   100Mi      RWO            Delete           Bound         mydb/mysql-pvc-mysql-1      mysql-nfs-storage-name            37s
pvc-a2b4585c-1548-429a-a233-bce3e6e32705   2Gi        RWO            Delete           Terminating   default/mysql-pvc-mysql-0   mysql-nfs-storage-name            81m
pvc-a876671e-8aed-4656-a319-7074f9a3db4c   100Mi      RWO            Delete           Bound         mydb/mysql-pvc-mysql-0      mysql-nfs-storage-name            40s
pvc-b6a8d86e-752c-46f4-a7a5-a9fed971e96a   2Gi        RWO            Delete           Terminating   default/mysql-pvc-mysql-1   mysql-nfs-storage-name            81m
pvc-ffb4db2d-71dd-4a71-8e58-c4016535468c   100Mi      RWX            Delete           Bound         mydb/test-claim             mysql-nfs-storage-name            40s
[root@node1 statefulset-mysql]# kubectl  get pvc -n mydb
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS             AGE
mysql-pvc-mysql-0   Bound    pvc-a876671e-8aed-4656-a319-7074f9a3db4c   100Mi      RWO            mysql-nfs-storage-name   55s
mysql-pvc-mysql-1   Bound    pvc-1288f88d-231f-4226-872d-7a7145cc5cd1   100Mi      RWO            mysql-nfs-storage-name   49s
test-claim          Bound    pvc-ffb4db2d-71dd-4a71-8e58-c4016535468c   100Mi      RWX            mysql-nfs-storage-name   55s
[root@node1 statefulset-mysql]# kubectl  get pods -n mydb
NAME                                 READY   STATUS    RESTARTS     AGE
mysql-0                              1/1     Running   0            90s
mysql-1                              1/1     Running   0            84s
mysql-nfs-storage-578bb5595c-nnkr6   1/1     Running   1 (6s ago)   90s

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的问题,需要详细说明。我会尽可能地给您提供一些指导。 首先,您需要了解一些基础知识,如 Kubernetes 和 Prometheus。Kubernetes 是一个容器编排平台,可以帮助您自动管理多个容器应用程序的部署、扩展和故障恢复。Prometheus 是一个开源的监控系统,可以收集和存储应用程序的指标,并支持告警和可视化。 以下是大致的步骤: 1. 部署 Kubernetes 集群,并准备好部署 Prometheus 和 Grafana 的节点。您可以使用各种 Kubernetes 发行版,如 kops、kubeadm 等。 2. 安装和配置 Prometheus。您可以使用 Prometheus 的 Helm Chart 进行部署,并通过 Prometheus Operator 进行管理。在部署 Prometheus 时,您需要配置它来收集应用程序的指标,并将其存储在 Prometheus 存储中。 3. 部署 Grafana。您可以使用 Grafana 的 Helm Chart 进行部署,并配置它来连接到 Prometheus 存储。在 Grafana 中,您可以创建仪表板并可视化 Prometheus 存储中的指标数据。 4. 配置告警。您可以使用 Prometheus 的 Alertmanager 进行告警,并将告警发送到 Slack、Email 等渠道。在配置告警时,您需要定义告警规则,并配置 Alertmanager 来发送告警。 以上是部署 Prometheus、Grafana 和告警的大致步骤。由于每个环境的部署和配置都有所不同,所以具体的细节可能会有所不同。我建议您查阅官方文档,并根据您的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值