Changes

Jump to: navigation, search

Google Kubernetes Engine

15,491 bytes added, 19:59, 17 October 2019
Klaszter létrehozás
=Regisztráció a Google Cloud Platform-ban=
https://console.cloud.google.com
<br>
Kubernetes Engine API aktiválása a projektben:
:[[File:ClipCapIt-190621-232945.PNG]]
<br><br>
Majd a keresőbe írjuk be, hogy Kubernetes. Ekkor bejön
:[[File:ClipCapIt-190621-233149.PNG]]
<br><br>
Kattintsunk az Enable-re.
:[[File:ClipCapIt-190621-233720.PNG]]
<br><br>
...
:[[File:ClipCapIt-190622-000203.PNG]]
<br>
<br>
=Google Cloud SDK beállítása=
You must log in to continue. Would you like to log in (Y/n)?
...
</pre>
Harmadik lépésként létre kell hozni egy projektet:
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/adamproject1].
</pre>
<br>
Listázzuk ki az összes projektet:
<pre>
# 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
</pre>
<pre>
# gcloud config set project adamproject1
</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
Ez <br>  Projekt törlése: <pre># gcloud projects delete leafy-firmament-183906Your 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 kubctl 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-t 183906</pre> <br>==Bejelentkezés és kubectl==A gcloud bejelentkezési adatait a '''config list''' paranccsal lehet lekérni:<pre># gcloud config list[core]account = myemail@gmail.comdisable_usage_reporting = Trueproject = adamproject1 Your active configuration is át fogja állítani : [default]</pre>A '''disable_usage_reporting''' anonim adatokat küld a google cloudGoogle-ranek, nem a projekthez kapcsolódik.
De ha elindítjuk a minikubeA '''config-ot, akkor az vissza fogja állítani helper''' paranccsal pedig a kubectl-t saját magáratokent is listázni lehet:
<pre>
# gcloud config config-helperconfiguration: active_configuration: default properties: core: account: myemail@gmail.com disable_usage_reporting: 'True' project: adamproject1credential: access_token: XXXXX id_token: YYYY token_expiry: '2019-06-22T08:43:33Z'sentinels: config_sentinel: /root/.config/gcloud/config_sentinel</pre> <br>===kubectl kontextus===A kubectl konfigurációs fájlja itt van: '''~/.kube/config'''. Minikube esetében ez így néz ki: <source lang="C++">apiVersion: v1kind: Configclusters:- cluster: certificate-authority: /root/.minikube start /ca.crt server: https://192.168.42.224:8443 name: minikubecontexts:preferences: {}users:- name: minikube user: client-certificate: /root/.minikube/client.crt client-key: /root/.minikube/client.key- context: cluster: minikube user: minikube name: minikube</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.  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># gcloud container clusters create adam1
...
kubeconfig entry generated for adam1.
</pre>
Nézzük meg a kontextust:
<pre>
# kubectl config current-context
minikubegke_adamproject1_europe-west6_adam1</pre>Láthatjuk, hogy a gcloud átállította a kontextust a GKE klaszerünkre.
# kubectl get nodeÉs most nézzük bele a config fájlba: <source lang="C++">apiVersion: v1kind: Configclusters:- cluster: certificate-authority-data: DATA+OMITTED server: https://34.65.220.36NAME STATUS ROLES AGE VERSIONname: gke_adamproject1_europe-west6_adam1- cluster: certificate-authority: /root/.minikube /ca.crt server: https://192.168.42.224:8443 name: minikubecontexts:- context: cluster: gke_adamproject1_europe-west6_adam1 user: gke_adamproject1_europe-west6_adam1 Ready master name: gke_adamproject1_europe-west6_adam1- context: cluster: minikube user: minikube 103d name: minikubecurrent-context: gke_adamproject1_europe-west6_adam1preferences: {}users:- name: gke_adamproject1_europe-west6_adam1 v1user: 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</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.13<pre># kubectl config use-context minikubeSwitched to context "minikube".4
</pre>
 
{{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:
<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.
 
 
 
<pre>
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
</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>
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/europe-west6/adam1?project=adamproject1
adam1 europe-west6 1.12.8-gke.10 34.65.149.13 n1-standard-1 1.12.8-gke.10 3 RUNNING
</pre>
<br> Listázzuk a cluster-eket: <pre># gcloud container clusters listNAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUSadam1 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]]
Do you want to continue (Y/n)? Y
</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>

Navigation menu