目录
一、实验
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.pod Readiness探针与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/k8s
chmod 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)#首次安装
systemctl start rpcbind nfs#非首次安装
systemctl restart rpcbind
systemctl 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: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: default # 替换成你要部署的 Namespace
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: default
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-provisionernamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef: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 的挂载点建立关联。
vim nfs-provisioner-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner
spec: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/v1
kind: StorageClass
metadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "false" ## 是否设置为默认的storageclass
provisioner: 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.gztar -zxvf helm-v3.8.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version//命令补全
source <(helm completion bash)2)使用 helm 安装 Chart
//添加常用的 chart 仓库,
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts3) 更新 charts 列表
helm repo update
helm 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.tgz
cp 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: minio
LAST DEPLOYED: Thu Feb 8 09:03:41 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: minio
CHART VERSION: 13.3.3
APP VERSION: 2024.1.31** Please be patient while the chart is being deployed **MinIO® can be accessed via port on 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 listgcs URL : 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/.minio minio/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)先删除pod
helm -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) 删除pv
kubectl delete pv pvname(pv名称) -n devops5) 删除pvc
kubectl delete pvc pvname(pvc名称) -n devops
2.minio 部署模式有哪些
(1)模式
1)standalone
独立模式下,服务部署数量为1个3)distributed
分别模式下,服务部署数量,必须大于4个
(2)standalone模式
创建(服务部署数量为1个)
(3)distributed模式
创建 (服务部署数量为4个)
3.pod Readiness探针与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 created
pod/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 minioadmin
mc admin info k8s-minio-dev