Sziasztok,
statefulset krealasa utan a kovetkezo allapot nem valt at Running-ba:
mysql-set-mig-1 0/1 ContainerCreating 0 4m25s
# kubectl get events -n testns --sort-by='.metadata.creationTimestamp'
.
.
.
61s Normal Created pod/mysql-set-mig-0 Created container mysql
60s Normal Scheduled pod/mysql-set-mig-1 Successfully assigned testns/mysql-set-mig-1 to xxxxxxx
61s Warning FailedAttachVolume pod/mysql-set-mig-1 Multi-Attach error for volume "pvc-xxx-xxxx-xxxx-xxxx-xxxx
xxxxx" Volume is already used by pod(s) mysql-set-mig-0
Azt olvastam, hogy a pvc-t RWO (ReadWriteOnce) helyett RWX (ReadWriteMany) kene hasznalnom, amit azonban a cluster nem enged.
Hiba:
Failed to provision volume with StorageClass "vsphere": invalid AccessModes [ReadWriteMany]:
only AccessModes [ReadWriteOnce] are supported
Hogy lehetne ezt a hibat orvosolni?
Koszonom elore a segitseget.
Ardi
- 363 megtekintés
Hozzászólások
Olyan storage class kéne neked ami támogatja ezt a működést. NFS például szerintem ilyen.
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
Epp az NFS-t emegettek valahol - megvarom, mit ir vissza a support.
Addig is koszi a tippet.Ardi
- A hozzászóláshoz be kell jelentkezni
Hol csinálod ezt melyik cloudba?
Azure alatt a storage account nem játszott samba-val, csak a managed disk.
A network storagek nem lesznek jók neki, szinte tuti.
Jah és bocsika, belefutottál egy kezdő problémába :)
Multi-Attach
Mysql nem fog menni neked multi pod-ban. Nem tudod 2 pod-ból használni ugyanazt a storage-t.
Ha több mysql-t szeretnél, akkor két totál különállót kell kreálnod és replikálnod.
Egyébként cloudban ellenjavalt alapvetően a konténeres db. Arra vannak a drága PaaS -ok.
- A hozzászóláshoz be kell jelentkezni
szerk ide:
írja is amúgy tök egyértelműen a hibát, hogy nem faxa a ReadWriteMany, helyette kell a ReadWriteOnce. A many pont arra van, ha többen akarják egyszerre írni. Itt ez nem játszik. Az is lehet csak azt kell visszatoszni once-ra, de sztem a network volume nem lesz jó.
- A hozzászóláshoz be kell jelentkezni
Hello,
ReadWriteOnce eseten kapom a hibat.
# kubectl get events -n testns --sort-by='.metadata.creationTimestamp'
.
.
.
61s Normal Created pod/mysql-set-mig-0 Created container mysql
60s Normal Scheduled pod/mysql-set-mig-1 Successfully assigned testns/mysql-set-mig-1 to xxxxxxx
61s Warning FailedAttachVolume pod/mysql-set-mig-1 Multi-Attach error for volume "pvc-xxx-xxxx-xxxx-xxxx-xxxx
xxxxx" Volume is already used by pod(s) mysql-set-mig-0
amugy egy mysql-t szeretnek, vmi backuppal. Azt hittem, ez a megoldas jo lesz ra.
Ardi
- A hozzászóláshoz be kell jelentkezni
Továbbra se írtad, hogy melyik cloud, vagy sima földi szerver saját clusterrel?
Ott írja amúgy tök egyértelműen amit mondtam.
2 podod van, gondolom replikák
mysql-set-mig-0
mysql-set-mig-1
Mysql-es pod nem fog menni replicas -al. Felejtsed el.
Sőt a klasszikus Deployment objektum is bepusztulhat ha RollingUpdate-al megy, pont ezért mert nem használhatja ugyanazt a volume-t 2 mysql egyszerre. Emiatt speciel a statefullset mondjuk oké mert nem RollingUpdate-zel. Csak épp a deployok lesznek downtime-osok.
De a replikákat felejtsed el mysql esetén. Ez nem lenne amúgy se backup, mert csak a szoftver van replikálva, a tárolás mögötte közös.
Ha igazi backupot akarsz, akkor csinálj rá kubernetesben cronjob-ot és x időnként nyomj egy mysqldump-ot targz-vel amit elmozgatsz egy távoli meghajtóra.
- A hozzászóláshoz be kell jelentkezni
kubernetes/Rancher alatt Statefulset volt letrehozva.
Ez alapjan probaltam:
https://loft.sh/blog/kubernetes-statefulset-examples-and-best-practices/
Az en esetemben:
replicas: 2
Ardi
- A hozzászóláshoz be kell jelentkezni
Ez arról szól, hogy külön volume-t kap mindegyik mysql pod, tehát önálló storage-t és nem megosztott nfs-t.
Közöttük pedig data-in replication van belőve.
Titok továbbra is, hogy milyen cloud?
- A hozzászóláshoz be kell jelentkezni
cegi private cloud.
Ardi
- A hozzászóláshoz be kell jelentkezni
Vagyis on prem.
Mindenképp kell az nfs? Ha replicas: 1, akkor megy vele?
Ha igen, akkor definiálj külön backup podot, annak külön nfs mappát. Aztán mehet a data-in replication. De sztem az nfs nem lesz jó, ha esetleg el is indul, nem lesz kielégítő a minőség.
Akkor már hostPath
- A hozzászóláshoz be kell jelentkezni
nem irtam, hogy hasznalok nfs-t, talan nem is tudok.
De megprobalom replica: 1-gyel.
- A hozzászóláshoz be kell jelentkezni
Bocsánat, félreolvastam. Milyen volume-t használsz akkor?
- A hozzászóláshoz be kell jelentkezni
a pvc ezt tartalmazza:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 33Gi
storageClassName: "vsphere"
volumeMode: Filesystem
- A hozzászóláshoz be kell jelentkezni
Ez vmi Vmware-s cucc lesz ahogy nézem, akkor nem network volume.
Ebben az esetben még jó is lehet. Csak tényleg azt kell megoldanod, hogy külön volume legyen a pod-oknak és ne osztozzanak.
- A hozzászóláshoz be kell jelentkezni
ok - megnezem az uj replikaval es ha kell, krealok uj pvc-t.
majd visszajelzek, mire jutottam.
Koszike,
ardi
- A hozzászóláshoz be kell jelentkezni
Mukodik.
Most ott akadtam meg, hogy mysql-client podban probalok bejutni az adatbazisba, de nem tudom a nevet.
A pelda szerint:
For access, you will need a MySQL server name. The syntax of the MySQL server in the Kubernetes cluster is given below:
stateful_name-ordinal_number.mysql.default.svc.cluster.local
#Example
mysql-set-0.mysql.default.svc.cluster.local
mysql -u root -p -h mysql-set-mig-0.default.svc.cluster.local
Enter password:
ERROR 2005 (HY000): Unknown MySQL server host 'mysql-set-mig-0.default.svc.cluster.local' (-2)
$
Hol talalom meg a clusteremben a FQDN-et?
Ardi
- A hozzászóláshoz be kell jelentkezni
Alapvetően sehol.
Nyitnod kell kifelé egy portot, jellemzően Service objektummal, NodePort-al.
https://stackoverflow.com/questions/57030925/how-do-i-access-mysql-as-a…
Nem túl szerencsés kinyitni a külvilág felé.
Ez localhoston menne is valszeg 127.0.0.1 -el, kifelé, hát már más lenne a sztori, a node ip-vel megy elvileg. Viszont fene tudja milyen beállításaid vannak a clusterben, tűzfal, stb.
Kezdetnek kubectl exec-el be tudsz lépni a pod-ba, és ott már van mysql parancsod.
Valszeg egyszerűbb lenne feltenned valami webes klienst a mysql mellé külön pod-ban, pl (fujj) phpmyadmin-t ami csatlakozik rá. Ahhoz mondjuk kicsit ingress-ezni kellene, illetve érdemes az alap auth mellé legaláb egy basic auth-ot is betenni fölé.
- A hozzászóláshoz be kell jelentkezni
probaltam a legegyszeubbet, felmasztam a podra, de ez fogadott:
bash-4.4# mysql -u root -h localhost -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
bash-4.4#
- A hozzászóláshoz be kell jelentkezni
csak annyit mondj neki, hogy mysql [enter]
semmi username, host, jelszó, stb.
- A hozzászóláshoz be kell jelentkezni
sh-4.4# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
sh-4.4#
- A hozzászóláshoz be kell jelentkezni
oké, adtál neki vmit env var-ok között?
- A hozzászóláshoz be kell jelentkezni
bocsi - nalam volt a hiba. rossz jelszot adtam meg:
sh-4.4# /usr/bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.1.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
legalabb ez megy. koszonom.
- A hozzászóláshoz be kell jelentkezni
cool
- A hozzászóláshoz be kell jelentkezni
A leírás alapján már kell legyen "mysql" nevű serviced ha megcsináltad a "Create a Service for the StatefulSet Application"-ban leírtakat.
kubectl get services -outputjába benne kell legyen a service, namespacen belül simán "mysql"-re lesz dns feloldásod AFAIK.
De egy "kubectl get all" output is hasznos lehet nekünk a debuggoláshoz.
- A hozzászóláshoz be kell jelentkezni
nos igen, van mar service mysql nev alatt.
$ kubectl get all -n testns
NAME READY STATUS RESTARTS AGE
pod/mysql-client 1/1 Running 0 84m
pod/mysql-set-mig-0 1/1 Running 0 16m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP None <none> 3306/TCP 17h
NAME READY AGE
statefulset.apps/mysql-set-mig 1/1 123m
$ kubectl get svc -n testns|grep mysql
mysql ClusterIP None <none> 3306/TCP 18h
Ennyit tudtam kinyerni.
Ardi
- A hozzászóláshoz be kell jelentkezni
na hát akkor namspacen belül eléred "mysql" néven, namespacen kívül meg sokféleképpen pl mysql.testns vagy mysql.testns.svc, etc.
- A hozzászóláshoz be kell jelentkezni
Nyilván kívülről szeretné elérni, ahhoz pedig ip cím lesz csak.
- A hozzászóláshoz be kell jelentkezni
most ha kivulrol szeretnem, honnan kapom az ip cimet?
Gondolom a nevet (hostname + FQDN) az ingress-ben tudom megszerkeszteni...
Ardi
- A hozzászóláshoz be kell jelentkezni
Negatív. Ingress http kérésekre van kitalálva, mögötte egy nginx LB-vel.
Tudnod kellene a node külső ip címét, amire ki van bind-olva a port.
ez elvileg kiadja mint external ip:
kubectl get nodes -o wide
(nem próbáltam még külső ip-re kitenni mysql portot, nem voltam ennyire elvetemült. Szóval próbáld ki)
[szerk]:
nehezítés, ha multi node-s a cucc. nem mind1 melyik node-n fut a konténer.
- A hozzászóláshoz be kell jelentkezni
uff, meeg olvasok par dolgot a weben - koszi a tippeket.
sajna, a : kubectl get nodes -o wide
tiltva van szamomra.
Ardi
- A hozzászóláshoz be kell jelentkezni
valszeg nem véletlenül :)
mysql konténerből még ezzel megnézheted az ip címedet, bár nem garantált, hogy valóban a node ip-ről megy ki a kérés:
curl ifconfig.me
- A hozzászóláshoz be kell jelentkezni
jól értem, hogy azt tanácsolod hogy a workeren futó podra próbáljon meg csatlakozni? a workereknek nem tűzfal mögött kéne csücsülniük? akkor már miért nem inkább kubectl port-forward? de ez is csak debugra jó, amúgy NodePort kell neki (on premen LoadBalancer gondolom nicns konfigurálva)
- A hozzászóláshoz be kell jelentkezni
Javíts ki ha tévednék, de LB továbbra is http kéréseket kezel (legalábis a felhőkben), ergó mysql nem fog kimenni rajta.
Tanácsolni nem tanácsolom, mert szerintem nem jó ötlet, sztem debugra se, illetve ahogy én is írtam feljebb, kéne legyen tűzfal vagy valami rá.
Mindenesetre edukációs jelleggel lehet játszani vele.
Azure alatt belülre nyitottam simán Node-ra portot, igaz az http volt, de nem LB típus volt. Externálba még nem próbáltam, de lassan kíváncsi leszek és kipróbálom DO alatt (most abban dolgozom).
- A hozzászóláshoz be kell jelentkezni
Kész is, ezzel spec megy....
A droplet (VM) azaz a node ip címén el lehet érni a mysql-t a 30000 -es porton. fujj.....
apiVersion: v1
kind: Namespace
metadata:
name: mysql-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
namespace: mysql-test
labels:
app: mysql-app
spec:
replicas: 1
selector:
matchLabels:
app: mysql-app
template:
metadata:
labels:
app: mysql-app
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_ROOT_PASSWORD
value: root
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: mysql-test
spec:
type: NodePort
selector:
app: mysql-app
ports:
- port: 3306
targetPort: 3306
nodePort: 30000
- A hozzászóláshoz be kell jelentkezni
Egyébként hazudtam, megnézve, tud az a felhős LB bármilyen tcp portot.
- A hozzászóláshoz be kell jelentkezni
Jaja, NodePort meg LB jó non-http kapcsolatokra, de őszintén megvalva sajnos nincs velük sok tapasztalatom.
- A hozzászóláshoz be kell jelentkezni
es akkor mysql.testns.svc.cluster.local a teljes nev, ami alatt elerheto a clusteren belul
<service-name>.<namespace>.svc.cluster.local sema szerint?
Ardi
- A hozzászóláshoz be kell jelentkezni
igen, de a <service-name>.<namespace>.svc és talán a <service-name>.<namespace> is működik
- A hozzászóláshoz be kell jelentkezni
Ez egy nagyon tipikus Kubernetes jelenség.
Látszólag egyszerűen lehet(ne) fault-tolerant high-available mysql-t csinálni.
De nem így, ez nem lesz jó megoldás.
A Kubernetes se csodaszer, elejétől a végéig végig kéne gondolni a működést.
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
... azaz végig kéne gondolni hogy:
- tényleg akarom-e a mysql replikációt?
- hogyan akarom a mysql replikációt?
Mert a jelen setup egyelőre annyit sugall hogy valamiért akarsz két mysql-t egymás mellé, hogy azok milyen viszonyban vannak egymással arról semmit sem tudunk.
Ettől fogg függeni hogy a ReadWriteOnce vagy a ReadWriteMany kell-e neked a pvc-re.
Éééés majd ettől fog függeni hogy a vmware storage class megfelel-e vagy valami mást kell keresni.
Ha a "microservice" felől közelítünk akkor már a statefulset se annyira "konform", de a ReadWriteMany storage pláne nem. Érdemes ezekről tudni hogy ezek a Kubernetes filozófiába mind-mind a gyakorlati életből adódó, muszájból belekínlódott dolgok.
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
A doksi amit linkelt elég világosan fogalmaz:
Remember that while Kubernetes helps you set up a stateful application, you will need to set up the data cloning and data sync by yourself. This cannot be done by the StatefulSets.
Szóval a doksi segít csinánlni 3 mysql podot saját RWO volumeokkal + a szükséges servicet és utána az adatok szinkronizációját baszd össze úgy ahogy tudod, hibátlan! :D
- A hozzászóláshoz be kell jelentkezni
Hol a probléma? Kubi csak a környezetet adja, nem dolga a mysql-eket összekapcsolgatni. Ráadásul a doksi se a mysql-ről szólt alapvetően, hanem a statefulset -ről.
- A hozzászóláshoz be kell jelentkezni
nincs probléma, tisztában vagyok vele, hogy a kubinak nem dolga a mysqlt összekapcsolni, de mégis hiányárzetem támad (igen ez szubjektív) a doksit akkor tekinteném teljesenek ha leírták volna hogyan rakd össze azt a mysql master slave clustert kubernetes alatt, hamár ezzel példálóznak vagy legalább linkelnének róla egy doksit/blogot.
- A hozzászóláshoz be kell jelentkezni
Tény, hogy beginner sztorinak betehettek volna inkább egy nginx/apache2-s példát is. Bár ott kevésbé lenne "látványos" a külön volume podonként.
Szerintem nagyon elvitte volna a témát ha belemennek a mysql-be is, linkelni lehetett volna, tény, hogy egy master-slave nem nagy kunszt.
- A hozzászóláshoz be kell jelentkezni
Az első problémáig hibátlan lesz, hidd el!
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
Azt nezd meg, hogy kulon pvc-t hasznal-e a 2 mysql pod, ha nem akkor az konfig hiba es kulon pvc kell nekik.
De valoszinu valami mysql operatorral (vagy valami mukodo megoldassal) lett kirakva ami ezt rendesen kulon pvc-kent kezeli, ez esetben a gondod nem azzal lesz, hanem a vsphere-csi-driver/kubelet/stb. hibaja miatt nem tudta lecsatolni rendesen (vagy legalabbis vmware azt hiszi) arrol a node-rol a pvc-t ahol korabban futott ez a pod, ezert most mikor indulna masik node-on akkor nem engedi felcsatolni, mert (azt hiszi) meg fel van csatolva a masik node-on.
Ilyenkor vsphere-csi-controller, vsphere-csi-node logokat erdemes atnezni, illetve annak a node-nak a kubelet logjait amin korabban futott a pod. Illetve ezeknek ujrainditasaval lehet probalkozni, esetleg ezek ujrainditasaval.
Illetve erdemes lehet megnezni csi driver frissitest ha regen volt, sok hasonlo hibat is javitottak.
(Amennyiben ez meg valami regebbi rendszer es in-tree vsphere csi van hasznalva, tehat ami meg a kubelet resze es nem futnak kulon ilyen vpshere-csi podok akkor arrol erdemes lenne migralni.)
- A hozzászóláshoz be kell jelentkezni
Az RWO access mode azt jelenti, hogy csak azonos node-on levo pod-ok mountolhatjak.
Lasd: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Tehat ha definialsz a ket mysql pod kozott hard pod dependenciat ugy, hogy a topologia domain a hostname legyen, akkor egy node-on indulnak el a podok, es nem lesz mount gond.
- A hozzászóláshoz be kell jelentkezni