Helm Install OpenEBS LocalPV v1.6_github


文章目录

  • 1. 准备
  • 1. 安装集群
  • 2. 划分卷组
  • 2. 驱出 master 污点(可选)
  • 3. 安装 openebs


1. 准备

1. 安装集群

  • Kubespray v2.25.0 Online Install Iubernetes v1.29.5

2. 划分卷组

  • linux LVM /dev/sdb mount dir /data
$ docker exec -ti kubespray bash
root@bastion01:/kubespray# ansible -i inventory/sample/inventory.ini all -m shell -a "fdisk -l /dev/sdb |grep sdb"
[WARNING]: Skipping callback plugin 'ara_default', unable to load
kube-node01 | CHANGED | rc=0 >>
Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
kube-node02 | CHANGED | rc=0 >>
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
kube-node03 | CHANGED | rc=0 >>
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
kube-node04 | CHANGED | rc=0 >>
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
kube-master01 | CHANGED | rc=0 >>
Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors
root@bastion01:/kubespray# ansible -i inventory/sample/inventory.ini all -m shell -a "vgs"
[WARNING]: Skipping callback plugin 'ara_default', unable to load
kube-node02 | CHANGED | rc=0 >>
  VG      #PV #LV #SN Attr   VSize    VFree   
  data-vg   1   0   0 wz--n- <100.00g <100.00g
  rl        1   2   0 wz--n-   38.41g       0 
kube-node01 | CHANGED | rc=0 >>
  VG      #PV #LV #SN Attr   VSize   VFree  
  data-vg   1   0   0 wz--n- <50.00g <50.00g
  rl        1   2   0 wz--n-  38.41g      0 
kube-node03 | CHANGED | rc=0 >>
  VG      #PV #LV #SN Attr   VSize    VFree   
  data-vg   1   0   0 wz--n- <100.00g <100.00g
  rl        1   2   0 wz--n-   38.41g       0 
kube-node04 | CHANGED | rc=0 >>
  VG      #PV #LV #SN Attr   VSize    VFree   
  data-vg   1   0   0 wz--n- <100.00g <100.00g
  rl        1   2   0 wz--n-   38.41g       0 
kube-master01 | CHANGED | rc=0 >>
  VG      #PV #LV #SN Attr   VSize   VFree  
  data-vg   1   0   0 wz--n- <50.00g <50.00g
  rl        1   2   0 wz--n-  38.41g      0

2. 驱出 master 污点(可选)

$ kubectl describe node kube-master01 | grep Taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

$ kubectl taint nodes kube-master01 node-role.kubernetes.io/control-plane:NoSchedule-
node/kube-master01 untainted

$ kubectl describe node kube-master01 | grep Taint
Taints:             <none>

3. 安装 openebs

export OPENEBS_CONTROLLER_NODE_NAMES="kube-master01"
export OPENEBS_DATA_NODE_NAMES="kube-node01,kube-node02,kube-node03,kube-node04"
export OPENEBS_STORAGECLASS_NAME="openebs-lvmsc-hdd"
export OPENEBS_VG_NAME="data-vg"
export OPENEBS_CREATE_STORAGECLASS="true"
export OPENEBS_KUBE_NAMESPACE="openebs"

脚本 install_openebs_lvmlocalpv.sh

#!/usr/bin/env bash

# You must be prepared as follows before run install.sh:
#
# 1. OPENEBS_CONTROLLER_NODE_NAMES MUST be set as environment variable, for an example:
#
#        export OPENEBS_CONTROLLER_NODE_NAMES="master01,master02"
#
# 2. OPENEBS_DATA_NODE_NAMES MUST be set as environment variable, for an example:
#
#        export OPENEBS_DATA_NODE_NAMES="node01,node02"
#
# 4. OPENEBS_STORAGECLASS_NAME MUST be set as environment variable, for an example:
#
#        export OPENEBS_STORAGECLASS_NAME="openebs-lvmsc-hdd"
#
# 3. OPENEBS_VG_NAME MUST be set as environment variable, for an example:
#
#        export OPENEBS_VG_NAME="local_HDD_VG"
#

readonly CHART="openebs-lvmlocalpv/lvm-localpv"
readonly RELEASE="openebs-lvmlocalpv"
readonly TIME_OUT_SECOND="600s"
readonly CHART_VERSION="1.6.0"

OFFLINE_INSTALL="${OFFLINE_INSTALL:-false}"
OPENEBS_KUBE_NAMESPACE="${OPENEBS_KUBE_NAMESPACE:-openebs}"
OPENEBS_CREATE_STORAGECLASS="${OPENEBS_CREATE_STORAGECLASS:-false}"
OPENEBS_STORAGECLASS_YAML="${OPENEBS_STORAGECLASS_YAML:-/tmp/storageclass.yaml}"
INSTALL_LOG_PATH=/tmp/openebs-lvmlocalpv_install-$(date +'%Y-%m-%d_%H-%M-%S').log

OPENEBS_CONTROLLER_RESOURCE_LIMITS_CPU="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_CPU:-500m}"
OPENEBS_CONTROLLER_RESOURCE_LIMITS_MEMORY="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_MEMORY:-512Mi}"
OPENEBS_CONTROLLER_RESOURCE_REQUESTS_CPU="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_CPU:-500m}"
OPENEBS_CONTROLLER_RESOURCE_REQUESTS_MEMORY="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_MEMORY:-512Mi}"
OPENEBS_NODE_RESOURCE_LIMITS_CPU="${OPENEBS_NODE_RESOURCE_LIMITS_CPU:-500m}"
OPENEBS_NODE_RESOURCE_LIMITS_MEMORY="${OPENEBS_NODE_RESOURCE_LIMITS_MEMORY:-512Mi}"
OPENEBS_NODE_RESOURCE_REQUESTS_CPU="${OPENEBS_NODE_RESOURCE_REQUESTS_CPU:-500m}"
OPENEBS_NODE_RESOURCE_REQUESTS_MEMORY="${OPENEBS_NODE_RESOURCE_REQUESTS_MEMORY:-512Mi}"

info() {
  echo "[Info][$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" | tee -a "${INSTALL_LOG_PATH}"
}

error() {
  echo "[Error][$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" | tee -a "${INSTALL_LOG_PATH}"
  exit 1
}

installed() {
  command -v "$1" >/dev/null 2>&1
}

online_install_lvmlocalpv() {
  # check if openebs-lvmlocalpv already installed
  if helm status ${RELEASE} -n "${OPENEBS_KUBE_NAMESPACE}" &>/dev/null; then
    error "${RELEASE} already installed. Use helm remove it first"
  fi

  info "Start add helm openebs-lvmlocalpv repo"
  helm repo add openebs-lvmlocalpv https://openebs.github.io/lvm-localpv &>/dev/null || error "Helm add openebs-lvmlocalpv repo error."
  info "Start update helm openebs-lvmlocalpv repo"
  helm repo update openebs-lvmlocalpv 2>/dev/null || error "Helm update openebs-lvmlocalpv repo error."

  info "Install openebs-lvmlocalpv, It might take a long time..."
  helm install ${RELEASE} ${CHART} \
    --version "${CHART_VERSION}" \
    --namespace "${OPENEBS_KUBE_NAMESPACE}" \
    --create-namespace \
    --set lvmController.nodeSelector."openebs\.io/control-plane"="enable" \
    --set-string lvmController.resources.limits.cpu="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_CPU}" \
    --set-string lvmController.resources.limits.memory="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_MEMORY}" \
    --set-string lvmController.resources.requests.cpu="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_CPU}" \
    --set-string lvmController.resources.requests.memory="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_MEMORY}" \
    --set lvmNode.nodeSelector."openebs\.io/node"="enable" \
    --set-string lvmNode.resources.limits.cpu="${OPENEBS_NODE_RESOURCE_LIMITS_CPU}" \
    --set-string lvmNode.resources.limits.memory="${OPENEBS_NODE_RESOURCE_LIMITS_MEMORY}" \
    --set-string lvmNode.resources.requests.cpu="${OPENEBS_NODE_RESOURCE_REQUESTS_CPU}" \
    --set-string lvmNode.resources.requests.memory="${OPENEBS_NODE_RESOURCE_REQUESTS_MEMORY}" \
    --set lvmPlugin.allowedTopologies='kubernetes\.io/hostname\,openebs\.io/node' \
    --set analytics.enabled=false \
    --timeout $TIME_OUT_SECOND \
    --wait 2>&1 | tee -a "${INSTALL_LOG_PATH}" || {
    error "Fail to install ${RELEASE}."
  }

  #TODO: check more resources after install
}

offline_install_lvmlocalpv() {
  # check if openebs-lvmlocalpv already installed
  if helm status ${RELEASE} -n "${OPENEBS_KUBE_NAMESPACE}" &>/dev/null; then
    error "${RELEASE} already installed. Use helm remove it first"
  fi

  [[ -d "${OPENEBS_CHART_DIR}" ]] || error "OPENEBS_CHART_DIR not exist."

  local image_registry plugin_image_registry
  if [[ -z "${OPENEBS_IMAGE_REGISTRY}" ]]; then
    image_registry='registry.k8s.io/'
    plugin_image_registry=''
  else
    image_registry="${OPENEBS_IMAGE_REGISTRY}/"
    plugin_image_registry="${OPENEBS_IMAGE_REGISTRY}/"
  fi

  info "Install openebs-lvmlocalpv, It might take a long time..."
  helm install ${RELEASE} "${OPENEBS_CHART_DIR}" \
    --namespace "${OPENEBS_KUBE_NAMESPACE}" \
    --create-namespace \
    --set-string lvmController.resizer.image.registry="${image_registry}" \
    --set-string lvmController.snapshotter.image.registry="${image_registry}" \
    --set-string lvmController.snapshotController.image.registry="${image_registry}" \
    --set-string lvmController.provisioner.image.registry="${image_registry}" \
    --set lvmController.nodeSelector."openebs\.io/control-plane"="enable" \
    --set-string lvmController.resources.limits.cpu="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_CPU}" \
    --set-string lvmController.resources.limits.memory="${OPENEBS_CONTROLLER_RESOURCE_LIMITS_MEMORY}" \
    --set-string lvmController.resources.requests.cpu="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_CPU}" \
    --set-string lvmController.resources.requests.memory="${OPENEBS_CONTROLLER_RESOURCE_REQUESTS_MEMORY}" \
    --set-string lvmNode.driverRegistrar.image.registry="${image_registry}" \
    --set lvmNode.nodeSelector."openebs\.io/node"="enable" \
    --set-string lvmNode.resources.limits.cpu="${OPENEBS_NODE_RESOURCE_LIMITS_CPU}" \
    --set-string lvmNode.resources.limits.memory="${OPENEBS_NODE_RESOURCE_LIMITS_MEMORY}" \
    --set-string lvmNode.resources.requests.cpu="${OPENEBS_NODE_RESOURCE_REQUESTS_CPU}" \
    --set-string lvmNode.resources.requests.memory="${OPENEBS_NODE_RESOURCE_REQUESTS_MEMORY}" \
    --set-string lvmPlugin.image.registry="${plugin_image_registry}" \
    --set lvmPlugin.allowedTopologies='kubernetes\.io/hostname\,openebs\.io/node' \
    --set analytics.enabled=false \
    --timeout $TIME_OUT_SECOND \
    --wait 2>&1 | tee -a "${INSTALL_LOG_PATH}" || {
    error "Fail to install ${RELEASE}."
  }

  #TODO: check more resources after install
}

verify_supported() {
  installed helm || error "helm is required"
  installed kubectl || error "kubectl is required"
  installed curl || error "curl is required"
  installed envsubst || error "envsubst is required"

  [[ -n "${OPENEBS_STORAGECLASS_NAME}" ]] || error "OPENEBS_STORAGECLASS_NAME MUST set in environment variable."
  [[ -n "${OPENEBS_VG_NAME}" ]] || error "OPENEBS_VG_NAME MUST set in environment variable."

  [[ -n "${OPENEBS_CONTROLLER_NODE_NAMES}" ]] || error "OPENEBS_CONTROLLER_NODE_NAMES MUST set in environment variable."
  local node
  local control_node_array
  IFS="," read -r -a control_node_array <<<"${OPENEBS_CONTROLLER_NODE_NAMES}"
  for node in "${control_node_array[@]}"; do
    kubectl label node "${node}" 'openebs.io/control-plane=enable' --overwrite &>/dev/null || {
      error "kubectl label node ${node} 'openebs.io/control-plane=enable' failed, use kubectl to check reason"
    }
  done
  [[ -n "${OPENEBS_DATA_NODE_NAMES}" ]] || error "OPENEBS_DATA_NODE_NAMES MUST set in environment variable."
  local data_node_array
  IFS="," read -r -a data_node_array <<<"${OPENEBS_DATA_NODE_NAMES}"
  for node in "${data_node_array[@]}"; do
    kubectl label node "${node}" 'openebs.io/node=enable' --overwrite &>/dev/null || {
      error "kubectl label node ${node} 'openebs.io/node=enable' failed, use kubectl to check reason"
    }
  done
}

init_log() {
  touch "${INSTALL_LOG_PATH}" || error "Create log file ${INSTALL_LOG_PATH} error"
  info "Log file create in path ${INSTALL_LOG_PATH}"
}

############################################
# Check if helm release deployment correctly
# Arguments:
#   release
#   namespace
############################################
verify_installed() {
  local status
  status=$(helm status "${RELEASE}" -n "${OPENEBS_KUBE_NAMESPACE}" | grep ^STATUS: | awk '{print $2}')
  [[ "${status}" == "deployed" ]] || {
    error "Helm release ${RELEASE} status is not deployed, use helm to check reason"
  }

  info "${RELEASE} Deployment Completed!"
}

create_storageclass() {
  [[ -f ${OPENEBS_STORAGECLASS_YAML} ]] || {
    local download_url="https://raw.githubusercontent.com/upmio/upm-deploy/main/addons/openebs-lvmlocalpv/yaml/storageclass.yaml"
    curl -sSL "${download_url}" -o "${OPENEBS_STORAGECLASS_YAML}" || {
      error "curl get storageclass.yaml failed"
    }
  }

  OPENEBS_STORAGECLASS_NAME="${OPENEBS_STORAGECLASS_NAME}" \
    OPENEBS_VG_NAME="${OPENEBS_VG_NAME}" \
    envsubst <"${OPENEBS_STORAGECLASS_YAML}" | kubectl apply -f - || {
    error "kubectl create storageclass failed, check log use kubectl."
  }

  info "create storageclass successful!"
}

main() {
  init_log
  verify_supported
  if [[ ${OFFLINE_INSTALL} == "false" ]]; then
    online_install_lvmlocalpv
  elif [[ ${OFFLINE_INSTALL} == "true" ]]; then
    offline_install_lvmlocalpv
  fi
  verify_installed
  if [[ ${OPENEBS_CREATE_STORAGECLASS} == "true" ]]; then
    create_storageclass
  else
    info "OPENEBS_CREATE_STORAGECLASS disable, skip create storageclass."
  fi
}

main

执行:

$ sh install_openebs_lvmlocalpv.sh

输出:

[Info][2024-08-15T17:04:13+0800]: Log file create in path /tmp/openebs-lvmlocalpv_install-2024-08-15_17-04-13.log
[Info][2024-08-15T17:04:14+0800]: Start add helm openebs-lvmlocalpv repo
[Info][2024-08-15T17:04:14+0800]: Start update helm openebs-lvmlocalpv repo
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openebs-lvmlocalpv" chart repository
Update Complete. ⎈Happy Helming!⎈
[Info][2024-08-15T17:04:15+0800]: Install openebs-lvmlocalpv, It might take a long time...
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
NAME: openebs-lvmlocalpv
LAST DEPLOYED: Thu Aug 15 17:04:18 2024
NAMESPACE: openebs
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The OpenEBS LVM LocalPV has been installed. Check its status by running:
$ kubectl get pods -n openebs -l role=openebs-lvm

For more information, visit our Slack at https://openebs.io/community or view 
the documentation online at http://docs.openebs.io/.

[Info][2024-08-15T17:05:26+0800]: openebs-lvmlocalpv Deployment Completed!
storageclass.storage.k8s.io/openebs-lvmsc-hdd created
[Info][2024-08-15T17:05:29+0800]: create storageclass successful!

检查运行

$ helm ls -n openebs
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
openebs-lvmlocalpv      openebs         1               2024-08-15 17:04:18.917045172 +0800 CST deployed        lvm-localpv-1.6.0       1.6.0 

$ kubectl get pods -n openebs -l role=openebs-lvm
NAME                                                         READY   STATUS    RESTARTS   AGE
openebs-lvmlocalpv-lvm-localpv-controller-55f4c9d59c-mnjx5   5/5     Running   0          2m17s
openebs-lvmlocalpv-lvm-localpv-node-2lkxv                    2/2     Running   0          2m17s
openebs-lvmlocalpv-lvm-localpv-node-556zb                    2/2     Running   0          2m17s
openebs-lvmlocalpv-lvm-localpv-node-5tf76                    2/2     Running   0          2m17s
openebs-lvmlocalpv-lvm-localpv-node-hch94                    2/2     Running   0          2m17s

$ kubectl get sc
NAME                PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-lvmsc-hdd   local.csi.openebs.io   Delete          WaitForFirstConsumer   true                   9m30s

#设置默认sc
$ kubectl patch storageclass openebs-lvmsc-hdd  -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-lvmsc-hdd patched

$ kubectl get sc
NAME                          PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-lvmsc-hdd (default)   local.csi.openebs.io   Delete          WaitForFirstConsumer   true                   159m

参考: