目录
一、实验
1.环境
2.K8S storage节点部署NFS
3.K8S 动态创建PV
4.K8S master节点部署HELM3
4.K8S master节点部署Minio存储服务(第一种方式安装)
5.Minio客户端安装MC命令
6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)
二、问题
1.K8S无法删除pv,pvc问题
2.minio 部署模式有哪些
3.podReadiness探针与Liveness探针失败
4.添加 MinIO服务失败
5.docker创建容器失败
6.K8S如何快速创建Minio存储
一、实验
1.环境
(1)主机
表1 主机
主机 | 架构 | 版本 | IP | 备注 |
master1 | K8S master节点 | 1.20.6 | 192.168.204.180 | |
node1 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
node2 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
stor01 | nfs存储节点 | 192.168.204.177 |
(2)查看集群状态
2.K8S storage节点部署NFS
(1)安装配置nfs服务
#在stor01(192.168.204.183)节点上安装nfs,并配置nfs服务mkdir /opt/k8schmod 777 /opt/k8s/ yum -y install nfs-utils rpcbind #给204网段用户赋予读写权限、同步内容、不压缩共享对象root用户权限vim /etc/exports/opt/k8s 192.168.204.0/24(rw,sync,no_root_squash)#首次安装 systemctlstartrpcbind nfs#非首次安装systemctlrestart rpcbindsystemctl restart nfs#监听服务ss -antp | grep rpcbind#查看共享exportfs-arv showmount-e #所有节点配置hosts映射,或者配置DNS解析echo '192.168.204.177 stor01' >> /etc/hosts
在stor01(192.168.204.177)节点上安装nfs,并配置nfs服务
安装
配置文件
重启服务
监听服务
查看共享目录
(2)查看域名
vim /etc/hosts
3.K8S 动态创建PV
(1)创建 Service Account,用来管理 NFS-Subdir-External-Provisioner 在 k8s 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则
编写资源清单文件
vim nfs-rbac.yamlapiVersion: v1kind: ServiceAccountmetadata:name: nfs-client-provisionernamespace: default # 替换成你要部署的 Namespace---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: nfs-client-provisioner-runnerrules:- 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"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: run-nfs-client-provisionersubjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: defaultroleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-client-provisionernamespace: defaultrules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-client-provisionernamespace: defaultsubjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: defaultroleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
生成资源
kubectl apply -f nfs-rbac.yaml
再次查看sa
kubectl get sa
(3)使用 Deployment 来部署 NFS-Subdir-External-Provisioner
NFS Provisione(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。
vimnfs-provisioner-deploy.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: nfs-client-provisionerlabels:app: nfs-client-provisionerspec:replicas: 1strategy:type: Recreate ## 设置升级策略为删除再创建(默认为滚动更新)selector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisioner#image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAME ## Provisioner的名称,以后设置的storageclass要和这个保持一致value: nfs-client- name: NFS_SERVER ## NFS服务器地址,需和valumes参数中配置的保持一致value: stor01- name: NFS_PATH ## NFS服务器数据存储目录,需和valumes参数中配置的保持一致value: /opt/k8svolumes:- name: nfs-client-rootnfs:server: stor01 ## NFS服务器地址path: /opt/k8s## NFS服务器数据存储目录
kubectl apply -f nfs-provisioner-deploy.yaml
(5)创建 StorageClass,负责建立 PVC 并调用 NFS-Subdir-External-Provisioner进行预定的工作,并让 PV 与 PVC 建立关联,声明 NFS 动态卷提供者名称为 “nfs-storage”。
vim nfs-storage.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "false"## 是否设置为默认的storageclassprovisioner: nfs-client ## 动态卷分配者名称,必须和上面创建的"provisioner"变量中设置的Name一致parameters:archiveOnDelete: "true" ## 设置为"false"时删除PVC不会保留数据,"true"则保留数据mountOptions:- hard## 指定为硬挂载方式- nfsvers=4 ## 指定NFS版本,这个需要根据NFS Server版本号设置
kubectl apply -f nfs-storage.yaml
4.K8S master节点部署HELM3
(1)Helm版本与K8S集群兼容
Helm | Helm版本支持策略
(2)查看K8S集群状态
# kubectl get node
(3)策略
当前K8S 集群为1.20.6版本,选择HELM 3.8.1版本。
(4)部署
1)安装 helm //下载二进制 Helm client 安装包wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz tar -zxvf helm-v3.8.1-linux-amd64.tar.gzmv linux-amd64/helm /usr/local/bin/helmhelm version //命令补全source <(helm completion bash) 2)使用 helm 安装 Chart//添加常用的 chart 仓库,helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts3) 更新 charts 列表helm repo updatehelm repo list
安装
使用 helm 安装 Chart
4.K8S master节点部署Minio存储服务(第一种方式安装)
(1)Minio官方文档
minio 13.4.2 · bitnami/bitnami (artifacthub.io)
(2)获取最新minio charts
1)查询 minio 资源helm search repo minio2)创建目录mkdir -p /root/minio/ && cd /root/minio/3)拉取 chart 到本地目录第一种方式:helm fetch bitnami/minio --version 13.3.3第二种方式helm pull bitnami/minio --version 13.3.3 4)解压tar -zxvf minio-13.3.3.tgzcp minio/values.yaml ./values-test.yaml5)查看当前目录层级tree -L 2.├── minio│ ├── Chart.lock│ ├── charts│ ├── Chart.yaml│ ├── README.md│ ├── templates│ └── values.yaml├── minio-13.3.3.tgz└── values-test.yaml
查询
拉取解压
查看目录
(3)查看集群storageclasses
kubectl get storageclasses.storage.k8s.io
(4)修改配置文件
vim values-test.yaml
(5)安装minio集群
helm install minio minio -f values-test.yaml-n 指定 kubernetes 集群名称空间-f 指定使用的配置文件,文件中定义的配置可以覆盖 minio/values.yaml 文件中配置NAME: minioLAST DEPLOYED: Thu Feb8 09:03:41 2024NAMESPACE: defaultSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:CHART NAME: minioCHART VERSION: 13.3.3APP VERSION: 2024.1.31** Please be patient while the chart is being deployed **MinIO® can be accessed via porton the following DNS name from within your cluster: minio.default.svc.cluster.localTo get your credentials run: export ROOT_USER=$(kubectl get secret --namespace default minio -o jsonpath="{.data.root-user}" | base64 -d) export ROOT_PASSWORD=$(kubectl get secret --namespace default minio -o jsonpath="{.data.root-password}" | base64 -d)To connect to your MinIO® server using a client:- Run a MinIO® Client pod and append the desired command (e.g. 'admin info'): kubectl run --namespace default minio-client \ --rm --tty -i --restart='Never' \ --env MINIO_SERVER_ROOT_USER=$ROOT_USER \ --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \ --env MINIO_SERVER_HOST=minio \ --image docker.io/bitnami/minio-client:2024.1.31-debian-11-r1 -- admin info minioTo access the MinIO® web UI:- Get the MinIO® URL: echo "MinIO® web URL: http://127.0.0.1:9001/minio" kubectl port-forward --namespace default svc/minio 9001:9001
(6) 查看
helm listkubectl get deploykubectl get podkubectl get pod -o wide
(7) 查看pv与pvc
kubectl get pvkubectl get pvc
(8)NFS 查看卷
ls
ls | grep minio
5.Minio客户端安装MC命令
(1)下载
wget https://dl.min.io/client/mc/release/linux-amd64/mc
(2)安装
chmod a+x mcmv mc /usr/local/bin/mc --version
(3) 配置访问minio
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4# 查看配置,不同 mc 版本,以下内容输出可能不一定完全相同mc config host listgcsURL : https://storage.googleapis.comAccessKey : YOUR-ACCESS-KEY-HERESecretKey : YOUR-SECRET-KEY-HEREAPI : S3v2Path: dnslocalURL : http://localhost:9000AccessKey : SecretKey : API : Path: autominioURL : http://10.99.219.173:9000AccessKey : minioSecretKey : minio123API : S3v4Path: autoplay URL : https://play.min.ioAccessKey : Q3AM3UQ867SPQQA43P2FSecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TGAPI : S3v4Path: autos3 URL : https://s3.amazonaws.comAccessKey : YOUR-ACCESS-KEY-HERESecretKey : YOUR-SECRET-KEY-HEREAPI : S3v4Path: dns
6.K8S master节点使用Docker 部署Minio存储服务(第二种方式安装)
(1)docker 命令去安装稳定版本的 minio
docker pull minio/minio
(2)创建存放数据的目录
# 一个用来存放配置,一个用来存储上传文件的目录# 启动前需要先创建Minio外部挂载的配置文件( /rootconfig),和存储上传文件的目录( /root/data)mkdir -p /root/datamkdir -p /root/config
(3)创建Minio容器并运行(多行模式)
# 9090端口指的是minio的客户端端口# MINIO_ACCESS_KEY :账号# MINIO_SECRET_KEY :密码(账号长度必须大于等于5,密码长度必须大于等于8位)docker run -p 9000:9000 -p 9090:9090 \ --net=host \ --name minio \ -d --restart=always \ -e "MINIO_ACCESS_KEY=minioadmin" \ -e "MINIO_SECRET_KEY=minioadmin" \ -v /root/data:/data \ -v /root/config:/root/.minio \ minio/minio server \ /data --console-address ":9090" -address ":9000"
(4)另一种方式创建Minio容器并运行(单行模式)
docker run -p 9000:9000 -p 9090:9090--net=host--name minio-d --restart=always-e "MINIO_ACCESS_KEY=minioadmin"-e "MINIO_SECRET_KEY=minioadmin"-v /root/data:/data-v /root/config:/root/.miniominio/minio server/data --console-address ":9090" -address ":9000"
(5)查看docker进程
docker ps | grep minio
(6)登录
http://192.168.204.180:9090/login
进入系统
(7)创建用户
填写信息
(8)完成创建
(9)创建组
(10)创建accessKey和secretKey
查看
(11)创建Bucket
查看
(12)上传文件
查看
二、问题
1.K8S无法删除pv,pvc问题
(1)报错
error: resource(s) were provided, but no name was specified
(2)原因分析
删除顺序不对。
(3)解决方法
正确的删除顺序: 1)先删除podhelm -n devops uninstall minio(项目名称)2)解除pv绑定kubectl patch pv pvname(pv名称) -p '{"metadata":{"finalizers":null}}' 3)解除pvc绑定kubectl patch pvc pvcname(pvc名称) -p '{"metadata":{"finalizers":null}}'4) 删除pvkubectl delete pv pvname(pv名称) -n devops5) 删除pvckubectl delete pvc pvname(pvc名称) -n devops
2.minio 部署模式有哪些
(1)模式
1)standalone独立模式下,服务部署数量为1个3)distributed分别模式下,服务部署数量,必须大于4个
(2)standalone模式
创建(服务部署数量为1个)
(3)distributed模式
创建 (服务部署数量为4个)
3.podReadiness探针与Liveness探针失败
(1)报错
通过yaml文件创建pod时,执行完yaml文件,过一会就开始报错说Back-off restarting failed container
。
查看pod状态一致处于CrashLoopBackOff
kubectl get pod
kubectl describe pod minio-9c678d65c-45js9
(2)原因分析
Back-off restarting failed container的Warning事件,一般是由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。
(3)解决方法
如果是通过yaml文件创建的pod,找到对应的deployment,增加命令command: ["/bin/bash", "-ce", "tail -f /dev/null"]
kubectl edit deploy
4.添加 MinIO服务失败
(1)报错
(2)原因分析
端口不能漏,–api不能漏
(3)解决方法
连接
mc config host add minio http://10.99.219.173:9000 minio minio123 --api S3v4
如需删除
mc config host remove minio
5.docker创建容器失败
(1)报错
(2)原因分析
容器名称重复
(3)解决方法
查看
docker ps -a
删除
docker rm -f a17f4299e7bd
成功:
docker run -p 9000:9000 --name minio -v /root/data:/data -v /root/config:/root/.minio minio/minio server /data
6.K8S如何快速创建Minio存储
(1)官方文档
MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes
(2)下载 MinIO 对象
curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O
(3)应用 MinIO 对象定义
kubectl apply -f minio-dev.yaml
命令输出应如下所示:
namespace/minio-dev createdpod/minio created
(4)验证 Pod 的状态
kubectl get pods -n minio-dev
(5)检索有关 Pod 状态的详细信息
kubectl describe pod/minio -n minio-devkubectl logs pod/minio -n minio-dev
(6)临时访问 MinIO S3 API 和控制台
使用以下命令将流量从 MinIO Pod 临时转发到本地计算机
#该命令在 shell 中处于活动状态时,将 pod 端口转发到本地计算机上的匹配端口。 该命令仅在 shell 会话中处于活动状态时起作用。 终止会话将关闭本地计算机上的端口。#要配置对 Pod 的长期访问,需要在 Kubernetes 中配置 Ingress 或类似的网络控制组件,以路由进出 Pod 的流量。kubectl port-forward pod/minio 9000 9090 -n minio-dev
(7)浏览器连接到 MinIO 服务器
通过在本地计算机上打开浏览器并导航到 来访问 MinIO 控制台。http://127.0.0.1:9001使用凭据 登录控制台。 这些是默认的 root 用户凭证。minioadmin | minioadmin
(8)连接 MinIO 客户端
如果本地计算机已安装mc,请使用以下命令进行身份验证并连接到 MinIO 部署
mc alias set k8s-minio-dev http://127.0.0.1:9000 minioadmin minioadminmc admin info k8s-minio-dev