跳到主要内容

前置条件

请认真阅读本章节,否则可能会导致部署失败。

版本约束

  • Kubernetes 版本 1.20+
  • Helm 版本 3.8.0+
  • PV 动态存储

Kubernetes 集群

注意:以下集群部署快捷部署方式并不适用于生产环境,生产环境请使用云厂商提供的例如 ACK 的托管 Kubernetes 集群或自建的标准 Kubernetes 集群。

  • 建议服务器配置:8c16g * 1
  • 服务器架构:尽量选用 x86_64

这里并不提供具体的集群安装步骤,仅提供指导。您可以使用如下方式进行安装基础环境:

  • Docker Desktop

    如果您已经安装了 Docker Desktop,那么您将可以最快的启动一个 Kubernetes 测试环境,启用方式如下:

    1. 打开 Dashboards

    2. 点击 设置

    3. 左侧边栏选择 Kubernetes

    4. 勾选 Enable Kubernetes

      注意:启用后 Dashboard 左下角会有Kubernetes running的提示。

  • K3S

    # 安装集群
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.30.4+k3s1 sh -

    # 拷贝.kube/config
    mkdir ~/.kube
    cp /etc/rancher/k3s/k3s.yaml .kube/config
    chmod 0400 .kube/config
  • Kubeadm

Helm

这里提供两种安装方式:

  • Offical

    # 获取安装shell 脚本
    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

    # 开始安装
    chmod 700 get_helm.sh && ./get_helm.sh

    # 验证安装
    helm version
  • Other

    # 安装
    snap install helm --classic

    # 验证安装
    helm version

动态存储

如果您没有更好的方式支持动态 PV,仅用于本地测试可以采用如下方式。

  1. 创建 StorageClass

    # 创建 namespace
    kubectl create ns kube-storage

    # 创建 storage class
    cat <<EOF | kubectl apply -f -
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
    name: fast-disks
    annotations:
    storageclass.kubernetes.io/is-default-class: "true"
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    EOF
  2. 安装 local-volume-provisioner

    # 添加 chart 仓库
    helm repo add sig-storage-local-static-provisioner https://kubernetes-sigs.github.io/sig-storage-local-static-provisioner

    # 更新仓库
    helm repo update

    # 创建资源文件
    helm template --debug sig-storage-local-static-provisioner/local-static-provisioner --namespace kube-storage | sed 's/registry.k8s.io/opencsg-registry.cn-beijing.cr.aliyuncs.com\/opencsg_public/g'> local-volume-provisioner.generated.yaml

    # 应用资源文件
    kubectl apply -f local-volume-provisioner.generated.yaml
  3. 创建虚拟磁盘挂载点

    for flag in {a..z}; do
    mkdir -p /mnt/fake-disks/sd${flag} /mnt/fast-disks/sd${flag} 2>/dev/null
    mount --bind /mnt/fake-disks/sd${flag} /mnt/fast-disks/sd${flag}
    echo "/mnt/fake-disks/sd${flag} /mnt/fast-disks/sd${flag} none bind 0 0" >> /etc/fstab
    done
  4. 创建测试 Pod

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: local-volume-example
    namespace: default
    spec:
    serviceName: "local-volume-example-service"
    replicas: 1 # 实例数量
    selector:
    matchLabels:
    app: local-volume-example
    template:
    metadata:
    labels:
    app: local-volume-example
    spec:
    containers:
    - name: local-volume-example
    image: busybox:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: example-storage
    mountPath: /data
    volumeClaimTemplates:
    - metadata:
    name: example-storage
    spec:
    accessModes: [ "ReadWriteOnce" ]
    resources:
    requests:
    storage: 1Gi
    EOF

至此,在 StatefulSet 申请 PVC 时可以自动创建并绑定 PV,但是需要注意的是,此种方式并不能像云存储那样严格的控制 PV 的大小,只是提供了一种可以不用频繁手动创建 PV 的便捷。