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
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:
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ý příkaz pxctl
/opt/pwx/bin/pxctl
pxctl status
pxctl license
Instalace Portworx CSI je úspěšně u konce!