Press "Enter" to skip to content

Instalace Portworx CSI driver 25.2 s FlashArray (Purity 6.5.5) na Ubuntu 24.04.1 LTS server + Docker 26.1.3 + K8s 1.30.10

Dokumentace Portworx:
https://docs.portworx.com/portworx-csi

Dokumentace Ubuntu:
https://documentation.ubuntu.com/server/

Požadavky:
 https://docs.portworx.com/portworx-csi/system-requirements

Změny oproti požadavkům:worker node:
min. 8GB RAM (testováno s 16GB), min 4x vCPU
se 4GB RAM nelze vytvořit interní KVDB, se 2x vCPU – warning stav

Open-ISCSI, multipath

Postup pro Arrow LAB:

4x VM pxcsi1 – pxcsi2
Hardware: 4x vCPU, 16GB RAM, ens33 – VM Network (192.168.6.0/24), ens44 – vD-iSCSI-VM (192.168.220.0/24), HDD SCSI 64GB (Datastore: OS4-vVOLDS-PST)

Default Ubuntu Server 24.04 LTS

Instalace K8s na Ubuntu servery, viz:
https://www.cherryservers.com/blog/install-kubernetes-ubuntu

Postup konfigurace linux serverů:

Vypnout swap na všech nodech
sudo swapoff -a
sudo vi /etc/fstab
# koment řádek se swap device

 

Přidat všechny nody a pole do host tabulky

sudo vi /etc/hosts

192.168.6.151 pxcsi1
192.168.6.152 pxcsi2
192.168.6.153 pxcsi3
192.168.6.154 pxcsi4
192.168.6.46 ceepsm20dst2

192.168.220.191 pxcsi1-iscsi
192.168.220.192 pxcsi2-iscsi
192.168.220.193 pxcsi3-iscsi
192.168.220.194 pxcsi4-iscsi

 

Zapnout NTP na všech nodech
(viz. dokument výše v LABU VM servery – vynecháno, v produkci mandatory)
sudo apt install systemd-timesyncd
sudo timedatectl set-ntp true
sudo timedatectl status

 

Firewall
– standardně vypnutý – ověření, generální vypnutí (LAB ONLY!!!)
sudo ufw status
sudo ufw disable

 

Produkce:
sudo apt install net-tools
(pokud není instalovaný netstat)

Tyto porty musí být volné a povolené na fw
control-plane node:
sudo netstat -tulpn | grep "6443\|2379\|2380\|10250\|10259\|10257"

worker node:
sudo netstat -tulpn | grep "10250"

Load Containerd modules (all nodes)
sudo modprobe overlay
sudo modprobe br_netfilter

permanentní nastavení:

sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

 

Configure Kubernetes IPv4 networking (all nodes)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

Install Docker (on all nodes)
sudo apt update
sudo apt install docker.io -y

sudo systemctl status docker
sudo systemctl enable docker

sudo mkdir /etc/containerd
sudo sh -c "containerd config default > /etc/containerd/config.toml"

sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml

sudo systemctl restart containerd.service
sudo systemctl status containerd.service
Install Kubernetes components (on all nodes)

sudo apt-get install -y apt-transport-https ca-certificates curl gpg

Podporovaná verze je 1.30 a 1.31 – instalace ověřena s verzí 1.30

sudo mkdir /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
sudo apt install kubelet kubeadm kubectl -y
 Initialize Kubernetes cluster (on master node)
sudo kubeadm config images pull
sudo kubeadm init --pod-network-cidr=10.10.0.0/16

 

Příklad!

Jako root:
export KUBECONFIG=/etc/kubernetes/admin.conf

Jako regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Install Calico network add-on plugin on master node
Ověřeno s verzí 3.26.1
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml -O

sed -i 's/cidr: 192\.168\.0\.0\/16/cidr: 10.10.0.0\/16/g' custom-resources.yaml

kubectl create -f custom-resources.yaml

Nechceme spouštět pody na control plane
kubectl taint nodes pxcsi1 node-role.kubernetes.io/control-plane=:NoSchedule

kubectl get nodes

Add worker nodes to the cluster (on worker nodes)

IP, token a hash z předchozího oddílu a příkazu kubeadm init pro inicializaci K8s clusteru

Příklad !

kubeadm join 84.32.214.62:6443 --token 2i5iru.f4m1vbxyc9w2ve7q \
        --discovery-token-ca-cert-hash sha256:29edadbccfc479ca35d1480058069dcadf7f694e510756fd153e4f65ae7f39f8

kubectl get nodes
kubectl get pods --all-namespaces -o wide

 

PORTWORX CSI:

Příprava:
Volné porty:
9001, 9002, 9003, 9004, 9012, 9013, 9014, 9018, 9019, 9021, 9022, 9029, 12002

Přístup na pole přes SCSI rozhraní:

Configuring Linux Host for iSCSI with FlashArray

https://support.purestorage.com/bundle/m_linux/page/Solutions/Linux/Installing_and_Configuring/topics/concept/c_configuring_linux_host_for_iscsi_with_flasharray.html

systemctl status iscsi

systemctl enable iscsi

Configure multipath.conf file
https://docs.portworx.com/portworx-csi/install/prepare/flash-array

sudo vi /etc/multipath.conf

blacklist {
        devnode "^pxd[0-9]*"
        devnode "^pxd*"
        device {
          vendor "VMware"
          product "Virtual disk"
        }
}

defaults {
        polling_interval       10
        find_multipaths "on"
}

devices {
    device {
        vendor                      "NVME"
        product                     "Pure Storage FlashArray"
        path_selector               "queue-length 0"
        path_grouping_policy        group_by_prio
        prio                        ana
        failback                    immediate
        fast_io_fail_tmo            10
        user_friendly_names         no
        no_path_retry               0
        features                    0
        dev_loss_tmo                60
    }

    device {
        vendor                   "PURE"
        product                  "FlashArray"
        path_selector            "service-time 0"
        hardware_handler         "1 alua"
        path_grouping_policy     group_by_prio
        prio                     alua
        failback                 immediate
        path_checker             tur
        fast_io_fail_tmo         10
        user_friendly_names      no
        no_path_retry            0
        features                 0
        dev_loss_tmo             600
    }
}

systemctl restart multipathd.service

Toto je kritická část – nody musí být schopny udělat automaticky login na iSCSI target porty pole a to i po restartu! Ubundu má default manual login!

Zjištění IQN initiator adaptéru nodu:

cat /etc/iscsi/initiatorname.iscsi

pokud mají nody shodný initiator, je potřeba upravit na unikátní. Buď manuálně nebo takto:
echo "InitiatorName=`/sbin/iscsi-iname`" > /etc/iscsi/initiatorname.iscsi

při změně IQN restart iscsi

systemctl restart iscsi

Vytvořit host záznamy na poli buď pomocí GUI nebo CLI
Na poli pro všechny hosty:

purehost create <Linux hostname>

purehost setattr --addiqnlist <IQN number> <Linux hostname>

pro všechny host nody, IQN viz výše pro každý node ze souboru /etc/iscsi/initiatorname.iscsi

volitelně lze dát hosty do stejné host grupy:

purehgroup create --hostlist pxcsi1,pxcsi2,pxcsi3,pxcsi4 pxcsi

Vytvoření test LUNu a připojení k hostům:

purevol create pxcsi-test-vol 16GB

purevol connect pxcsi-test-vol --hgroup pxcsi

Na všech nodech (jako root, jinak před vše sudo):

Pokud má host dedikovaný interface pro ISCSI, chceme, aby ISCSI provoz šel pouze přes tento interface. V Arrow LABU je to síť vD-iSCSI-VM (192.168.220.0/24) a VM má interface do této sítě ens34

ip address show

Vytvoření jména a iface pro iscsi a přidání IQN z /etc/iscsi/initiatorname.iscsi :

iscsiadm -m iface -I ens34 -o new
iscsiadm -m iface -I ens34 -o update -n iface.initiatorname -v <IQN number>

iscsiadm -m iface

Na poli:

pureport list

Na všech nodech – IP iSCSI port z pureport:

iscsiadm -m discovery -t st -p <FlashArray iSCSI IP>:3260

login na všechny iSCSI target porty – NA VŠECHNY IP z předchozího discovery:

iscsiadm -m node -p <FlashArray iSCSI IP> --login

Nyní by měl být vidět testovací LUN z pole

multipath -ll

automatický login k targetu po bootu (nezafungovalo)
iscsiadm -m node -L automatic

toto zafungovalo:

iscsiadm -m node --targetname <IQN Pure FlashArray target> -o update -n node.startup -v automatic

iscsiadm -m node --op show | grep startup

Set up user access in FlashArray

https://docs.portworx.com/portworx-csi/install/prepare/flash-array

Pomocí GUI nebo CLI vytvořit na poli uživatele se storage_admin právy, vytvořit API klíč

pureadmin create --role storage_admin pxcsi

pureadmin create --api-token pxcsi

Create pure.json file

<fa-management-endpoint> může být jak management IP pole, tak hostname, pokud jej lze resolvovat z host nodů k8s clusteru. API token uživatele se storage_admin právy, viz. předchozí bod.

vi pure.json

{
  "FlashArrays": [
    {
      "MgmtEndPoint": "<fa-management-endpoint>",
      "APIToken": "<fa-api-token>"
    }
  ]
}
Vytvoření namespace pro Portworx a secret s API klíčem pro připojení k poli

kubectl create namespace portworx

kubectl create secret generic px-pure-secret --namespace portworx --from-file=pure.json

Instalace Portworx CSI

https://docs.portworx.com/portworx-csi/install/install-portworx-csi

Generování K8s manifestu:

https://central.portworx.com/

PX-CSI Version                   25.2.0
Distribution Name           None
K8s Version                         1.30.10
(kubectl version –short 2>&1 || kubectl version) | awk -Fv ‚/Server Version: / {print $3}‘
Namespace                         portworx
Cluster Name Prefix         pxcsi
SAN                                       iSCSI
Starting Port                       9001
Telemetry                            Enabled
KVDB Device                       Default
Environment Var              PURE_ISCSI_ALLOWED_IFACES                  ens34
Use Custom Registry       not selected

Poznámka:

Default KVDB device znamená, že si Portworx operátor během instalace vytvoří na poli volume

pxcloudrive-nnnnnnnnnn o velikosti 32GB pro každý worker node a namapuje jej. Musí tedy bezpodmínečně fungovat připojení na iSCSI target pole a to i po rebootu. Jinak instalace visí na nemožnosti vytvořit KVDB device nebo implementovat databázi.

PURE_ISCSI_ALLOWED_IFACES povolí pro iSCSI přenos pouze pro tento/tyto iface. Musí být definován přes iscsiadm viz. předchozí sekce!!!

Deploy operator:

kubectl apply -f 'https://install.portworx.com/25.2.0?comp=pxoperator&oem=px-csi&kbver=1.30.10&ns=portworx'

kubectl get pods -n portworx

root@pxcsi1:/home/pxadmin# kubectl get pods -n portworx -o wide | grep -e portworx -e px
portworx-operator-54d9bc6fcf-99spq                 1/1     Running            2 (58m ago)      108m   10.10.6.4       pxcsi2   <none>           <none>

Deploy Portworx CSI:

poté, co je hotový deployment operátoru!
Buď pomocí vygenerovaného odkazu nebo lze download spec a uložit jako json file a udělat deployment pomocí něj.

vygenerovaný odkaz (příklad):

kubectl apply -f 'https://install.portworx.com/25.2.0?oem=px-csi&operator=true&ce=pure&csi=true&stork=false&mon=true&promop=true&kbver=1.30.10&ns=portworx&c=pxcsi-1a3f9179-b023-4b64-a960-28dfc460f07b&r=9001&pureSanType=ISCSI&tel=true&e=PURE_ISCSI_ALLOWED_IFACES%3D%22ens34%22'

nebo pomocí
portworx-csi.json (příklad)

# SOURCE: https://install.portworx.com/25.2.0?oem=px-csi&operator=true&ce=pure&csi=true&stork=false&mon=true&promop=true&kbver=1.30.10&ns=portworx&c=pxcsi-1a3f9179-b023-4b64-a960-28dfc460f07b&r=9001&pureSanType=ISCSI&tel=true&e=PURE_ISCSI_ALLOWED_IFACES%3D%22ens34%22
kind: StorageCluster
apiVersion: core.libopenstorage.org/v1
metadata:
  name: pxcsi-1a3f9179-b023-4b64-a960-28dfc460f07b
  namespace: portworx
  annotations:
    portworx.io/install-source: "https://install.portworx.com/25.2.0?oem=px-csi&operator=true&ce=pure&csi=true&stork=false&mon=true&promop=true&kbver=1.30.10&ns=portworx&c=pxcsi-1a3f9179-b023-4b64-a960-28dfc460f07b&r=9001&pureSanType=ISCSI&tel=true&e=PURE_ISCSI_ALLOWED_IFACES%3D%22ens34%22"
    portworx.io/misc-args: "--oem px-csi"
spec:
  image: portworx/oci-monitor:25.2.0
  imagePullPolicy: Always
  kvdb:
    internal: true
  cloudStorage:
    kvdbDeviceSpec: size=32
  stork:
    enabled: false
  csi:
    enabled: true
  monitoring:
    telemetry:
      enabled: true
    prometheus:
      enabled: true
      exportMetrics: true
  env:
  - name: PURE_FLASHARRAY_SAN_TYPE
    value: "ISCSI"
  - name: "PURE_ISCSI_ALLOWED_IFACES"
    value: "ens34"

kubectl apply -f portworx-csi.json

Monitoring instalace:

kubectl get storagecluster -n portworx

kubectl get pods -n portworx -o wide | grep -e portworx -e px

pokud nějaký pod je v crashloop mode, pak

kubectl describe <pod name> -n portworx

po úspěšné instalaci je na worker nodech dostupnýíkaz pxctl

/opt/pwx/bin/pxctl

pxctl status
pxctl license

Instalace Portworx CSI je úspěšně u konce!

en_USEnglish