k8s 部署mysql+statefulset+storage+nfs

本文详细介绍了如何在Kubernetes环境中创建命名空间,授权ServiceAccount,设置NFS动态存储Class和Provisioner,以及配置StatefulSet以部署MySQL服务,包括创建Service、PersistentVolumeClaim和使用StorageClass。
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

 

<think>嗯,用户想在Kubernetes部署Zabbix和Grafana,问最佳实践。首先,我需要回忆一下相关的组件和步骤。Zabbix通常包括Server、Agent、数据库和Web界面。在K8s里,可能用Helm来部署比较方便,因为Helm chart能简化应用管理。 然后,Grafana需要集成Zabbix作为数据源,可能需要安装插件。记得用户提供的引用里有提到启用Zabbix插件的方法,应该是在Grafana的Installed Apps里配置。另外,数据存储方面,Zabbix需要数据库,比如MySQL或PostgreSQL,可能要考虑使用StatefulSet或者Persistent Volume来持久化数据,避免重启后丢失。 接下来,部署步骤大概分为几个部分:部署Zabbix Server、配置数据库、部署Zabbix Agent,然后是Grafana的部署和集成。需要检查是否有现有的Helm chart,比如引用3提到的zabbix-helm-chart,可能用户需要添加仓库然后安装。同时,要注意版本兼容性,比如Zabbix和Grafana的版本是否匹配,插件是否支持。 另外,监控K8s集群本身的话,可能需要让Zabbix Agent以DaemonSet形式运行在每个节点上,这样可以收集节点和Pod的指标。关于网络策略,需要确保Zabbix Server能够访问Agent的端口,比如10050和10051,同时Grafana要能访问Zabbix API。 用户提到的引用2和4都涉及Docker部署和Grafana集成,可能需要参考这些步骤来调整K8s的配置。比如,Grafana的数据源配置是通过HTTP访问Zabbix的Service,可能需要创建相应的Service和Ingress。 还有持久化存储的问题,Zabbix的数据库和Grafana的存储都需要PVC,要确保StorageClass配置正确。高可用方面,可能要考虑Zabbix Server的副本数,或者数据库的主从配置,但如果是测试环境可能单节点就够了。 最后,验证部分需要检查Pod状态,查看日志是否有错误,以及通过Grafana导入现有的Zabbix仪表盘模板,或者自己创建。可能还需要设置告警,结合Alertmanager,如引用5提到的Prometheus部署,但这里用户主要用Zabbix,所以可能用Zabbix自身的告警机制。 总结步骤:用Helm部署Zabbix,配置数据库持久化,部署Agent作为DaemonSet,部署Grafana并添加Zabbix数据源,配置网络策略和Service,最后验证和导入仪表盘。同时,注意安全和性能优化,比如资源限制和监控设置。</think>### 分步说明:在 Kubernetes部署 Zabbix 和 Grafana 的最佳实践 #### 1. **部署 Zabbix Server** **步骤说明**: Zabbix Server 是监控系统的核心组件,需通过 Helm Chart 部署,并配置持久化存储和数据库。 **操作步骤**: 1. 添加 Zabbix Helm 仓库: ```bash helm repo add zabbix-chart https://zabbix.github.io/zabbix-helm helm repo update ``` 2. 创建命名空间(如 `monitoring`): ```bash kubectl create ns monitoring ``` 3. 部署 Zabbix Server(需指定数据库类型和持久化参数): ```bash helm install zabbix-server zabbix-chart/zabbix -n monitoring \ --set server.image.tag=5.4.0 \ --set database.type=mysql \ --set persistence.enabled=true \ --set persistence.storageClass=standard ``` *说明*: - 使用 `mysql` 或 `postgresql` 作为数据库[^3] - `persistence.storageClass` 需匹配集群的存储类(如 `standard`、`nfs`) #### 2. **配置 Zabbix 数据库** **步骤说明**: 若未使用 Helm Chart 内置数据库,需独立部署 MySQL/PostgreSQL 并配置连接。 **操作步骤**: 1. 部署 MySQL(示例使用 StatefulSet): ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: monitoring spec: serviceName: mysql replicas: 1 template: spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "your_password" ``` 2. 创建 Service 供 Zabbix Server 访问: ```yaml apiVersion: v1 kind: Service metadata: name: mysql namespace: monitoring spec: ports: - port: 3306 selector: app: mysql ``` 3. 在 Zabbix Helm 安装时指定数据库连接参数: ```bash --set database.host=mysql.monitoring.svc.cluster.local \ --set database.user=root \ --set database.password=your_password ``` #### 3. **部署 Zabbix Agent** **步骤说明**: Zabbix Agent 需以 DaemonSet 形式运行在所有节点上,采集主机和容器指标。 **操作步骤**: 1. 部署 DaemonSet: ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: zabbix-agent namespace: monitoring spec: template: spec: containers: - name: zabbix-agent image: zabbix/zabbix-agent:latest ports: - containerPort: 10050 env: - name: ZBX_SERVER_HOST value: "zabbix-server.monitoring.svc.cluster.local" ``` *说明*: - `ZBX_SERVER_HOST` 需指向 Zabbix Server 的 Service 地址[^2] #### 4. **部署 Grafana** **步骤说明**: 通过 Helm 部署 Grafana,并配置 Zabbix 数据源。 **操作步骤**: 1. 添加 Grafana Helm 仓库: ```bash helm repo add grafana https://grafana.github.io/helm-charts helm repo update ``` 2. 安装 Grafana: ```bash helm install grafana grafana/grafana -n monitoring \ --set persistence.enabled=true \ --set persistence.storageClassName=standard ``` 3. 获取 Grafana 访问密码: ```bash kubectl get secret -n monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ``` #### 5. **集成 Zabbix 与 Grafana** **步骤说明**: 在 Grafana 中添加 Zabbix 插件并配置数据源。 **操作步骤**: 1. 登录 Grafana 控制台(通过 `kubectl port-forward` 或 Ingress): ```bash kubectl port-forward svc/grafana 3000:80 -n monitoring ``` 2. 安装 Zabbix 插件: - 在 Grafana 界面中:**Home → Plugins → 搜索 "Zabbix" → Install**[^4] 3. 配置 Zabbix 数据源: - URL: `http://zabbix-server.monitoring.svc.cluster.local/api_jsonrpc.php` - Auth: Zabbix 用户名/密码(默认 `Admin/zabbix`) #### 6. **网络策略与安全** **关键配置**: - 开放 Zabbix Server 的 10051 端口和 Agent 的 10050 端口 - 使用 Ingress 暴露 Grafana 和 Zabbix Web 界面(可选) - 为敏感数据(如数据库密码)配置 Kubernetes Secrets #### 7. **验证与监控** **验证步骤**: 1. 检查 Pod 状态: ```bash kubectl get pods -n monitoring ``` 2. 查看 Zabbix Server 日志: ```bash kubectl logs -l app=zabbix-server -n monitoring ``` 3. 在 Grafana 中导入 Zabbix 仪表盘模板(如 ID: **10422**)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值