
Π‘ΡΠ²ΡΠ΅ΠΌ ΡΠΊΠΎΡΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΎΠ±ΡΠ²ΠΈ, ΡΠ΅ ΠΏΡΠ΅Ρ
Π²ΡΡΠ»Ρ ΡΠ΅ΡΠΈΡΡΠ° ΡΠΈ Π½ΠΎΡΡΠ±ΡΡΠΈ Π½Π° ARM Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°. Π§ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ°Π·ΠΈ Π½ΠΎΠ²ΠΈΠ½Π°, ΡΠΈ ΡΠΏΠΎΠΌΠ½ΠΈΡ
: ΠΏΡΠ΅Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ΅Π½ΠΈΡΠ΅ Π½Π° EC2 Π² AWS, ΠΌΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅ Graviton Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π°ΡΡΠ°ΠΊΡΠΈΠ²Π½Π° ΡΠ΅Π½Π°. ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠ°ΠΌΡΠΊ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π±Π΅ΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ARM. Π’ΠΎΠ³Π°Π²Π° ΠΈΠ·ΠΎΠ±ΡΠΎ Π½Π΅ ΠΌΠΈ Π±Π΅ΡΠ΅ Ρ
ΡΡΠΌΠ½Π°Π»ΠΎ, ΡΠ΅ ARM Π΅ Π΄ΠΎΡΡΠ° ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ...
ΠΠ° ΠΌΠ΅Π½ ΡΠ°Π·ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π±ΠΈΠ»Π° ΡΠ²ΡΡΠ·Π°Π½Π° Ρ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ IoT Π½Π΅ΡΠ°. βΠΡΡΠΈΠ½ΡΠΊΠΈΡΠ΅β ΡΡΡΠ²ΡΡΠΈ Π½Π° ARM β ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΠΏΠΎ-Π½Π΅ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΎ, Π΄ΠΎΡΠΈ Π΄ΠΎΠ½ΡΠΊΡΠ΄Π΅ Π΅ΠΊΡΡΠ΅Π½ΡΡΠΈΡΠ½ΠΎ... ΠΠ±Π°ΡΠ΅ Π½ΠΎΠ²Π°ΡΠ° ΠΈΠ΄Π΅Ρ ΠΌΠΈ Π·Π°Π΅ ΡΠΌΠ°, Π·Π°ΡΠΎΠ²Π° Π² Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠΈΠΊΠ΅Π½Π΄ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡ ΠΊΠ°ΠΊΠ²ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π° ARM. Π Π·Π° ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π° Ρ Π±Π»ΠΈΠ·ΠΊΠΎΡΠΎ ΠΈ ΠΏΠΎΠ·Π½Π°ΡΠΎ β ΠΊΠ»Π°ΡΡΠ΅Ρ Kubernetes. Π Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² ΡΡΠ»ΠΎΠ²Π΅Π½ βΠΊΠ»Π°ΡΡΠ΅Ρβ, Π° Π²ΡΠΈΡΠΊΠΎ Π΄Π° Π΅ βΠΏΠΎ-Π²ΡΠ·ΡΠ°ΡΡΠ½ΠΎβ, Π·Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΡΠΌ ΡΠ²ΠΈΠΊΠ½Π°Π» Π΄Π° Π²ΠΈΠΆΠ΄Π°ΠΌ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ.
Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΡΡΠ° ΠΈΠ΄Π΅Ρ, ΠΊΠ»Π°ΡΡΠ΅ΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π΄Π° ΠΈΠΌΠ° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠΎ ΡΠ΅ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ½Π΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³. ΠΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ΄Π΅Ρ ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π΄Π²Π° (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅) Raspberry Pi Π½Π΅ ΠΏΠΎ-Π½ΠΈΡΠΊΠΈ ΠΎΡ ΠΌΠΎΠ΄Π΅Π» 3B+. ΠΠ»ΠΎΡΠ°Π΄ΠΊΠ°ΡΠ° Π·Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΈ AWS, Π½ΠΎ ΠΌΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ βΠΌΠ°Π»ΠΈΠ½ΠΈΡΠ΅β ΠΌΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ Π° (ΠΊΠΎΠΈΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ ΡΡΠΎΡΡ Π° Π±Π΅Π· ΡΠ°Π±ΠΎΡΠ°). Π ΡΠ°ΠΊΠ°, ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° ΡΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ Kubernetes Ρ Ingress, Prometheus ΠΈ Grafana.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° βΠΌΠ°Π»ΠΈΠ½ΠΈβ
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΠ‘ ΠΈ SSH
Π‘ ΠΈΠ·Π±ΠΎΡΠ° Π½Π° ΠΠ‘ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π΅ ΡΠ΅ ΠΌΡΡΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ: ΠΏΡΠΎΡΡΠΎ Π²Π·Π΅Ρ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΎΡΠΎ Raspberry Pi OS Lite Ρ . Π’Π°ΠΌ ΡΡΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ½Π° , Π²ΡΠΈΡΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΡ ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π» ΠΎΡ Π±ΡΠ΄Π΅ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ΅Ρ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ (ΡΡΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ).
Π‘Π²ΡΡΠ·Π²Π°ΠΉΠΊΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ SSH:
- ΠΠ° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π½Π° ΠΌΠ°ΡΡΠ΅ΡΠ° Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΈΠΌΠ° ΡΡΠ°ΡΠΈΡΠ΅Π½ IP Π°Π΄ΡΠ΅Ρ, Π° Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ β ΠΏΠΎ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅. ΠΠ· ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅ΡΠΎΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈ Π°Π΄ΡΠ΅ΡΠΈ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅ ΠΎΡ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°.
- Π‘ΡΠ°ΡΠΈΡΠ½ΠΈΡΡ Π°Π΄ΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° Π² ΠΠ‘ (Π² ΡΠ°ΠΉΠ»Π°
/etc/dhcpcd.confΠΈΠΌΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ) ΠΈΠ»ΠΈ ΡΡΠ΅Π· ΡΠΈΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° lease Π² DHCP ΡΡΡΠ²ΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ (Π² ΠΌΠΎΡ ΡΠ»ΡΡΠ°ΠΉ β Π΄ΠΎΠΌΠ°ΡΠ΅Π½) ΡΡΡΠ΅Ρ. - ssh-server ΠΏΡΠΎΡΡΠΎ ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° Π² raspi-config (interfacing options β ssh).
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ΡΠ΅ ΠΏΠΎ SSH (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π΅ pi, Π° ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π΅ raspberry ΠΈΠ»ΠΈ ΡΠ°Π·ΠΈ, Π½Π° ΠΊΠΎΡΡΠΎ Ρ ΡΠΌΠ΅Π½ΠΈΡ
ΡΠ΅) ΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅.
ΠΡΡΠ³ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
- Π©Π΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΈΠΌΠ΅ Π½Π° Ρ
ΠΎΡΡΠ°. Π ΠΌΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ
pi-controlΠΈpi-worker. - ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½Π° Π½Π° ΡΠ΅Π»ΠΈΡ Π΄ΠΈΡΠΊ (
df -h /). ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½Π° Ρ raspi-config. - Π©Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π² raspi-config.
- Π©Π΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ swap ΡΠ°ΠΉΠ»Π° (ΡΠΎΠ²Π° Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Kubernetes; Π°ΠΊΠΎ Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°, Π²ΠΈΠΆΡΠ΅ ):
dphys-swapfile swapoff systemctl disable dphys-swapfile - Π©Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ:
apt-get update && apt-get dist-upgrade -y - Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Docker ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ:
apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistentΠΡΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅
iptables-persistentΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° iptables Π·Π° ipv4, Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π°/etc/iptables/rules.v4β Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π² Π²Π΅ΡΠΈΠ³Π°ΡΠ°FORWARD, ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:# Generated by xtables-save v1.8.2 on Sun Jul 19 00:27:43 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -s 10.1.0.0/16 -j ACCEPT -A FORWARD -d 10.1.0.0/16 -j ACCEPT COMMIT - ΠΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅.
Π‘Π΅Π³Π° Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kubernetes.
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π° Kubernetes
ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠΈ ΠΈ Π½Π°ΡΠΈΡΠ΅ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° K8s. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π°, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Ρ (Π»Π΅ΠΊΠΎ Π΄ΠΎΠΏΡΠ»Π½Π΅Π½Π° Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΠΈ ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΈΡ).
Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° Kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get updateΠ‘Π»Π΅Π΄Π²Π° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° CRI (container runtime interface). Π’ΡΠΉ ΠΊΠ°ΡΠΎ Docker Π²Π΅ΡΠ΅ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ΅Π΄ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ:
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni ΠΠ° ΡΡΡΠΏΠΊΠ°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π²Π΅Π΄Π½Π°Π³Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ
kubernetes-cni, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°. Π ΡΡΠΊ ΠΈΠΌΠ° Π²Π°ΠΆΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΏΠ°ΠΊΠ΅ΡΡΡ kubernetes-cni ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° Π½Π΅ ΡΡΠ·Π΄Π°Π²Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° CNI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅, Π·Π°ΡΠΎΠ²Π° ΠΌΠΈ ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° Ρ ΡΡΠ·Π΄Π°ΠΌ ΡΡΡΠ½ΠΎ:
mkdir -p /etc/cni/net.dΠΠ° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ Π±Π΅ΠΊΠ΅Π½Π΄, Π·Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π·Π° CNI. ΠΠ·Π±ΡΠ°Ρ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠΈΡ ΠΈ ΠΏΠΎΠ·Π½Π°Ρ ΠΌΠΈ ΠΏΠ»ΡΠ³ΠΈΠ½ portmap (ΠΏΡΠ»Π½ΠΈΡΡ ΠΈΠΌ ΡΠΏΠΈΡΡΠΊ Π²ΠΈΠΆΡΠ΅ Π² ):
curl -sL https://github.com/containernetworking/plugins/releases/download/v0.7.5/cni-plugins-arm-v0.7.5.tgz | tar zxvf - -C /opt/cni/bin ./portmapΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Kubernetes
Π£Π·Π΅Π» Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ»Π°Π½Π°
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ°ΠΌΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ ΡΡΠ°Π²Π° Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ. Π Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π»ΠΈ ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ Π½Π° Kubernetes ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅:
kubeadm config images pullΠ‘Π΅Π³Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΡΠ°ΠΌΠ°ΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠΈΡ ΠΏΠ»Π°Π½ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°:
kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16 --upload-certsΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΡΠΈΡΠ΅ Π·Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΈΡΠ°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ ΠΈ Ρ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ.
Π ΠΊΡΠ°Ρ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π½ΠΈ ΠΏΠΎΡΠΎΡΠ°Ρ ΠΊΠ°ΠΊ Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈΡ ΠΏΠ»Π°Π½:
ΠΠ°ΡΠΈΡΡ Kubernetes ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΠΏΠ»Π°Π½ Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΡΡΠΏΠ΅ΡΠ½ΠΎ! ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΡΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΊΠ°ΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π³ΡΡΡΠ°ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ²Π° ΠΌΡΠ΅ΠΆΠ° Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°.
ΠΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ "kubectl apply -f [podnetwork].yaml" Ρ Π΅Π΄Π½Π° ΠΎΡ ΠΎΠΏΡΠΈΠΈΡΠ΅, ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π½Π°:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ Π²ΡΠ·Π»ΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΡΡ
ΠΊΠ°ΡΠΎ root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050
--contrl-plane --certificate-key 72a3c0a14c627d6d7fdade1f4c8d7a41b0fac31b1faf0d8fdf9678d74d7d2403
ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ certificate-key Π΄Π°Π²Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, ΠΏΠ°Π·Π΅ΡΠ΅ Π³ΠΎ Π² ΡΠ°ΠΉΠ½Π°!
ΠΠ°ΡΠΎ ΠΌΡΡΠΊΠ° Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ, ΠΊΠ°ΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΡΠΈΡΠΈ ΡΠ»Π΅Π΄ Π΄Π²Π° ΡΠ°ΡΠ°; ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
"kubeadm init phase upload-certs --upload-certs" Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΡΡ
ΠΊΠ°ΡΠΎ root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050Π©Π΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΏΡΠ΅ΠΏΠΎΡΡΠΊΠΈΡΠ΅ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. Π ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π·Π° kubectl:
kubectl completion bash > $HOME/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profileΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡΡΠ²ΠΈΡ Π²ΡΠ·Π΅Π» Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° (Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠΎΠΉ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ Π³ΠΎΡΠΎΠ²):
root@pi-control:~# kubectl get no
ΠΠΠ Π‘Π’ΠΠ’Π£Π‘ Π ΠΠΠ ΠΠͺΠΠ ΠΠ‘Π’ ΠΠΠ Π‘ΠΠ―
pi-control NotReady master 29s v1.18.6ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ Π² ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ°, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΌΡΠ΅ΠΆΠ° Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°. Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΈΠ·Π±ΠΎΡ ΠΎΡ Calico, Cilium, contiv-vpp, Kube-router ΠΈ Weave Netβ¦ Π’ΡΠΊ ΡΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½ΠΈΡ ΠΎΡ ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈ ΠΈΠ·Π±ΡΠ°Ρ ΠΏΠΎ-ΠΏΠΎΠ·Π½Π°Ρ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π·Π° ΠΌΠ΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ: Π² ΡΠ΅ΠΆΠΈΠΌ host-gw (ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° Π½Π°Π»ΠΈΡΠ½ΠΈΡΠ΅ Π±Π΅ΠΊΠ΅Π½Π΄ΠΈ Π²ΠΈΠΆΡΠ΅ Π² ).
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΡ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠΎ. ΠΡΡΠ²ΠΎ β ΡΠ²Π°Π»ΡΠΌΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΡΠΈΠΏΠ° ΠΎΡ vxlan Π½Π° host-gw:
sed -i 's/vxlan/host-gw/' kube-flannel.ymlβ¦ ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ β ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½Π° ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°:
sed -i 's#10.244.0.0/16#10.1.0.0/16#' kube-flannel.ymlΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΈΡΠ΅:
kubectl create -f kube-flannel.yml ΠΠΎΡΠΎΠ²ΠΎ! Π‘Π»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΡΠ²ΠΈΡΡ Π²ΡΠ·Π΅Π» K8s ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ Π² ΡΡΠ°ΡΡΡ ΠΠΎΡΠΎΠ²ΠΎ:
ΠΠΠ Π‘Π’ΠΠ’Π£Π‘ Π ΠΠΠ ΠΠͺΠΠ ΠΠ‘Π’ ΠΠΠ Π‘ΠΠ―
pi-control Ready master 2m v1.18.6ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ΅Π½ Π²ΡΠ·Π΅Π»
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ worker. ΠΠ° ΡΠ΅Π»ΡΠ° Π½Π° Π½Π΅Π³ΠΎ β ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡ Kubernetes ΠΏΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΉ β ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050Π‘ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅ΡΡΡ Π΅ Π³ΠΎΡΠΎΠ²:
root@pi-control:~# kubectl get no
ΠΠΠ Π‘Π’ΠΠ’Π£Π‘ Π ΠΠΠ ΠΠͺΠΠ ΠΠ‘Π’ ΠΠΠ Π‘ΠΠ―
pi-control ΠΠΎΡΠΎΠ² ΠΌΠ°ΠΉΡΡΠΎΡ 28ΠΌ v1.18.6
pi-worker ΠΠΎΡΠΎΠ² 2ΠΌ8Ρ v1.18.6ΠΠΌΠ°Ρ ΠΏΠΎΠ΄ ΡΡΠΊΠ° ΡΠ°ΠΌΠΎ Π΄Π²Π° Raspberry Pi, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π΅ ΠΌΠΈ ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π΄Π°Π²Π°ΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄ control plane. ΠΠ°ΡΠΎΠ²Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡ taint ΠΎΡ ΡΠ·Π»Π° pi-control, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡ :
root@pi-control:~# kubectl edit node pi-controlβ¦ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°Ρ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅:
- effect: NoSchedule
key: node-role.kubernetes.io/masterΠΠ°ΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ
ΠΡΡΠ²ΠΎ, ΡΠ΅ Π½ΠΈ Π΅ Π½ΡΠΆΠ½Π° Helm. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π²ΡΠΈΡΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ, Π½ΠΎ Helm ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π±ΡΠΊΠ²Π°Π»Π½ΠΎ Π±Π΅Π· ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΏΠΎ Π²Π°ΡΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅. Π Π²ΡΡΡΠ½ΠΎΡΡ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ βΠ½Π΅ ΠΈΡΠΊΠ° Ρ Π»ΡΠ±β.
Π ΡΠ°ΠΊΠ°, Π²Π»ΠΈΠ·Π°ΠΌΠ΅ Π² Π² ΡΠ΅ΠΊΡΠΈΡ docs/installation ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΎΡΡΠ°ΠΌ:
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bashΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΡΠ°ΡΡΠΎΠ²Π΅:
helm repo add stable https://kubernetes-charts.storage.googleapis.com/Π‘Π΅Π³Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ Π·Π°ΠΌΠΈΡΡΠ»Π°:
- Ingress controller;
- Prometheus;
- Grafana;
- cert-manager.
Ingress controller
ΠΡΡΠ²ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ β Ingress controller β ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ ΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° βΠΎΡ ΠΊΡΡΠΈΡΡΠ°β. ΠΠ° ΡΠ΅Π»ΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° Π²Π»Π΅Π·Π΅ΡΠ΅ Π² ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ ΠΎΡΡΠ°ΠΌ:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yamlΠΠ±Π°ΡΠ΅ Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ βΠΌΠ°Π»ΠΈΠ½Π°β Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΡΠ³Π° ΠΈ Π΄Π° ΡΠ΄ΡΡ Π² Π΄ΠΈΡΠΊΠΎΠ²ΠΈΡ IOPS. Π Π°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΠ°ΠΌ, ΡΠ΅ Π·Π°Π΅Π΄Π½ΠΎ Ρ Ingress ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΡΡΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΊΡΠΌ API ΠΈ, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ Π² etcd. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°, ΠΈΠ»ΠΈ ΠΊΠ°ΡΡΠ°ΡΠ° Ρ ΠΏΠ°ΠΌΠ΅Ρ ΠΊΠ»Π°Ρ 10 Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½Π°, ΠΈΠ»ΠΈ SD ΠΊΠ°ΡΡΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ½ΠΎ Π½Π΅ ΡΡΠΈΠ³Π°Ρ Π·Π° ΡΠ°ΠΊΠ°Π²Π° Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΎΡΡ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ»Π΅Π΄ ΠΎΠΊΠΎΠ»ΠΎ 5 ΠΌΠΈΠ½ΡΡΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°.
Π‘ΡΠ·Π΄Π°Π΄Π΅Π½ Π΅ namespace ΠΈ Π² Π½Π΅Π³ΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΡΡ ΠΈ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ:
root@pi-control:~# kubectl -n ingress-nginx get pod
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-2hwdx 0/1 ΠΠ°Π²ΡΡΡΠ΅Π½ΠΎ 0 31s
ingress-nginx-admission-patch-cp55c 0/1 ΠΠ°Π²ΡΡΡΠ΅Π½ΠΎ 0 31s
ingress-nginx-controller-7fd7d8df56-68qp5 1/1 Π Π°Π±ΠΎΡΠΈ 0 48sPrometheus
Π‘Π»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Π΄ΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ ΡΡΠ΅Π· Helm ΠΎΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΡΠ°ΡΡ.
ΠΠ°ΠΌΠΈΡΠ°ΠΌΠ΅ Prometheus, ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ namespace ΠΈ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π² Π½Π΅Π³ΠΎ:
helm search repo stable | grep prometheus
kubectl create ns monitoring
helm install prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"}ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Prometheus ΠΈΠ·ΠΈΡΠΊΠ²Π° 2 Π΄ΠΈΡΠΊΠ°: Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠ°ΠΌΠΈΡ Prometheus ΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ AlertManager. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΡΡ Π½Π΅ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ storage class, Π΄ΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΡΠ²Π΅Π½ΠΈ ΠΈ pod-ΠΎΠ²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°Ρ. ΠΠ° bare metal ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΈ Π½Π° Kubernetes ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ceph rbd, Π½ΠΎ Π² ΡΠ»ΡΡΠ°Ρ Ρ Raspberry Pi, ΡΠΎΠ²Π° Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π³ΡΠ°Π½ΠΈΡΠΈΡΠ΅.
ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΡΡ local storage Π½Π° hostpath. ΠΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅ PV (persistent volume) Π·Π° prometheus-server ΠΈ prometheus-alertmanager ΡΠ° ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ Π² ΡΠ°ΠΉΠ»Π° prometheus-pv.yaml Π² . ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π·Π° PV ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π° Π΄ΠΈΡΠΊΠ° Π½Π° ΡΠ·Π΅Π»Π°, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΠ²ΡΡΠΆΠ΅ΠΌ Prometheus: Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ nodeAffinity ΠΏΠΎ hostname pi-worker ΠΈ Π½Π° Π½Π΅Π³ΠΎ ΡΠ° ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ /data/localstorage/prometheus-server ΠΈ /data/localstorage/prometheus-alertmanager.
Π‘Π²Π°Π»ΡΠΌΠ΅ (ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΠΌΠ΅) ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π² Kubernetes:
kubectl create -f prometheus-pv.yamlΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ARM Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ°. Kube-state-metrics, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π² ΡΠ°ΡΡa Prometheus, ΠΎΡΠΊΠ°Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°. Π’ΠΎΠΉ Π΄Π°Π²Π°ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°:
root@pi-control:~# kubectl -n monitoring logs prometheus-kube-state-metrics-c65b87574-l66d8
standard_init_linux.go:207: exec user process caused "exec format error"Π‘ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° ΡΠΎΠ²Π°, ΡΠ΅ Π·Π° kube-state-metrics ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠ±ΡΠ°Π· ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° CoreOS, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π·Π° ARM:
kubectl -n monitoring get deployments.apps prometheus-kube-state-metrics -o=jsonpath={.spec.template.spec.containers[].image}
quay.io/coreos/kube-state-metrics:v1.9.7Π’ΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΡΡΡ ΠΌΠ°Π»ΠΊΠΎ ΠΈ Π΄Π° Π½Π°ΠΌΠ΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, . ΠΠ° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅, ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π»ΠΈΠ·Π°, ΡΠΊΠ°Π·Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠΉ ΠΎΠ±ΡΠ°Π· Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° kube-state-metrics:
helm upgrade prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"} --set kube-state-metrics.image.repository=carlosedp/kube-state-metrics --set kube-state-metrics.image.tag=v1.9.6ΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π»ΠΎ:
root@pi-control:~# kubectl -n monitoring get po
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-df65d99d4-6d27g 2/2 Running 0 5m56s
prometheus-kube-state-metrics-5dc5fd89c6-ztmqr 1/1 Running 0 5m56s
prometheus-node-exporter-49zll 1/1 Running 0 5m51s
prometheus-node-exporter-vwl44 1/1 Running 0 4m20s
prometheus-pushgateway-c547cfc87-k28qx 1/1 Running 0 5m56s
prometheus-server-85666fd794-z9qnc 2/2 Running 0 4m52sGrafana ΠΈ cert-manager
ΠΠ° Π³ΡΠ°ΡΠΈΡΠΈΡΠ΅ ΠΈ dashboard-ΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Grafana:
helm install grafana --namespace monitoring stable/grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}ΠΠ°ΠΊΡΠ°Ρ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°Ρ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ:
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoΠΠ° Π΄Π° ΠΏΠΎΡΡΡΠ°ΠΌΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ, ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ cert-manager. ΠΠ° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ ΡΠ΅ ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ , ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° Helm:
helm repo add jetstack https://charts.jetstack.io
helm install
cert-manager jetstack/cert-manager
--namespace cert-manager
--version v0.16.0
--set installCRDs=trueΠΠ° ΡΠ°ΠΌΠΎ-ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ Π·Π° Π΄ΠΎΠΌΠ°ΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° ΡΠΎΠ²Π° Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ. ΠΠΊΠΎ ΠΎΠ±Π°ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΡΡΠΈΡ Letβs Encrypt, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΈ cluster issuer. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π½Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ βΒ».
ΠΠ· ΡΠ°ΠΌΠΈΡΡ ΠΈΠ·Π±ΡΠ°Ρ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΎΡ , ΡΠ΅ΡΠ°Π²Π°ΠΉΠΊΠΈ, ΡΠ΅ staging Π²Π°ΡΠΈΠ°Π½ΡΠ° Π½Π° LE ΡΠ΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½. ΠΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΠΌΠ΅ΠΉΠ»Π°, Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ Π² ΡΠ°ΠΉΠ» ΠΈ Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ():
kubectl create -f cert-manager-cluster-issuer.yamlΠ‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡΡΡΠ°ΠΌΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Grafana. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ Π½ΠΈ Π΅ Π½ΡΠΆΠ΅Π½ Π΄ΠΎΠΌΠ΅ΠΉΠ½ ΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΎΡ Π²ΡΠ½. ΠΠΌΠ°ΠΌ Π΄ΠΎΠΌΠ΅ΠΉΠ½, Π° ΡΡΠ°ΡΠΈΠΊΡΡ ΡΡΠΌ Π½Π°ΡΡΡΠΎΠΈΠ» Ρ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΎΠ²Π΅ 80 ΠΈ 443 Π½Π° Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΡ ΡΡΡΠ΅Ρ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ Π½Π° ingress-controllerβa:
kubectl -n ingress-nginx get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.2.206.61 80:31303/TCP,443:30498/TCP 23d80-ΡΠΈ ΠΏΠΎΡΡ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π² 31303, Π° 443 β Π² 30498. (ΠΠΎΡΡΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π²Π°ΡΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ.)
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ():
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: grafana
namespace: monitoring
spec:
dnsNames:
- grafana.home.pi
secretName: grafana-tls
issuerRef:
kind: ClusterIssuer
name: letsencrypt-stagingΠΠΎΠ±Π°Π²ΡΠΌΠ΅ Π³ΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ°:
kubectl create -f cert-manager-grafana-certificate.yamlΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΡΡΡΡ Ingress, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΡΠ° ΠΎΡ Letβs Encrypt:
root@pi-control:~# kubectl -n monitoring get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
cm-acme-http-solver-rkf8l grafana.home.pi 192.168.88.31 80 72s
grafana grafana.home.pi 192.168.88.31 80 6d17h
prometheus-server prometheus.home.pi 192.168.88.31 80 8d Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΡΠ° ΠΌΠΈΠ½Π΅, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΡΠ΅ΡΡΡΡΡΡ certificate Π΅ Π³ΠΎΡΠΎΠ², Π° Π² ΡΠΊΠ°Π·Π°Π½Π½ΠΈΡ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΠ΅ΠΊΡΠ΅Ρ grafana-tls Π΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΡ ΠΈ ΠΊΠ»ΡΡΡΡ. ΠΠΎΠΆΠ΅ΠΌ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ, ΠΊΠΎΠΉ Π΅ ΠΈΠ·Π΄Π°Π» ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°:
root@pi-control:~# kubectl -n monitoring get certificate
NAME READY SECRET AGE
grafana True grafana-tls 13m
root@pi-control:~# kubectl -n monitoring get secrets grafana-tls -ojsonpath="{.data['tls.crt']}" | base64 -d | openssl x509 -issuer -noout
issuer=CN = Fake LE Intermediate X1ΠΠ΅ΠΊΠ° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ Grafana. Π©Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π² Π½Π΅ΠΉΠ½ΠΈΡ Helm ΡΠ΅Π»ΠΈΠ·, ΠΏΡΠΎΠΌΠ΅Π½ΡΠΉΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° TLS Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΡ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.
ΠΠ° ΡΠΎΠ²Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΡΠ°ΡΡΠ°, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΠΎΡ Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ:
helm pull --untar stable/grafana Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°ΠΌΠ΅ Π² ΡΠ°ΠΉΠ»Π° grafana/values.yaml Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° TLS:
tls:
- secretName: grafana-tls
hosts:
- grafana.home.pi Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡ Prometheus ΠΊΠ°ΡΠΎ datasource:
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server:80
access: proxy
isDefault: trueΠ‘Π΅Π³Π° ΠΎΡ Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΡΠ°ΡΡ Grafana:
helm upgrade grafana --namespace monitoring ./grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"} ΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅, ΡΠ΅ Π² Ingress grafana Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ 443 ΠΏΠΎΡΡ ΠΈ ΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ HTTPS:
root@pi-control:~# kubectl -n monitoring get ing grafana
NAME CLASS HOSTS ADDRESS PORTS AGE
grafana grafana.home.pi 192.168.88.31 80, 443 63m
root@pi-control:~# curl -kI https://grafana.home.pi
HTTP/2 302
server: nginx/1.19.1
date: Tue, 28 Jul 2020 19:01:31 GMT
content-type: text/html; charset=utf-8
cache-control: no-cache
expires: -1
location: /login
pragma: no-cache
set-cookie: redirect_to=; Path=/; HttpOnly; SameSite=Lax
x-frame-options: deny
strict-transport-security: max-age=15724800; includeSubDomainsΠΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° Grafana Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ . ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°:

Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ dashboard Π·Π° node exporter: ΡΠΎΠΉ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Ρ "ΠΌΠ°Π»ΠΈΠ½Π°" (Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° CPU, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, ΠΌΡΠ΅ΠΆΠ°, Π΄ΠΈΡΠΊ ΠΈ Ρ.Π½.).
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠΈΡΠ°ΠΌ, ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΅ Π³ΠΎΡΠΎΠ² Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° ΠΈ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ!
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ° ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠ±ΠΎΡΠΊΠ°ΡΠ°
ΠΠ° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π° ARM Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈΠΌΠ° ΠΏΠΎΠ½Π΅ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ°. ΠΡΡΠ²ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°ΡΠ΅ Π½Π° ARM ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΠ±Π°ΡΠ΅, Π²ΠΈΠΆΠ΄Π°ΠΉΠΊΠΈ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΎΡΡ Π½Π° Π΄Π²Π°ΡΠ° Raspberry Pi, ΠΎΡΡΠ·Π½Π°Ρ , ΡΠ΅ Π΄ΠΎΡΠΈ ΠΈ Π·Π° ΡΠ±ΠΎΡΠΊΠ°ΡΠ° ΡΠ΅ Π½Π΅ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΠΈΠ»Π½ΠΈ. ΠΠ°ΡΠΎΠ²Π° ΠΏΠΎΡΡΡΠ°Ρ Π½ΠΎΠ² Raspberry Pi 4 (ΡΠΎΠ·ΠΈ Π΅ ΠΏΠΎ-ΠΌΠΎΡΠ΅Π½ ΠΈ ΠΈΠΌΠ° ΡΠ΅Π»ΠΈ 4 GB ΠΏΠ°ΠΌΠ΅Ρ) β ΠΏΠ»Π°Π½ΠΈΡΠ°ΠΌ Π΄Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°ΠΌ Π½Π° Π½Π΅Π³ΠΎ.
ΠΡΠΎΡΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ - ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅Π½ Docker ΠΎΠ±ΡΠ°Π· Π½Π° ΠΏΠΎ-ΠΌΠΎΡΠ½Π° ΠΌΠ°ΡΠΈΠ½Π°. ΠΠ° ΡΠΎΠ²Π° ΠΈΠΌΠ° . ΠΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ Π΅Π·ΠΈΠΊ, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΊΡΠΎΡ-ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π·Π° ARM. ΠΡΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌ Π²ΡΠΈΡΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ°ΡΠΈΡ. ΠΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ "ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈ" ΠΎΠ±ΡΠ°Π·ΠΈ: Docker, ΡΠ°Π±ΠΎΡΠ΅Ρ Π½Π° ARM ΠΌΠ°ΡΠΈΠ½Π°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»Ρ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ ΠΎΠ±ΡΠ°Π· Π·Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Π½Π°Π΄ΠΌΠΈΠ½Π°Ρ Π° Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡ: [Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎ] "Π²Π°Π½ΠΈΠ»ΠΎΠ²" Kubernetes Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° Π±Π°Π·Π° ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΡΡΠ° Π΄ΠΎΠ±ΡΠ΅ Π½Π° ARM, Π° ΡΠ°ΠΌΠΎ ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΌΡ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π° Π½ΡΠΊΠΎΠΈ Π½ΡΠ°Π½ΡΠΈ.
Π‘Π°ΠΌΠΈ Raspberry Pi 3B+ ΠΈΠ·Π΄ΡΡΠΆΠ°Ρ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° CPU, Π½ΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ SD ΠΊΠ°ΡΡΠΈ ΡΠ° ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΡΠ΅ΡΠ΅Π½ Π±ΡΡΠΈΠ»Π΅Π½ Π³ΡΡΠ»ΠΎ. ΠΠΎΠ»Π΅Π³ΠΈ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ Π°, ΡΠ΅ Π² Π½ΡΠΊΠΎΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ ΠΎΡ USB, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ SSD: ΡΠΎΠ³Π°Π²Π° ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° CPU ΠΏΡΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Grafana:

ΠΠ° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ ΠΈ "Π·Π° ΠΏΡΠΎΠ±Π°", ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½, Kubernetes ΠΊΠ»Π°ΡΡΠ΅Ρ Π½Π° "ΠΌΠ°Π»ΠΈΠ½ΠΈ" ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° ΡΡΠ΅ΡΠ°Π½ΠΈΡΡΠ° ΠΎΡ Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡΡΠ°, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΡΡΠΈΡΡ Minikube, Π·Π°ΡΠΎΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΠ° ΠΊΠ°ΠΊΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΡΠ°Π±ΠΎΡΡΡ "ΠΏΠΎ-Π²ΡΠ·ΡΠ°ΡΡΠ΅Π½".
Π ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π° ΠΈΠΌΠ°ΠΌ ΠΈΠ΄Π΅Ρ Π΄Π° Π΄ΠΎΠ±Π°Π²Ρ ΠΊΡΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΠ΅Π»ΠΈΡ ΡΠΈΠΊΡΠ» CI/CD, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΈΠ·ΡΡΠ»ΠΎ Π½Π° Raspberry Pi. Π©Π΅ Π±ΡΠ΄Π° ΡΠ°ΡΡΠ»ΠΈΠ², Π°ΠΊΠΎ Π½ΡΠΊΠΎΠΉ ΡΠΏΠΎΠ΄Π΅Π»ΠΈ ΡΠ²ΠΎΡ ΠΎΠΏΠΈΡ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° K8s Π½Π° AWS Graviton-ΠΈ.
P.S. ΠΠ°, "ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΡΠ°" ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΠΎ-Π±Π»ΠΈΠ·ΠΎ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠΈ ΠΌΠΈΡΠ»Π΅Ρ :

P.P.S.
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΡΡΠΎ Π² Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³:
- «».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
