Difference between revisions of "Google Kubernetes Engine"
(→kubectl kontextus) |
(→Klaszter létrehozás) |
||
(26 intermediate revisions by the same user not shown) | |||
Line 3: | Line 3: | ||
=Regisztráció a Google Cloud Platform-ban= | =Regisztráció a Google Cloud Platform-ban= | ||
https://console.cloud.google.com | https://console.cloud.google.com | ||
− | + | <br> | |
Kubernetes Engine API aktiválása a projektben: | Kubernetes Engine API aktiválása a projektben: | ||
:[[File:ClipCapIt-190621-232945.PNG]] | :[[File:ClipCapIt-190621-232945.PNG]] | ||
− | + | <br> | |
+ | <br> | ||
Majd a keresőbe írjuk be, hogy Kubernetes. Ekkor bejön | Majd a keresőbe írjuk be, hogy Kubernetes. Ekkor bejön | ||
:[[File:ClipCapIt-190621-233149.PNG]] | :[[File:ClipCapIt-190621-233149.PNG]] | ||
− | + | <br> | |
+ | <br> | ||
Kattintsunk az Enable-re. | Kattintsunk az Enable-re. | ||
:[[File:ClipCapIt-190621-233720.PNG]] | :[[File:ClipCapIt-190621-233720.PNG]] | ||
− | + | <br> | |
+ | <br> | ||
... | ... | ||
Line 18: | Line 21: | ||
:[[File:ClipCapIt-190622-000203.PNG]] | :[[File:ClipCapIt-190622-000203.PNG]] | ||
+ | <br> | ||
+ | <br> | ||
=Google Cloud SDK beállítása= | =Google Cloud SDK beállítása= | ||
Line 56: | Line 61: | ||
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/adamproject1]. | Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/adamproject1]. | ||
</pre> | </pre> | ||
+ | <br> | ||
+ | Listázzuk ki az összes projektet: | ||
<pre> | <pre> | ||
# gcloud projects list | # gcloud projects list | ||
PROJECT_ID NAME PROJECT_NUMBER | PROJECT_ID NAME PROJECT_NUMBER | ||
adamproject1 adamproject1 206600067398 | adamproject1 adamproject1 206600067398 | ||
+ | leafy-firmament-183906 My Project 23184 1046937073531 | ||
+ | optimum-agent-244420 My First Project 174610655273 | ||
</pre> | </pre> | ||
Line 67: | Line 76: | ||
# gcloud config set project adamproject1 | # gcloud config set project adamproject1 | ||
</pre> | </pre> | ||
− | + | * az új projektet hozzá kell rendeli egy billing account-hoz (amihez a bankszámlát beállítottuk | |
− | + | * be kell rajta kapcsolni a Kubernetes Engine API-t. <br> | |
https://console.cloud.google.com/apis/library/container.googleapis.com?project=adamproject1 | https://console.cloud.google.com/apis/library/container.googleapis.com?project=adamproject1 | ||
− | + | <br> | |
− | + | Projekt törlése: | |
<pre> | <pre> | ||
− | # | + | # gcloud projects delete leafy-firmament-183906 |
− | + | Your project will be deleted. | |
− | + | Do you want to continue (Y/n)? Y | |
− | |||
+ | Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/leafy-firmament-183906]. | ||
− | + | You can undo this operation for a limited period by running ' | |
− | + | commands below. See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects | |
− | + | $ gcloud projects undelete leafy-firmament-183906 | |
</pre> | </pre> | ||
− | + | <br> | |
==Bejelentkezés és kubectl== | ==Bejelentkezés és kubectl== | ||
− | + | A gcloud bejelentkezési adatait a '''config list''' paranccsal lehet lekérni: | |
<pre> | <pre> | ||
# gcloud config list | # gcloud config list | ||
Line 103: | Line 112: | ||
+ | A '''config-helper''' paranccsal pedig a tokent is listázni lehet: | ||
<pre> | <pre> | ||
# gcloud config config-helper | # gcloud config config-helper | ||
Line 122: | Line 132: | ||
<br> | <br> | ||
===kubectl kontextus=== | ===kubectl kontextus=== | ||
− | A kubectl konfigurációs fájlja itt van: ~/.kube/config. Minikube esetében ez így néz ki: | + | A kubectl konfigurációs fájlja itt van: '''~/.kube/config'''. Minikube esetében ez így néz ki: |
<source lang="C++"> | <source lang="C++"> | ||
apiVersion: v1 | apiVersion: v1 | ||
Line 144: | Line 154: | ||
</source> | </source> | ||
− | Miden egyes kubectl parancs a kiválasztott kontextusban fut le. Minden kontextus tartalmaz egy klasztert és egy user-t, amivel végrehajtjuk a parancsokat a klaszteren. A current-context mutatja meg, hogy melyik kontextus van kiválasztva. | + | Miden egyes '''kubectl''' parancs a kiválasztott kontextusban fut le. Minden kontextus tartalmaz egy klasztert és egy user-t, amivel végrehajtjuk a parancsokat a klaszteren. A '''current-context''' mutatja meg, hogy melyik kontextus van kiválasztva. |
− | Mikor létrehozunk egy cluster-t a '''gcloud containter cluster''' paranccsal, akkor a gcloud automatikusan hozzáad egy új kontextust a .kube/config fájlhoz: | + | Mikor létrehozunk egy cluster-t a '''gcloud containter cluster create''' paranccsal, akkor a gcloud automatikusan hozzáad egy új kontextust a '''.kube/config''' fájlhoz: |
<pre> | <pre> | ||
− | # gcloud container clusters | + | # gcloud container clusters create adam1 |
... | ... | ||
kubeconfig entry generated for adam1. | kubeconfig entry generated for adam1. | ||
Line 159: | Line 169: | ||
gke_adamproject1_europe-west6_adam1 | gke_adamproject1_europe-west6_adam1 | ||
</pre> | </pre> | ||
+ | Láthatjuk, hogy a gcloud átállította a kontextust a GKE klaszerünkre. | ||
+ | |||
És most nézzük bele a config fájlba: | És most nézzük bele a config fájlba: | ||
Line 199: | Line 211: | ||
client-key: /root/.minikube/client.key | client-key: /root/.minikube/client.key | ||
</source> | </source> | ||
+ | Láthatjuk, hogy a GKE klaszterhez user-hez a beállításokat a '''gcloud config config-helper''' paranccsal gyűjti be. | ||
+ | |||
Ahhoz hogy visszaváltsunk a minikube kontextusra, csak ki kell adni '''config use-context''' parancsot. | Ahhoz hogy visszaváltsunk a minikube kontextusra, csak ki kell adni '''config use-context''' parancsot. | ||
Line 209: | Line 223: | ||
=Klaszter létrehozás= | =Klaszter létrehozás= | ||
+ | |||
+ | A '''gcloud container cluster create''' parancsnak első sorban azt kell megadni, hogy milyen típusú virtuális gépet szeretnénk készíteni, ez jelentősen befolyásolni fogja az árat. Az elérhető virtuális gépe listáját a '''machine-types list''' paranccsal listázhatjuk: | ||
+ | <pre> | ||
+ | $ gcloud compute machine-types list | ||
+ | NAME ZONE CPUS MEMORY_GB DEPRECATED | ||
+ | f1-micro us-central1-f 1 0.60 | ||
+ | g1-small us-central1-f 1 1.70 | ||
+ | n1-highcpu-16 us-central1-f 16 14.40 | ||
+ | n1-highcpu-2 us-central1-f 2 1.80 | ||
+ | n1-highcpu-32 us-central1-f 32 28.80 | ||
+ | ... | ||
+ | </pre> | ||
+ | |||
+ | A cluster létrehozásához meg kell adni azt is, hogy milyen régióban és azon belül milyen lehetséges zónákban jöjjenek létre a Kubernetes node-ok. A lehetséges zónákat a régiókkal együtt a '''compute zones list''' paranccsal listázhatjuk, ebből kell válogatni: | ||
+ | <pre> | ||
+ | # gcloud compute zones list | grep europe-west6 | ||
+ | europe-west6-a europe-west6 UP | ||
+ | europe-west6-b europe-west6 UP | ||
+ | europe-west6-c europe-west6 UP | ||
+ | </pre> | ||
+ | Láthatjuk, hogy a '''europe-west6''' régió három zónából áll, itt fogjuk létrehozni a klasztert. A zónákat vesszővel elválasztva kell megadni, space nélkül. | ||
+ | |||
Line 222: | Line 258: | ||
--min-nodes 1 | --min-nodes 1 | ||
</pre> | </pre> | ||
+ | {{warning|A '''num-nodes''' értéké zónákra fog vonatkozni. Ha a node-locations-ben három zónát sorolunk föl, és a num-nodes értéke 2, akkor összesen 6 node fog létrejönni}} | ||
+ | |||
+ | <br> | ||
<pre> | <pre> | ||
Line 229: | Line 268: | ||
adam1 europe-west6 1.12.8-gke.10 34.65.149.13 n1-standard-1 1.12.8-gke.10 3 RUNNING | adam1 europe-west6 1.12.8-gke.10 34.65.149.13 n1-standard-1 1.12.8-gke.10 3 RUNNING | ||
</pre> | </pre> | ||
− | Menjünk a Kubernetes Engine felületre, és itt válasszuk a Cluster menüpontot: https://console.cloud.google.com/kubernetes | + | <br> |
+ | |||
+ | Listázzuk a cluster-eket: | ||
+ | <pre> | ||
+ | # gcloud container clusters list | ||
+ | NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS | ||
+ | adam1 europe-west6 1.12.8-gke.10 34.65.250.80 n1-standard-1 1.12.8-gke.10 3 RUNNING | ||
+ | </pre> | ||
+ | <br> | ||
+ | |||
+ | És nézzük meg a web-es konzolon is. Menjünk a Kubernetes Engine felületre, és itt válasszuk a Cluster menüpontot: https://console.cloud.google.com/kubernetes | ||
:[[File:ClipCapIt-190621-235437.PNG]] | :[[File:ClipCapIt-190621-235437.PNG]] | ||
Line 249: | Line 298: | ||
Do you want to continue (Y/n)? Y | Do you want to continue (Y/n)? Y | ||
</pre> | </pre> | ||
+ | <br> | ||
+ | |||
+ | ===Node pool=== | ||
+ | Minden cluster-hez rendelve van egy node pool amit így listázhatunk: | ||
+ | <pre> | ||
+ | # gcloud container node-pools list --region europe-west6 --cluster adam1 | ||
+ | NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION | ||
+ | default-pool n1-standard-2 100 1.13.10-gke.0 | ||
+ | </pre> | ||
+ | |||
+ | Ezt a konzolon, a klaszter részletek oldal alján láthatjuk: | ||
+ | :[[File:ClipCapIt-191017-214842.PNG]] | ||
+ | <br> | ||
+ | |||
+ | A pool-t a cluster resize paranccsal méretezhetjük át: | ||
+ | <pre> | ||
+ | gcloud container clusters resize [CLUSTER_NAME] --node-pool [POOL_NAME] --num-nodes [NUM_NODES] | ||
+ | </pre> | ||
+ | |||
+ | Ez az adam1 cluster-re az alábbi: | ||
+ | <pre> | ||
+ | # gcloud container clusters resize adam1 --node-pool default-pool \ | ||
+ | --num-nodes 2 --region europe-west6 | ||
+ | Pool [default-pool] for [adam1] will be resized to 2. | ||
+ | |||
+ | Do you want to continue (Y/n)? y | ||
+ | |||
+ | Resizing adam1...done. | ||
+ | Updated [https://container.googleapis.com/v1/projects/adamproject1/zones/europe-west6/clusters/adam1]. | ||
+ | </pre> | ||
+ | {{warning|A node számot zónánkét kell érteni. Ha 2-re állítjuk és három zónában van a klaszterünk, akkor összesen 6 node lesz a pool-ban}} | ||
+ | |||
+ | |||
+ | <br> | ||
+ | <br> | ||
+ | |||
+ | =Hálózat= | ||
+ | |||
+ | A GKE klaszterben a node-nak van egy external és egy internal IP-je. Az external IP egy publikus IP cím. Ha készítünk egy nodePort-os Kubernetes service-t, akkor a node publikus IP -n és a service portján elérhetőek lesznek a service-hez tartozó pod-ok. | ||
+ | Listázzuk a node-okat a -o wide kapcsolóval. Az '''EXTERNAL-IP''' oszlopban valós, publikus (dinamikusan kiosztott) IP címek szerepelnek. | ||
+ | <pre> | ||
+ | # kubectl get nodes -o wide | ||
+ | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP | ||
+ | gke-adam1-default-pool-67fe18ad-3v96 Ready <none> 14m v1.12.8-gke.10 10.172.0.12 34.65.193.16 | ||
+ | gke-adam1-default-pool-75a1a9b3-slpl Ready <none> 14m v1.12.8-gke.10 10.172.0.13 34.65.84.196 | ||
+ | gke-adam1-default-pool-eaf55b7a-9kb3 Ready <none> 14m v1.12.8-gke.10 10.172.0.11 34.65.22.212 | ||
+ | </pre> | ||
+ | <br> | ||
+ | <br> | ||
+ | A node-ok egy '''VPC''' (Virtaul Private Cloud) hálózatra vannak kötve. Azt, hogy milyen portok vannak nyitva a VPC-n, tűzfal szabályok szabályozzák (firewall-rules). | ||
+ | <pre> | ||
+ | # gcloud compute firewall-rules list | ||
+ | NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED | ||
+ | default-allow-icmp default INGRESS 65534 icmp False False | ||
+ | default-allow-ssh default INGRESS 65534 tcp:22 False | ||
+ | ... | ||
+ | </pre> | ||
+ | Láthatjuk, hogy a klaszerünkben a 22-es (SSH) port alapértelmezetten nyitva van. | ||
+ | <br> | ||
+ | <br> | ||
+ | A VPC-vel kapcsolatos beállításokat a Web-es konzolon a VPC network menüpotban végezhetjük el: | ||
+ | :[[File:ClipCapIt-190626-222945.PNG]] | ||
+ | <br> | ||
+ | <br> | ||
+ | Itt megtekinthetjük a fent listázott tűzfal szabályokat: | ||
+ | :[[File:ClipCapIt-190626-223154.PNG]] | ||
+ | <br> | ||
+ | <br> | ||
+ | Az '''External IP addresses''' menüpontban megtekinthetjük a Google Cloud Platform-on használt publikus IP címeinket. Jelenleg a három node-os Kubernetes klaszterünk mindegyik node-jához tartozik egy publikus IP cím: | ||
+ | :[[File:ClipCapIt-190626-223532.PNG]] | ||
+ | <br> | ||
+ | <br> | ||
+ | |||
+ | ==SSH== | ||
+ | A Cluster létrehozásakor minden olyan SSH kulcsot megkaptunk, amivel a három node-ra be tudnunk lépni SSH-val. És ahogy ezt láthattunk is a default hálózaton a 22-es port nyitva van mind három node-on: | ||
+ | <pre> | ||
+ | # gcloud compute firewall-rules list | ||
+ | NAME NETWORK DIRECTION PRIORITY ALLOW | ||
+ | default-allow-ssh default INGRESS 65534 tcp:22 | ||
+ | </pre> | ||
+ | A '''describe''' paranccsal bele is nézhetünk: | ||
+ | <pre> | ||
+ | # gcloud compute firewall-rules describe default-allow-ssh | ||
+ | allowed: | ||
+ | - IPProtocol: tcp | ||
+ | ports: | ||
+ | - '22' | ||
+ | description: Allow SSH from anywhere | ||
+ | direction: INGRESS | ||
+ | kind: compute#firewall | ||
+ | name: default-allow-ssh | ||
+ | ... | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | Egy adott node-ra a '''gcloud compute ssh <felhasználó név>@<node név>''' paranccsal lehet belépni. | ||
+ | {{note|Ha nem adunk meg felhasználó nevet, akkor a root-al fog a google sdk megpróbálni belépni, ami nem lehetséges. '''Permission denied (publickey).'''. Ennek széles irodalmva van a neten, nincs igazából konklúzió. Pl: https://stackoverflow.com/questions/26193535/error-gcloud-compute-ssh-usr-bin-ssh-exited-with-return-code-255}} | ||
+ | |||
+ | |||
+ | Az SSH-hoz használt user-t nem kell előre létrehozni. Ha olyan nevet adunk meg, ami még nem létezik, akkor első alkalommal létre fogja hozni. Fontos tehát, hogy mindig megadjunk egy a root-tól különböző felhasználó nevet a '''@''' előtt, különben nem fog menni a belépés. Próbáljunk meg belépni az első node-ra, aminek a nevét a '''kubectl get nodes''' parancsból nézhetjük ki. | ||
+ | <pre> | ||
+ | # gcloud compute ssh adam2@gke-adam1-default-pool-67fe18ad-3v96 | ||
+ | |||
+ | No zone specified. Using zone [europe-west6-b] for instance: [gke-adam1-default-pool-67fe18ad-3v96]. | ||
+ | Updating project ssh metadata...⠧Updated [https://www.googleapis.com/compute/v1/projects/adamproject1]. | ||
+ | Updating project ssh metadata...done. | ||
+ | Waiting for SSH key to propagate. | ||
+ | ... | ||
+ | adam2@gke-adam1-default-pool-67fe18ad-3v96 ~ $ | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | <br> | ||
+ | |||
+ | ==Service-ek publikus elérése== | ||
+ | |||
+ | A Kubernetes nodok external IP címe publikus internet cím. De ahogy azt láthattuk alapértelmezetten csak néhány port van nyitva a '''VPC''' default hálózaton. Kubernetes-ben a POD-ok elérhetőek nodePort típusú service-ekkel bármelyik node external IP címén. Mivel GKE-ben ezek publikus IP címei a VM-eknek, ezért a megfelelő hálózati szabály hozzáadásával a nodePort típusú service-ek is elérhetőek lesznek a publikus internetről. | ||
+ | <br> | ||
+ | Telepítsünk föl egy teszt pod-ot, amiben egy hello world webserver fog futni a 8080-ás porton. | ||
+ | <source lang="C++> | ||
+ | apiVersion: extensions/v1beta1 | ||
+ | kind: Deployment | ||
+ | metadata: | ||
+ | name: web | ||
+ | namespace: default | ||
+ | spec: | ||
+ | selector: | ||
+ | matchLabels: | ||
+ | run: web | ||
+ | template: | ||
+ | metadata: | ||
+ | labels: | ||
+ | run: web | ||
+ | spec: | ||
+ | containers: | ||
+ | - image: gcr.io/google-samples/hello-app:1.0 | ||
+ | imagePullPolicy: IfNotPresent | ||
+ | name: web | ||
+ | ports: | ||
+ | - containerPort: 8080 | ||
+ | protocol: TCP | ||
+ | </source> | ||
+ | <pre> | ||
+ | # kubectl apply -f web-deployment.yaml | ||
+ | </pre> | ||
+ | |||
+ | <br> | ||
+ | Majd hozzunk hozzá létre egy nodePort típusú szolgáltatást. | ||
+ | <source lang="C++"> | ||
+ | apiVersion: v1 | ||
+ | kind: Service | ||
+ | metadata: | ||
+ | name: web-service | ||
+ | spec: | ||
+ | type: NodePort | ||
+ | ports: | ||
+ | - port: 8080 | ||
+ | selector: | ||
+ | run: web0 | ||
+ | </source> | ||
+ | <pre> | ||
+ | # kubectl apply -f web-service.yaml | ||
+ | </pre> | ||
+ | |||
+ | <br> | ||
+ | Most keressük meg a service node portját. Mivel nem specifikáltuk, a Kubernetes random választott egyet: | ||
+ | <pre> | ||
+ | # kubectl get svc web-service | ||
+ | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | ||
+ | web-service NodePort 10.60.0.58 <none> 8080:32315/TCP 27s | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | Nincs más dolgunk, mint hogy a Google Cloud Platform-n kinyissuk a tűzfalat a 32315 portra. (A '''test-node-port''' az általunk kitalált neve a tűzfal szabálynak) | ||
+ | <pre> | ||
+ | # gcloud compute firewall-rules create test-node-port --allow tcp:32315 | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | Most keressük meg valamelyik node publikus IP címét: | ||
+ | <pre> | ||
+ | # kubectl get node -o wide | ||
+ | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP | ||
+ | gke-adam1-default-pool-5a644461-csxd Ready <none> 7m37s v1.12.8-gke.10 10.172.0.15 34.65.84.196 | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | Írjuk be a böngészőbe ezt a címet: http://34.65.84.196:32315/ | ||
+ | :[[File:ClipCapIt-190627-085420.PNG]] | ||
+ | Juhuuu! | ||
+ | |||
+ | |||
+ | <br> | ||
+ | |||
+ | ==Ingress== | ||
+ | |||
+ | Az ingress alapból benne van a GKE cluster-ben, és egy saját google implementáció. Tehát nekünk semmi dolgunk nincs a telepítéssel. | ||
+ | |||
+ | https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer | ||
+ | |||
+ | Az Ingress kontrollerek a Kubernetes service belső pontjára csatlakoznak rá, tehát nem a nodePort-ra. Ismétlés képpen: háromféle portot különböztetünk meg a service-ekben: | ||
+ | * port: ezen a porton érhető el a service a cluster-en belül. Ennek nincs köze ahhoz hogy a cluster-n kivül (a node IP címén keresztül) hol érhető el a szolgáltatás. Ha ezt nem definiáljuk, akkor ugyan az lesz mint a target-port | ||
+ | * target-port: ez azt mondja meg, hogy a pod-on melyik port-ra továbbítsa az üzeneteket a service. Ha nem adjuk meg külön, akkor a deployment-ben megadott -containerPort értékét fogja kapni. | ||
+ | * nodePort: Azt mondja meg, hogy a cluster-en kívül melyik porton lesz elérhető a szolgáltatás a node-ok publikus IP címén keresztül. Ha nem adjuk meg akkor random választ a Kubernetes, ahogy ezt az előző fejezetben láthattuk is. | ||
+ | |||
+ | |||
+ | |||
+ | Ha statikus IP-t akarunk, akkor azt külön kell csiálni, de fontos, hogy aztán kitöröljük, mert külön számláz érte. | ||
+ | |||
+ | <source lang="C++"> | ||
+ | apiVersion: extensions/v1beta1 | ||
+ | kind: Ingress | ||
+ | metadata: | ||
+ | name: basic-ingress | ||
+ | spec: | ||
+ | backend: | ||
+ | serviceName: web-service | ||
+ | servicePort: 8080 | ||
+ | </source> |
Latest revision as of 19:59, 17 October 2019
Contents
Regisztráció a Google Cloud Platform-ban
https://console.cloud.google.com
Kubernetes Engine API aktiválása a projektben:
Majd a keresőbe írjuk be, hogy Kubernetes. Ekkor bejön
Kattintsunk az Enable-re.
...
A baloldali fő menüben megjelent a Kubernetes Engine menüpont:
Google Cloud SDK beállítása
SDK install
Vegyük fel az új DNF repository-t:
# sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM [google-cloud-sdk] name=Google Cloud SDK baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOM
Installáljuk fel
# dnf install google-cloud-sdk ...
SDK init
Inicializáljuk az sdk-t. Ez meg fog nyitni a root nevében futó böngészőt, ahol be kell jelentkezni a google account-ba.
# gcloud init .. You must log in to continue. Would you like to log in (Y/n)? ...
Harmadik lépésként létre kell hozni egy projektet:
# gcloud projects create adamproject1 Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/adamproject1].
Listázzuk ki az összes projektet:
# gcloud projects list PROJECT_ID NAME PROJECT_NUMBER adamproject1 adamproject1 206600067398 leafy-firmament-183906 My Project 23184 1046937073531 optimum-agent-244420 My First Project 174610655273
Válasszuk ki az új projektet
# gcloud config set project adamproject1
- az új projektet hozzá kell rendeli egy billing account-hoz (amihez a bankszámlát beállítottuk
- be kell rajta kapcsolni a Kubernetes Engine API-t.
https://console.cloud.google.com/apis/library/container.googleapis.com?project=adamproject1
Projekt törlése:
# gcloud projects delete leafy-firmament-183906 Your project will be deleted. Do you want to continue (Y/n)? Y Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/leafy-firmament-183906]. You can undo this operation for a limited period by running ' commands below. See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects $ gcloud projects undelete leafy-firmament-183906
Bejelentkezés és kubectl
A gcloud bejelentkezési adatait a config list paranccsal lehet lekérni:
# gcloud config list [core] account = myemail@gmail.com disable_usage_reporting = True project = adamproject1 Your active configuration is: [default]
A disable_usage_reporting anonim adatokat küld a Google-nek, nem a projekthez kapcsolódik.
A config-helper paranccsal pedig a tokent is listázni lehet:
# gcloud config config-helper configuration: active_configuration: default properties: core: account: myemail@gmail.com disable_usage_reporting: 'True' project: adamproject1 credential: access_token: XXXXX id_token: YYYY token_expiry: '2019-06-22T08:43:33Z' sentinels: config_sentinel: /root/.config/gcloud/config_sentinel
kubectl kontextus
A kubectl konfigurációs fájlja itt van: ~/.kube/config. Minikube esetében ez így néz ki:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority: /root/.minikube/ca.crt
server: https://192.168.42.224:8443
name: minikube
contexts:
preferences: {}
users:
- name: minikube
user:
client-certificate: /root/.minikube/client.crt
client-key: /root/.minikube/client.key
- context:
cluster: minikube
user: minikube
name: minikube
Miden egyes kubectl parancs a kiválasztott kontextusban fut le. Minden kontextus tartalmaz egy klasztert és egy user-t, amivel végrehajtjuk a parancsokat a klaszteren. A current-context mutatja meg, hogy melyik kontextus van kiválasztva.
Mikor létrehozunk egy cluster-t a gcloud containter cluster create paranccsal, akkor a gcloud automatikusan hozzáad egy új kontextust a .kube/config fájlhoz:
# gcloud container clusters create adam1 ... kubeconfig entry generated for adam1.
Nézzük meg a kontextust:
# kubectl config current-context gke_adamproject1_europe-west6_adam1
Láthatjuk, hogy a gcloud átállította a kontextust a GKE klaszerünkre.
És most nézzük bele a config fájlba:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://34.65.220.36
name: gke_adamproject1_europe-west6_adam1
- cluster:
certificate-authority: /root/.minikube/ca.crt
server: https://192.168.42.224:8443
name: minikube
contexts:
- context:
cluster: gke_adamproject1_europe-west6_adam1
user: gke_adamproject1_europe-west6_adam1
name: gke_adamproject1_europe-west6_adam1
- context:
cluster: minikube
user: minikube
name: minikube
current-context: gke_adamproject1_europe-west6_adam1
preferences: {}
users:
- name: gke_adamproject1_europe-west6_adam1
user:
auth-provider:
config:
cmd-args: config config-helper --format=json
cmd-path: /usr/lib64/google-cloud-sdk/bin/gcloud
expiry-key: '{.credential.token_expiry}'
token-key: '{.credential.access_token}'
name: gcp
- name: minikube
user:
client-certificate: /root/.minikube/client.crt
client-key: /root/.minikube/client.key
Láthatjuk, hogy a GKE klaszterhez user-hez a beállításokat a gcloud config config-helper paranccsal gyűjti be.
Ahhoz hogy visszaváltsunk a minikube kontextusra, csak ki kell adni config use-context parancsot.
# kubectl config use-context minikube Switched to context "minikube".
Note
Ha kitöröljük a GKE klasztert a gcloud container clusters delete paranccsal, akkor a kubernetes config fájlból is ki fogja törölni a bejegyzést.
Klaszter létrehozás
A gcloud container cluster create parancsnak első sorban azt kell megadni, hogy milyen típusú virtuális gépet szeretnénk készíteni, ez jelentősen befolyásolni fogja az árat. Az elérhető virtuális gépe listáját a machine-types list paranccsal listázhatjuk:
$ gcloud compute machine-types list NAME ZONE CPUS MEMORY_GB DEPRECATED f1-micro us-central1-f 1 0.60 g1-small us-central1-f 1 1.70 n1-highcpu-16 us-central1-f 16 14.40 n1-highcpu-2 us-central1-f 2 1.80 n1-highcpu-32 us-central1-f 32 28.80 ...
A cluster létrehozásához meg kell adni azt is, hogy milyen régióban és azon belül milyen lehetséges zónákban jöjjenek létre a Kubernetes node-ok. A lehetséges zónákat a régiókkal együtt a compute zones list paranccsal listázhatjuk, ebből kell válogatni:
# gcloud compute zones list | grep europe-west6 europe-west6-a europe-west6 UP europe-west6-b europe-west6 UP europe-west6-c europe-west6 UP
Láthatjuk, hogy a europe-west6 régió három zónából áll, itt fogjuk létrehozni a klasztert. A zónákat vesszővel elválasztva kell megadni, space nélkül.
gcloud container clusters \ create adam1 \ --region europe-west6 \ --node-locations europe-west6-a,europe-west6-b,europe-west6-c, \ --machine-type n1-standard-1 \ --enable-autoscaling \ --num-nodes 1 \ --max-nodes 3 \ --min-nodes 1
Warning
A num-nodes értéké zónákra fog vonatkozni. Ha a node-locations-ben három zónát sorolunk föl, és a num-nodes értéke 2, akkor összesen 6 node fog létrejönni
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/europe-west6/adam1?project=adamproject1 kubeconfig entry generated for adam1. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS adam1 europe-west6 1.12.8-gke.10 34.65.149.13 n1-standard-1 1.12.8-gke.10 3 RUNNING
Listázzuk a cluster-eket:
# gcloud container clusters list NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS adam1 europe-west6 1.12.8-gke.10 34.65.250.80 n1-standard-1 1.12.8-gke.10 3 RUNNING
És nézzük meg a web-es konzolon is. Menjünk a Kubernetes Engine felületre, és itt válasszuk a Cluster menüpontot: https://console.cloud.google.com/kubernetes
# kubectl get nodes NAME STATUS ROLES AGE VERSION gke-adam1-default-pool-b9ed6fb1-d955 Ready <none> 2m11s v1.12.8-gke.10 gke-adam1-default-pool-c1ab468d-slqn Ready <none> 2m8s v1.12.8-gke.10 gke-adam1-default-pool-e3b15f3f-98dl Ready <none> 2m7s v1.12.8-gke.10
# gcloud container clusters delete adam1 --region europe-west6 The following clusters will be deleted. - [adam1] in [europe-west6] Do you want to continue (Y/n)? Y
Node pool
Minden cluster-hez rendelve van egy node pool amit így listázhatunk:
# gcloud container node-pools list --region europe-west6 --cluster adam1 NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION default-pool n1-standard-2 100 1.13.10-gke.0
Ezt a konzolon, a klaszter részletek oldal alján láthatjuk:
A pool-t a cluster resize paranccsal méretezhetjük át:
gcloud container clusters resize [CLUSTER_NAME] --node-pool [POOL_NAME] --num-nodes [NUM_NODES]
Ez az adam1 cluster-re az alábbi:
# gcloud container clusters resize adam1 --node-pool default-pool \ --num-nodes 2 --region europe-west6 Pool [default-pool] for [adam1] will be resized to 2. Do you want to continue (Y/n)? y Resizing adam1...done. Updated [https://container.googleapis.com/v1/projects/adamproject1/zones/europe-west6/clusters/adam1].
Warning
A node számot zónánkét kell érteni. Ha 2-re állítjuk és három zónában van a klaszterünk, akkor összesen 6 node lesz a pool-ban
Hálózat
A GKE klaszterben a node-nak van egy external és egy internal IP-je. Az external IP egy publikus IP cím. Ha készítünk egy nodePort-os Kubernetes service-t, akkor a node publikus IP -n és a service portján elérhetőek lesznek a service-hez tartozó pod-ok. Listázzuk a node-okat a -o wide kapcsolóval. Az EXTERNAL-IP oszlopban valós, publikus (dinamikusan kiosztott) IP címek szerepelnek.
# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP gke-adam1-default-pool-67fe18ad-3v96 Ready <none> 14m v1.12.8-gke.10 10.172.0.12 34.65.193.16 gke-adam1-default-pool-75a1a9b3-slpl Ready <none> 14m v1.12.8-gke.10 10.172.0.13 34.65.84.196 gke-adam1-default-pool-eaf55b7a-9kb3 Ready <none> 14m v1.12.8-gke.10 10.172.0.11 34.65.22.212
A node-ok egy VPC (Virtaul Private Cloud) hálózatra vannak kötve. Azt, hogy milyen portok vannak nyitva a VPC-n, tűzfal szabályok szabályozzák (firewall-rules).
# gcloud compute firewall-rules list NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED default-allow-icmp default INGRESS 65534 icmp False False default-allow-ssh default INGRESS 65534 tcp:22 False ...
Láthatjuk, hogy a klaszerünkben a 22-es (SSH) port alapértelmezetten nyitva van.
A VPC-vel kapcsolatos beállításokat a Web-es konzolon a VPC network menüpotban végezhetjük el:
Itt megtekinthetjük a fent listázott tűzfal szabályokat:
Az External IP addresses menüpontban megtekinthetjük a Google Cloud Platform-on használt publikus IP címeinket. Jelenleg a három node-os Kubernetes klaszterünk mindegyik node-jához tartozik egy publikus IP cím:
SSH
A Cluster létrehozásakor minden olyan SSH kulcsot megkaptunk, amivel a három node-ra be tudnunk lépni SSH-val. És ahogy ezt láthattunk is a default hálózaton a 22-es port nyitva van mind három node-on:
# gcloud compute firewall-rules list NAME NETWORK DIRECTION PRIORITY ALLOW default-allow-ssh default INGRESS 65534 tcp:22
A describe paranccsal bele is nézhetünk:
# gcloud compute firewall-rules describe default-allow-ssh allowed: - IPProtocol: tcp ports: - '22' description: Allow SSH from anywhere direction: INGRESS kind: compute#firewall name: default-allow-ssh ...
Egy adott node-ra a gcloud compute ssh <felhasználó név>@<node név> paranccsal lehet belépni.
Note
Ha nem adunk meg felhasználó nevet, akkor a root-al fog a google sdk megpróbálni belépni, ami nem lehetséges. Permission denied (publickey).. Ennek széles irodalmva van a neten, nincs igazából konklúzió. Pl: https://stackoverflow.com/questions/26193535/error-gcloud-compute-ssh-usr-bin-ssh-exited-with-return-code-255
Az SSH-hoz használt user-t nem kell előre létrehozni. Ha olyan nevet adunk meg, ami még nem létezik, akkor első alkalommal létre fogja hozni. Fontos tehát, hogy mindig megadjunk egy a root-tól különböző felhasználó nevet a @ előtt, különben nem fog menni a belépés. Próbáljunk meg belépni az első node-ra, aminek a nevét a kubectl get nodes parancsból nézhetjük ki.
# gcloud compute ssh adam2@gke-adam1-default-pool-67fe18ad-3v96 No zone specified. Using zone [europe-west6-b] for instance: [gke-adam1-default-pool-67fe18ad-3v96]. Updating project ssh metadata...⠧Updated [https://www.googleapis.com/compute/v1/projects/adamproject1]. Updating project ssh metadata...done. Waiting for SSH key to propagate. ... adam2@gke-adam1-default-pool-67fe18ad-3v96 ~ $
Service-ek publikus elérése
A Kubernetes nodok external IP címe publikus internet cím. De ahogy azt láthattuk alapértelmezetten csak néhány port van nyitva a VPC default hálózaton. Kubernetes-ben a POD-ok elérhetőek nodePort típusú service-ekkel bármelyik node external IP címén. Mivel GKE-ben ezek publikus IP címei a VM-eknek, ezért a megfelelő hálózati szabály hozzáadásával a nodePort típusú service-ek is elérhetőek lesznek a publikus internetről.
Telepítsünk föl egy teszt pod-ot, amiben egy hello world webserver fog futni a 8080-ás porton.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web
namespace: default
spec:
selector:
matchLabels:
run: web
template:
metadata:
labels:
run: web
spec:
containers:
- image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 8080
protocol: TCP
# kubectl apply -f web-deployment.yaml
Majd hozzunk hozzá létre egy nodePort típusú szolgáltatást.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
ports:
- port: 8080
selector:
run: web0
# kubectl apply -f web-service.yaml
Most keressük meg a service node portját. Mivel nem specifikáltuk, a Kubernetes random választott egyet:
# kubectl get svc web-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web-service NodePort 10.60.0.58 <none> 8080:32315/TCP 27s
Nincs más dolgunk, mint hogy a Google Cloud Platform-n kinyissuk a tűzfalat a 32315 portra. (A test-node-port az általunk kitalált neve a tűzfal szabálynak)
# gcloud compute firewall-rules create test-node-port --allow tcp:32315
Most keressük meg valamelyik node publikus IP címét:
# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP gke-adam1-default-pool-5a644461-csxd Ready <none> 7m37s v1.12.8-gke.10 10.172.0.15 34.65.84.196
Írjuk be a böngészőbe ezt a címet: http://34.65.84.196:32315/
Juhuuu!
Ingress
Az ingress alapból benne van a GKE cluster-ben, és egy saját google implementáció. Tehát nekünk semmi dolgunk nincs a telepítéssel.
https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer
Az Ingress kontrollerek a Kubernetes service belső pontjára csatlakoznak rá, tehát nem a nodePort-ra. Ismétlés képpen: háromféle portot különböztetünk meg a service-ekben:
- port: ezen a porton érhető el a service a cluster-en belül. Ennek nincs köze ahhoz hogy a cluster-n kivül (a node IP címén keresztül) hol érhető el a szolgáltatás. Ha ezt nem definiáljuk, akkor ugyan az lesz mint a target-port
- target-port: ez azt mondja meg, hogy a pod-on melyik port-ra továbbítsa az üzeneteket a service. Ha nem adjuk meg külön, akkor a deployment-ben megadott -containerPort értékét fogja kapni.
- nodePort: Azt mondja meg, hogy a cluster-en kívül melyik porton lesz elérhető a szolgáltatás a node-ok publikus IP címén keresztül. Ha nem adjuk meg akkor random választ a Kubernetes, ahogy ezt az előző fejezetben láthattuk is.
Ha statikus IP-t akarunk, akkor azt külön kell csiálni, de fontos, hogy aztán kitöröljük, mert külön számláz érte.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: basic-ingress
spec:
backend:
serviceName: web-service
servicePort: 8080