k8s 1.25学习7 - PV & PVC

Volumes存储挂载

EmptyDir

用于同一个Pod中多个容器共享数据

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx:1.15.12-alpine
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
hostPath

把宿主机上的文件或目录挂载到Pod上

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx:1.15.12-alpine
    name: test-container
    volumeMounts:
    - mountPath: /etc/timezone
      name: timezone
  volumes:
  - name: timezone
    hostPath: 
      path: /etc/timezone
      type: File

安装nfs

#所有机器安装nfs客户端
yum install -y nfs-utils	  
	  
#在一个master节点安装nfs服务端
yum install -y nfs-server rpcbind 

#nfs主节点配置权限
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports 
mkdir -p /nfs/data
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r

#查看共享的目录
exportfs

在从节点上配置操作

#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /nfs/data
mkdir -p /nfs/data

#挂载主节点的目录
mount -t nfs 192.168.99.200:/nfs/data /nfs/data

挂载nfs

编写配置文件 vi deploy-nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx:1.15.12-alpine
    name: test-container
    volumeMounts:
    - mountPath: /opt
      name: nfs-volume
  volumes:
  - name: nfs-volume
    nfs: 
      server: 192.168.99.200
      path: /data/nfs/test-dp

PV & PVC

原生方式数据挂载的缺点

  1. 需要先手动创建目录
  2. pod删除后,目录不会自动删除
  3. 磁盘的使用空间没法做限制,权限没法控制

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

创建PV vi pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 192.168.99.200
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.99.200
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 192.168.99.200

其中storageClassName名称可以重复

kubectl apply -f pv.yaml

#查看创建好的PV
kubectl get persistentvolume

#状态都是Available可用的
kubectl get pv	
PV回收策略

Retain:保留,允许手动回收资源
Recycle:回收
Delete:删除
通过persistentVolumeReclaimPolicy: Recycle字段配置

PV访问策略

ReadWriteOnce:单节点以读写模式RWO
ReadOnlyMany:多个节点以只读模式ROX
ReadWriteMany:多个节点以读写模式RWX

PV的状态

Available:没有被PVC绑定的空闲资源
Bound:已经被PVC绑定
Released:已释放,PVC被删除,但是资源还未被重新使用
Failed:失败,自动回收失败


hostPath类型PV

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: hostpath
    capacity:
      storage: 1Gi
    accessModes:
    - ReadWriteOnce
    hostPath:
      path: "/mnt/data"

创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pvc-claim
spec:
  storageClassName: nfs
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

执行

kubectl apply -f pvc.yaml

#Bound状态表示已绑定,CLAIM显示是那个PVC使用到了PV,如 default/nginx-pvc 
kubectl get pv

#删除PVC
kubectl delete -f pvc.yaml

#状态变更为Released,Retain策略保留PV中的数据,在Released状态上PV不能重新分配
kubectl get pv

#重新应用,绑定另一个PV
kubectl apply -f pvc.yaml
kubectl get pv
kubectl get pvc

创建Pod绑定PVC

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes: 
  - name: task-pv-storage
    persistentVolumeClaim:
      claimName: task-pvc-claim
  containers: 
  - name: task-pv-container
    image: nginx
    ports: 
    - containerPort: 80
      name: "http-server"
    volumeMounts: 
	- mountPath: "/usr/share/nginx/html"
      name: task-pv-storage

PVC创建和挂载失败的原因

PVC一直Pending的原因:
PVC的空间申请大小大于PV的大小
PVC的StorageClassName没有和PV的一致
PVC的accessModes和PV的不一致

挂载PVC的Pod一直处于Pending:
PVC没有创建成功/PVC不存在
PVC和Pod不在同一个Namespace

<think>好的,我现在要帮用户解答如何在Kubernetes上安装和部署Zabbix监控系统的问题。首先,我需要整理用户提供的引用内容,看看里面有哪些有用的信息。 用户引用了五篇文章,其中提到Zabbix6需要Kubernetes 1.18以上版本,推荐使用6.x和k8s 1.25.x。监控架构涉及到在K8S节点安装容器化agent,Zabbix-proxy汇总数据到外部的Zabbix-Server。另外还有部署Zabbix Server的示例,比如使用官方镜像,以及一些部署后的状态,比如Pod的运行情况。 接下来,我需要结合这些信息,按照用户的要求生成一个结构清晰的教程。用户希望步骤详细,所以可能需要分步骤说明环境准备、创建命名空间、部署数据库、部署Zabbix Server、配置Proxy、部署Agent、访问Web界面和验证等。 需要注意的是,用户提到的Zabbix-Proxy在K8S内部,而Server在外部,但引用中也有例子是Server部署在K8S内,所以可能需要说明两种方式,或者根据其中一个示例来展开。例如引用5中提到了zabbix-server的Pod运行在节点上,可能是指Server部署在K8S集群内部,而Proxy可能作为中间组件。 另外,用户提供的示例回答中使用了代码块和引用标识,我需要确保在回答中正确引用,比如在步骤中引用相关的文献。例如,在部署Agent引用文献4提到的官方镜像,或者在架构部分引用文献1和5。 可能还需要考虑存储的配置,比如数据库需要持久化存储,这涉及到PVPVC的创建,但用户提供的引用中没有详细说明,可能需要一般性的指导,或者提醒用户根据自身环境调整。 最后,生成相关问题,需要围绕Zabbix在K8S的部署,比如优化配置、监控项管理、高可用方案、与Prometheus对比等,这些在引用中也有提到,比如用户提到已有Zabbix平台,不想用Prometheus,所以相关问题可以涉及两者的比较。 现在需要把这些点组织成一个连贯的教程,确保步骤正确,引用适当,并且语言清晰。同,检查是否满足所有系统级指令,比如数学公式的正确使用(虽然这个问题可能不涉及太多数学内容,但如果有变量或代码,要正确格式化),以及引用标识的正确添加。</think>### 在 Kubernetes 上部署 Zabbix 监控系统的分步教程 #### 1. 环境准备 - **Kubernetes 版本要求**:需使用 v1.18.x 及以上,推荐 v1.25.x[^1]。 - **Zabbix 版本要求**:需使用 Zabbix 6.x 及以上[^1]。 - **存储准备**:为数据库和 Zabbix Server 配置持久化存储(如 NFS、Ceph 或云存储)。 #### 2. 创建命名空间 建议为 Zabbix 组件创建独立的命名空间: ```yaml apiVersion: v1 kind: Namespace metadata: name: zabbix ``` #### 3. 部署数据库(MySQL/MariaDB) Zabbix 依赖数据库存储监控数据。以下为 MySQL 部署示例: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: zabbix-mysql namespace: zabbix spec: replicas: 1 selector: matchLabels: app: zabbix-mysql template: metadata: labels: app: zabbix-mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: "your_password" volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql volumes: - name: mysql-storage persistentVolumeClaim: claimName: mysql-pvc # 需提前创建 PVC ``` #### 4. 部署 Zabbix Server Zabbix Server 为核心组件,需连接数据库: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: zabbix-server namespace: zabbix spec: replicas: 1 selector: matchLabels: app: zabbix-server template: metadata: labels: app: zabbix-server spec: containers: - name: zabbix-server image: zabbix/zabbix-server-mysql:alpine-6.0-latest env: - name: DB_SERVER_HOST value: zabbix-mysql - name: MYSQL_ROOT_PASSWORD value: "your_password" ``` #### 5. 部署 Zabbix Web 界面 Web 界面提供可视化操作: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: zabbix-web namespace: zabbix spec: replicas: 1 selector: matchLabels: app: zabbix-web template: metadata: labels: app: zabbix-web spec: containers: - name: zabbix-web image: zabbix/zabbix-web-nginx-mysql:alpine-6.0-latest env: - name: DB_SERVER_HOST value: zabbix-mysql - name: ZBX_SERVER_HOST value: zabbix-server ``` #### 6. 配置 Zabbix Proxy(可选) 若需通过 Proxy 收集数据,可部署在集群内: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: zabbix-proxy namespace: zabbix spec: replicas: 1 template: spec: containers: - name: zabbix-proxy image: zabbix/zabbix-proxy-mysql:alpine-6.0-latest env: - name: ZBX_SERVER_HOST value: "external-zabbix-server-ip" # 外部 Zabbix Server 地址 ``` #### 7. 部署 Zabbix Agent 到 K8S 节点 每个节点需运行 Agent 以采集指标: ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: zabbix-agent namespace: zabbix spec: selector: matchLabels: app: zabbix-agent template: metadata: labels: app: zabbix-agent spec: containers: - name: zabbix-agent image: zabbix/zabbix-agent:alpine-6.0-latest # 使用官方镜像[^4] env: - name: ZBX_HOSTNAME valueFrom: fieldRef: fieldPath: spec.nodeName # 使用节点名作为主机名 - name: ZBX_SERVER_HOST value: "zabbix-proxy" # 或直接指向 Zabbix Server ``` #### 8. 验证部署 - 检查 Pod 状态: ```bash kubectl get pods -n zabbix # 预期输出类似: # zabbix-server-75cdd8865-rnxhx 2/2 Running 0 3m24s[^5] ``` - 访问 Web 界面:通过 `NodePort` 或 `Ingress` 暴露服务,默认账号/密码:`Admin/zabbix`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GalenZhang888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值