Difference between revisions of "Google Kubernetes Engine"

From berki WIKI
Jump to: navigation, search
(SDK init)
(Klaszter létrehozás)
 
(24 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 73: Line 82:
 
<br>
 
<br>
  
 +
 +
Projekt törlése:
 +
<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>
 +
 +
<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 87: Line 112:
  
  
 +
A '''config-helper''' paranccsal pedig a tokent is listázni lehet:
 
<pre>
 
<pre>
 
# gcloud config config-helper
 
# gcloud config config-helper
Line 106: 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 128: 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 143: 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 183: 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 193: 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 206: 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 213: 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 233: 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


Regisztráció a Google Cloud Platform-ban

https://console.cloud.google.com
Kubernetes Engine API aktiválása a projektben:

ClipCapIt-190621-232945.PNG



Majd a keresőbe írjuk be, hogy Kubernetes. Ekkor bejön

ClipCapIt-190621-233149.PNG



Kattintsunk az Enable-re.

ClipCapIt-190621-233720.PNG



...

A baloldali fő menüben megjelent a Kubernetes Engine menüpont:

ClipCapIt-190622-000203.PNG



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".
ImportantIcon.png

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
WarningIcon.png

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

ClipCapIt-190621-235437.PNG


# 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:

ClipCapIt-191017-214842.PNG


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].
WarningIcon.png

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:

ClipCapIt-190626-222945.PNG



Itt megtekinthetjük a fent listázott tűzfal szabályokat:

ClipCapIt-190626-223154.PNG



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:

ClipCapIt-190626-223532.PNG



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.

ImportantIcon.png

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/

ClipCapIt-190627-085420.PNG

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