K8S(3)StorageClass与NFS的存储配置

前提

所有的worker节点都需要安装nfs的客户端,安装方法见 NFS服务配置

https://www.cnblogs.com/cerberus43/p/15880234.html

K8s的与NFS

Kubernetes的原生内部并不包含nfs的StorageClass的提供者,所以需要挂载外部的提供者来实现,我们使用nfs提供者如下:
NFS subdir external provisioner

配置汇总

1、下载最新版本的nfs-subdir-external-provisioner

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/releases

2、配置helm

curl -L https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz -O
tar zxvf helm-v3.12.0-linux-amd64.tar.gz
mv helm /usr/bin/
helm --help

3、解压nfs-subdir-external-provisioner并使用修改values.yaml

cd /root/nfs-storage-class
tar zxvf nfs-subdir-external-provisioner-4.0.18.tgz
ls /root/nfs-storage-class/nfs-subdir-external-provisioner/
    Chart.yaml  ci  README.md  templates  values.yaml
#修改镜像地址,原有的镜像国内无法下载,可以修改为自己的镜像地址
image:
  repository: registry.cn-hangzhou.aliyuncs.com/xxxx/nfs-subdir-external-provisioner

#配置nfs
nfs:
  server: 192.168.2.2
  path: /volume1/k8s-sc-data
  mountOptions:
  volumeName: nfs-subdir-external-provisioner-root
  # Reclaim policy for the main nfs volume
  reclaimPolicy: Retain

#配置sc
storageClass:
  create: true
  defaultClass: true
  name: k8s-sc-data-nfs

image.repository:nfs-subdir-external-provisioner的下载镜像
nfs.server:nfs的地址
nfs.path:nfs的路径
storageClass.defaultClass:指定为默认sc
storageClass.name:sc的名称

使用下面命令创建storage class

#执行此命令时,请确保/root/nfs-storage-class/nfs-subdir-external-provisioner目录下没有其他文件,否则会导致请求体过大而无法创建

helm install nfs-provisioner /root/nfs-storage-class/nfs-subdir-external-provisioner -f /root/nfs-storage-class/nfs-subdir-external-provisioner/values.yaml

#删除storageclass
helm uninstall nfs-provisioner

也可以使用【-n】参数指定在某个命令空间内创建。

可以使用下面命令查看创建的相关对象:

kubectl get pods
kubectl get sc

#查看所有charts
helm list

#删除charts
helm delete xxx

4、创建pvc

vim pvc-nexus.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nexus-pvc
  annotations:
        volume.beta.kubernetes.io/storage-class: "second-nfs-client"
spec:
  storageClassName: second-nfs-client
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 40Gi

5、创建pod测试

这个测试实例是使用k8s运行nexus的私服,整个实例经过多次验证,成功运行
vim nexus.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nexus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nexus-server
  template:
    metadata:
      labels:
        app: nexus-server
    spec:
      containers:
        - name: nexus
          image: sonatype/nexus3:latest
          resources:
            limits:
              memory: "4Gi"
              cpu: "1000m"
            requests:
              memory: "2Gi"
              cpu: "500m"
          ports:
            - containerPort: 8081
          volumeMounts:
            - name: nexus-data
              mountPath: /nexus-data
      volumes:
        - name: nexus-data
          persistentVolumeClaim:
            claimName: nexus-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: svc-nexus
  labels:           #可以没有
    app: svc-nexus
spec:
  #type: ClusterIP 默认就是ClusterIP
  type: NodePort
  selector:
    app: nexus-server      #一定要一致
  ports:
  - targetPort: 8081  #service访问目标容器的Port; 1.如果没用,那么默认用port,那么port与容器port需一致;
    # name: nexus 2.容器ports可写name,这样targetPort直接用其name即可;
    port: 8081      #service 自身暴露的端口;通过暴露service端口 --> 映射容器端口,使得容器服务可以对外访问
    nodePort: 30081
    #protocol:  默认TCP

6、执行命令

kubectl apply -f .
kubectl delete -f .

7、测试nexus能否正常访问

首次运行会有很点慢,需要等上两分钟
http://192.168.3.31:30081/#admin/repository
获取nexus的默认密码:

kubectl exec --stdin --tty nexus-6669fcf544-g6p2d /bin/bash
cat /nexus-data/admin.password

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注