{"id":1358,"date":"2021-05-07T03:25:09","date_gmt":"2021-05-07T01:25:09","guid":{"rendered":"https:\/\/wchmurze.cloud\/?p=1358"},"modified":"2021-05-24T19:39:21","modified_gmt":"2021-05-24T17:39:21","slug":"certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1","status":"publish","type":"post","link":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/","title":{"rendered":"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 1"},"content":{"rendered":"<p>Kubernetes sta\u0142 si\u0119 od pewnego czasu tym orkiestratorem skonteneryzowanych aplikacji, kt\u00f3ry podbija i zdobywa kolejne obszary rozwoju infrastruktury i architektury system\u00f3w informatycznych.\u00a0 Postanowi\u0142em si\u0119 zmierzy\u0107 z certyfikacj\u0105 z tego obszaru. Egzaminy, z jakimi mia\u0142em do tej pory do czynienia, by\u0142y inne, g\u0142\u00f3wnie sprowadza\u0142y si\u0119 do test\u00f3w jednokrotnego lub wielokrotnego wyboru. Tu jest inaczej, gdy\u017c wszystkie zadania s\u0105 w pe\u0142ni praktyczne i wymagaj\u0105 przygotowania obiektu (zasobu), kt\u00f3ry nast\u0119pnie powinien by\u0107 wdro\u017cony na klaster. Czy warto zainteresowa\u0107 si\u0119 tak\u0105 certyfikacj\u0105? My\u015bl\u0119, \u017ce tak, ale nale\u017cy j\u0105 potraktowa\u0107 jako przygod\u0119, kt\u00f3r\u0105 powinna usystematyzowa\u0107 wiedz\u0119 i ugruntowa\u0107 kompetencje w konfigurowaniu klastra za pomoc\u0105 jedynie dokumentacji i natywnych narz\u0119dzi.<\/p>\n<p>&nbsp;<\/p>\n<p>Aktualnie mo\u017cliwe s\u0105 trzy \u015bcie\u017cki<\/p>\n<ol>\n<li>CKA (Certified Kubernetes Administrator)<\/li>\n<\/ol>\n<p><a href=\"https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-administrator-cka\/\" target=\"_blank\" rel=\"noopener\">https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-administrator-cka\/<\/a><\/p>\n<p>2. CKAD ( Certified Kubernetes Aplication Developer)<\/p>\n<p><a href=\"https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-application-developer-ckad\/\" target=\"_blank\" rel=\"noopener\">https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-application-developer-ckad\/<\/a><\/p>\n<p>3. CKS ( Certified Kubernetes Security Specialist)<\/p>\n<p><a href=\"https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-security-specialist\/\" target=\"_blank\" rel=\"noopener\">https:\/\/training.linuxfoundation.org\/certification\/certified-kubernetes-security-specialist\/<\/a><\/p>\n<p>Wybra\u0142em \u015bcie\u017ck\u0119 administratora, chocia\u017c jest ona najbardziej obszerna, to pozwala zweryfikowa\u0107 umiej\u0119tno\u015bci radzenia sobie z klastrem jedynie za pomoc\u0105 dokumentacji i narz\u0119dzia typu cli.<\/p>\n<p>&nbsp;<\/p>\n<p>Egzamin przeprowadzany jest za pomoc\u0105 wtyczki do Gogle Chrome<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.kubernative.net\/images\/Artikelbilder\/cka_img1.png\" width=\"800\" height=\"490\" \/><\/p>\n<p>Ca\u0142o\u015b\u0107 pracy odbywa si\u0119 w oknie przegl\u0105darki. Pracujemy na systemie Ubuntu i mamy do dyspozycji drug\u0105 zak\u0142adk\u0119 , za pomoc\u0105 kt\u00f3rej mo\u017cemy korzysta\u0107 z oficjalnej dokumentacji<\/p>\n<p>Nale\u017cy pami\u0119ta\u0107, \u017ce zamiast Control+C (Copy) i Control+V mamy odpowiednio Control+Insert (Copy) i Shift+Insert (Paste).<\/p>\n<p>Dost\u0119pny jest te\u017c notatnik, ale po jego uruchomieniu zas\u0142ania on ok 1\/3 obszaru roboczego.<\/p>\n<p>Mamy do zrobienia ok. 17 zada\u0144 w czasie dw\u00f3ch godzin. Nale\u017cy dobrze kontrolowa\u0107 czas. Ka\u017cde z zada\u0144 ma podan\u0105 wag\u0119, je\u015bli kt\u00f3re\u015b z zada\u0144 sprawia nam trudno\u015bci i utkn\u0119li\u015bmy na d\u0142u\u017cej ni\u017c 10 minut proponuj\u0119 je oflagowa\u0107 (co umo\u017cliwia \u015brodowisko) i przej\u015b\u0107 do kolejnego.<\/p>\n<p>Zakres egzaminu podzielony jest na pi\u0119\u0107 kategorii<\/p>\n<ul class=\"\">\n<li id=\"10cc\" class=\"is it df iu b iv jo hz ix iy jp id ja jb jq jd je jf jr jh ji jj js jl jm jn kt ku kv ec\" data-selectable-paragraph=\"\">Cluster Architecture, Installation &amp; Configuration, 25%<\/li>\n<li id=\"f167\" class=\"is it df iu b iv kw hz ix iy kx id ja jb ky jd je jf kz jh ji jj la jl jm jn kt ku kv ec\" data-selectable-paragraph=\"\">Workloads &amp; Scheduling, 15%<\/li>\n<li id=\"ccd3\" class=\"is it df iu b iv kw hz ix iy kx id ja jb ky jd je jf kz jh ji jj la jl jm jn kt ku kv ec\" data-selectable-paragraph=\"\">Services &amp; Networking, 20%<\/li>\n<li id=\"4981\" class=\"is it df iu b iv kw hz ix iy kx id ja jb ky jd je jf kz jh ji jj la jl jm jn kt ku kv ec\" data-selectable-paragraph=\"\">Storage, 10%<\/li>\n<li id=\"bca0\" class=\"is it df iu b iv kw hz ix iy kx id ja jb ky jd je jf kz jh ji jj la jl jm jn kt ku kv ec\" data-selectable-paragraph=\"\">Troubleshooting, 30%<\/li>\n<\/ul>\n<p>Poniewa\u017c nie mamy za du\u017co czasu na przygotowanie rozwi\u0105za\u0144, warto zastanowi\u0107 si\u0119 jak pracowa\u0107 w szybszym tempie.<\/p>\n<h3>Zwi\u0119kszanie efektywno\u015bci pracy<\/h3>\n<ol>\n<li>U\u017cywanie alias\u00f3w<\/li>\n<li>Praca w trybie pr\u00f3bnym (&#8211;dry-run)<\/li>\n<li>Wdra\u017canie zmian na klastrze z przygotowanych manifest\u00f3w YAML.<\/li>\n<li>Korzystanie z oficjalnej dokumentacji w postaci przygotowanych zak\u0142adek w przegl\u0105darce)<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h3><strong>1. Aliasy <\/strong><\/h3>\n<p>&nbsp;<\/p>\n<p><code class=\"noClass\">alias k='kubectl'<\/code><code class=\"noClass\"><\/code><\/p>\n<p><code class=\"noClass\"><em class=\"dg\">alias kn='kubectl get nodes -o wide'<br \/>\nalias kp='kubectl get pods -o wide'<br \/>\nalias kd='kubectl get deployment -o wide'<br \/>\nalias ks='kubectl get svc -o wide'<\/em><\/code><\/p>\n<p>Lista alias\u00f3w mo\u017ce by\u0107 inna i o wiele wi\u0119ksza, wa\u017cne, aby z nich korzysta\u0107 regularnie podczas \u0107wicze\u0144.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>2. Praca w trybie dry-run<\/strong><\/h3>\n<p>&nbsp;<\/p>\n<p>Praca w trybie dry-run sprowadza si\u0119 do skorzystania poni\u017cszego szablonu\u00a0 polece\u0144<\/p>\n<p><code class=\"noClass\">kubectl &lt;polecenie&gt; --dry-run=client -o yaml &gt; &lt;plik.yaml&gt;\u00a0<\/code><\/p>\n<p>Warto wyeksportowa\u0107 zmienn\u0105 $do, kt\u00f3ra u\u0142atwi nam prac\u0119:<\/p>\n<p><code class=\"noClass\">export do=\" --dry-run=client -o yaml \"<\/code><\/p>\n<p>Od tego momentu, praca w wersji skr\u00f3conej (wykorzystuj\u0105cej aliasy i zmienne \u015brodowiskowe) sprowadza si\u0119 do postaci:<\/p>\n<p><code class=\"noClass\">k &lt;polecenie&gt; $do &gt; &lt;plik.yaml&gt;<\/code><\/p>\n<p>&nbsp;<\/p>\n<p>W praktyce sprowadzi si\u0119 do wykonywania polece\u0144 typu:<\/p>\n<pre class=\"language-javascript\"><code class=\"hljs\"># Create a pod  nginx image\r\nkubectl run nginx --image=nginx\r\n\r\n# Create the pod template file with dry-run\r\nkubectl run nginx --image=nginx --dry-run=client -o yaml&gt;nginx.yaml\r\n\r\n# Create a deployment\r\nkubectl create deploy nginx-app --image=nginx --dry-run=client\r\n\r\n# Scale a deployment\r\nkubectl scale deploy nginx-app --replicas=3 \r\n\r\n# Create nginx-service and expose\r\nkubectl expose pod nginx--name=nginx-service --port=80 --dry-run=client -o yaml&gt;nginx.yaml\r\n\r\n# Create a secret name my-secret with username admin\r\nkubectl create secret generic my-secret --from-literal username=admin --dry-run=client -o yaml&gt;nginx.yaml<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h3><strong>3. Korzystanie z manifest\u00f3w YAML<\/strong><\/h3>\n<p>&nbsp;<\/p>\n<p>Przygotowujemy polecenie tworzenia obiektu w trybie imperatywnym, wy\u015bwietlamy jego posta\u0107 w formacie YAML i zapisujemy w postaci pliku. Taki plik mo\u017cemy modyfikowa\u0107 za pomoc\u0105 edytora tekstu.<\/p>\n<p>Unika\u0142bym stosowania\u00a0edycji obiekt\u00f3w bezpo\u015brednio na klastrze<\/p>\n<pre class=\"\" lang=\"BASH\">  kubectl edit deployment nginx\r\n<\/pre>\n<p>Bardziej efektywne b\u0119dzie zapisanie obiektu w postaci pliku, jego edycja, a nast\u0119pnie jego modyfikacji na klastrze za pomoc\u0105<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl apply -f plik.yaml\r\n<\/pre>\n<p>Sekwencja polece\u0144 wygl\u0105da mniej wi\u0119cej tak<\/p>\n<p><code class=\"noClass\">kubectl get deployment nginx -o yaml &gt; 01.deploy.nginx.yaml<\/code><\/p>\n<p><code class=\"noClass\">vim 01.deploy.nginx.yaml <\/code><\/p>\n<p><code class=\"noClass\">kubectl apply -f 01.deploy.nginx.yaml<br \/>\n<\/code><\/p>\n<p>Tu proponuj\u0119 zastosowa\u0107 konwencj\u0119 nazewnictwa pliku<\/p>\n<p><code class=\"noClass\">numer_zadania:typ_obiektu:nazwa_obiektu.yaml<\/code><\/p>\n<p>Mo\u017cna tez stosowa\u0107 inn\u0105 konwencj\u0119, ale odpowiednio sp\u00f3jn\u0105 wewn\u0119trznie.<\/p>\n<p>&nbsp;<\/p>\n<p>Dla tych, kt\u00f3rzy chc\u0105 spr\u00f3bowa\u0107 zabawy z klastrem przygotowa\u0142em <a href=\"https:\/\/www.katacoda.com\/djkormo\/scenarios\/kubernetes-sandbox\" target=\"_blank\" rel=\"noopener\">piaskownic\u0119 <\/a>w postaci \u015brodowiska w narz\u0119dziu Katacoda<\/p>\n<p>Pozwala ono na godzinna zabaw\u0119.<\/p>\n<p>Przyk\u0142ad utworzenia obiektu pod o nazwie <strong>test<\/strong> zbudowanego na obrazie<strong> nginx:1.16<\/strong>. Obiekt powinien zosta\u0107 umieszczony w przestrzeni nazwa <strong>default<\/strong><\/p>\n<pre class=\"\" lang=\"BASH\">kubectl run test --image=nginx:1.16 -o yaml --dry-run=client\r\n<\/pre>\n<p>Na wyj\u015bciu pojawia si\u0119 plik<\/p>\n<pre class=\"\" lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: test\r\n  name: test\r\nspec:\r\n  containers:\r\n  - image: nginx\r\n    name: test\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}                    \r\n<\/pre>\n<p>Zapiszmy go do pliku na nazwie 01.pod.test.yaml<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl run test --image=nginx:1.16 -o yaml --dry-run=client &gt; 01.pod.test.yaml\r\n<\/pre>\n<pre class=\"\" lang=\"\">vim 01.pod.nginx.yaml\r\n<\/pre>\n<p>Tutaj warto doda\u0107 brakuj\u0105cy <strong>namespace: default<\/strong>. To jest przydatne podczas tworzenia manifest\u00f3w dla innych przestrzeni nazw i uwalnia nas to od dodawania do polecenia &#8211;namespace abc (lub -n\u00a0 abc).<\/p>\n<pre class=\"\" lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: test\r\n  name: test\r\n  namespace: default\r\nspec:\r\n  containers:\r\n  - image: nginx:1.16\r\n    name: test\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<pre class=\"\" lang=\"BASH\">kubectl apply -f 01.pod.test.yaml\r\n<\/pre>\n<pre class=\"\" line=\"0\" lang=\"\">pod\/test created\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Spr\u00f3bujmy po wdro\u017ceniu zmieni\u0107 nazw\u0119 kontenera, ale nie jego obraz<\/p>\n<p>Zmieniamy w pliku jedn\u0105 lini\u0119<br \/>\nname: test2<\/p>\n<pre class=\"\" lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: test\r\n  name: test\r\n  namespace: default\r\n  \r\nspec:\r\n  containers:\r\n  - image: nginx:1.16\r\n    name: test2\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl apply -f 01.pod.test.yaml \r\n<\/pre>\n<p>Pr\u00f3ba wdro\u017cenia tak zmodyfikowanego manifestu na klaster ko\u0144czy si\u0119 spektakularnie<\/p>\n<pre class=\"\" line=\"0\" lang=\"\">The Pod \"test\" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)\r\n  core.PodSpec{\r\n        Volumes:        []core.Volume{{Name: \"default-token-dbflg\", VolumeSource: core.VolumeSource{Secret: &amp;core.SecretVolumeSource{SecretName: \"default-token-dbflg\", DefaultMode: &amp;420}}}},\r\n        InitContainers: nil,\r\n        Containers: []core.Container{\r\n                {\r\n-                       Name:    \"test2\",\r\n+                       Name:    \"test\",\r\n                        Image:   \"nginx:1.16\",\r\n                        Command: nil,\r\n                        ... \/\/ 4 identical fields\r\n                        Env:          nil,\r\n                        Resources:    core.ResourceRequirements{},\r\n-                       VolumeMounts: nil,\r\n+                       VolumeMounts: []core.VolumeMount{\r\n+                               {\r\n+                                       Name:      \"default-token-dbflg\",\r\n+                                       ReadOnly:  true,\r\n+                                       MountPath: \"\/var\/run\/secrets\/kubernetes.io\/serviceaccount\",\r\n+                               },\r\n+                       },\r\n                        VolumeDevices: nil,\r\n                        LivenessProbe: nil,\r\n                        ... \/\/ 10 identical fields\r\n                },\r\n        },\r\n        EphemeralContainers: nil,\r\n        RestartPolicy:       \"Always\",\r\n        ... \/\/ 24 identical fields\r\n  }\r\n<\/pre>\n<p>Okazuje si\u0119, \u017ce nie wszystkie zmiany s\u0105 mo\u017cliwe w takim trybie. Mo\u017cna oczywi\u015bcie usun\u0105\u0107 obiekt z klastra i wdro\u017cy\u0107 jeszcze raz. Czas na goni. Lepiej jest opanowa\u0107 tryb si\u0142owy, kt\u00f3ra przy\u015bpiesza prac\u0119, ale nie u\u017cywajcie go bezrefleksyjnie na produkcji (!).<br \/>\nW naszym przypadku nie mo\u017cna modyfikowa\u0107 nazwy kontenera, ale mo\u017cna modyfikowa\u0107 obraz, z kt\u00f3rego korzysta.<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl apply -f 01.pod.test.yaml --force            \r\n<\/pre>\n<pre class=\"\" line=\"0\" lang=\"\">pod\/test configured\r\n<\/pre>\n<p>To samo mo\u017ce nam si\u0119 przytrafi\u0107 podczas edycji obiektu bezpo\u015brednio na klastrze, a przecie\u017c pod to podstawowy obiekt wdro\u017ceniowym. Nie nale\u017cy o tym zapomina\u0107 podczas pracy z obiektami, kt\u00f3re kontroluj\u0105 jego stan.<\/p>\n<p>Dla bardziej skomplikowanych obiekt\u00f3w np. statefulset czy daemonset warto jest skorzysta\u0107 z gotowych przyk\u0142ad\u00f3w w dokumentacji i przystosowa\u0107 je do wymog\u00f3w zadania.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>4. Dokumentacja:<\/strong><\/h3>\n<p>&nbsp;<\/p>\n<p>Dost\u0119pne strony s\u0105 ograniczone do<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"https:\/\/kubernetes.io\/docs\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/docs<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kubernetes\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/kubernetes<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/blog\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/blog<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Mo\u017cna mie\u0107 jednocze\u015bnie otwart\u0105 jedna zak\u0142adk\u0119. Poniewa\u017c dozwolone jest korzystanie\u00a0z zak\u0142adek przegl\u0105darki Chrome warto przygotowa\u0107 sobie dedykowan\u0105 list\u0119 zak\u0142adek.<\/p>\n<p>Przyk\u0142adowa lista zak\u0142adek <a href=\"https:\/\/gist.github.com\/jonatasbaldin\/4e76846ce8fb17e5d2fa64bdea594930\" target=\"_blank\" rel=\"noopener\">https:\/\/gist.github.com\/jonatasbaldin\/4e76846ce8fb17e5d2fa64bdea594930<\/a><\/p>\n<p>Opr\u00f3cz dokumentacji\u00a0 mo\u017cna skorzysta\u0107 z polecenia<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl explain\r\n<\/pre>\n<pre class=\"\" lang=\"BASH\">kubectl explain pod.spec.containers --recursive\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3><strong>5. YAML w Kubernetes<\/strong><\/h3>\n<p>W tym miejscu warto po\u015bwi\u0119ci\u0107 chwil\u0119 budow\u0119 manifest\u00f3w YAML w Kubernetes.<\/p>\n<p>&nbsp;<\/p>\n<p>Definicja obiekt\u00f3w Kubernetes w postaci manifestu YAML daje wiele zalet, m.in:<\/p>\n<p>Wygoda: Nie ma potrzeby dodawania kolejnego parametru do linii polece\u0144<br \/>\nUtrzymanie: Pliki YAML\u00a0 mo\u017cna \u0142atwo przechowywa\u0107 w systemach kontroli wersji<br \/>\nElastyczno\u015b\u0107: Mo\u017cna tworzy\u0107 o wiele bardziej skompilowane struktury ni\u017c z linii polece\u0144.<\/p>\n<p>&nbsp;<\/p>\n<p>YAML jest nadzbiorem JSON, co oznacza, \u017ce ka\u017cdy obiekt w formacie JSON jest poprawny w postaci YAML, ale w drug\u0105 stron\u0119 niekoniecznie.<\/p>\n<p>Na szcz\u0119\u015bcie YAML w Kubernetes jest prosty do nauki. Mamy tylko dwa typy struktur, kt\u00f3re musimy opanowa\u0107:<\/p>\n<ul>\n<li>Listy<\/li>\n<li>Mapy<\/li>\n<\/ul>\n<p>Te dwie struktury mog\u0105 si\u0119 przeplata\u0107 , czyli mo\u017cemy mie\u0107 list\u0119 map i map\u0119 list oraz ka\u017cd\u0105 mo\u017cliw\u0105 kombinacj\u0119 z obu stron.<\/p>\n<p><strong>Mapy<\/strong><\/p>\n<p>Zacznijmy od prostego, ale praktycznego przyk\u0142adu<\/p>\n<pre class=\"\" lang=\"YAML\">---\r\napiVersion: v1\r\nkind: Pod\r\n<\/pre>\n<p>Pierwsza linia to separator obiekt\u00f3w, kt\u00f3re mo\u017cna zapisa\u0107 w jednym pliku. W praktyce nie polecam, wol\u0119 mie\u0107 poszczeg\u00f3lne manifesty rozbite per plik.<\/p>\n<p>Jest to o wiele bardziej elastyczne, je\u015bli zaczynami stosowa\u0107 systemy kontroli wersji. Wtedy mamy pe\u0142n\u0105 kontrol\u0119 nad zmianami w ka\u017cdym obiekcie niezale\u017cnie.<\/p>\n<p>Mapa to para klucz: warto\u015b\u0107. Nasz przyk\u0142ad zawiera dwie mapy, gdzie\u00a0 klucz od warto\u015bci oddziela znak <strong>:<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>klucz <strong>apiVersion<\/strong> o warto\u015bci <strong>v1<\/strong><\/p>\n<p>klucz <strong>kind<\/strong> o warto\u015bci <strong>Pod<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<p>Odpowiednik w notacji JSON wygl\u0105da tak:<\/p>\n<pre class=\"\" lang=\"JSON\">{\r\n   \"apiVersion\": \"v1\",\r\n   \"kind\": \"Pod\"\r\n}\r\n<\/pre>\n<p>Wi\u0119kszo\u015b\u0107 manifest\u00f3w w Kubernetes ma struktur\u0119 akms (<strong>a<\/strong>piVersion, <strong>k<\/strong>ind, <strong>m<\/strong>etadata, <strong>s<\/strong>pec)<\/p>\n<pre class=\"\" lang=\"YAML\">apiVersion: v1\r\nkind:\r\nmetadata:\r\nspec:\r\n<\/pre>\n<p>W por\u00f3wnaniu do JSON znaki &#8220;&#8221; s\u0105 opcjonalne.<\/p>\n<p>Mo\u017cna te\u017c zbudowa\u0107 struktury, gdzie klucz nie wskazuje na warto\u015b\u0107, ale na kolejn\u0105 par\u0119 klucz:warto\u015b\u0107, czyli na\u00a0 map\u0119<\/p>\n<pre class=\"\" lang=\"BASH\">---\r\napiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  name: rss-site\r\n  labels:\r\n    app: web\r\n<\/pre>\n<p>Klucz metadata wskazuje na par\u0119 <strong>name: rss-site<\/strong>. Para jest przeniesiona do nast\u0119pnej lini z odpowiednim wci\u0119ciem w stosunku do klucza nadrz\u0119dnego (<strong>metadata<\/strong>).\u00a0 Takie konstrukcje mo\u017cna swobodnie zagnie\u017cd\u017ca\u0107. Wci\u0119cia realizowane s\u0105 za pomoc\u0105 spacji. Nale\u017cy unika\u0107 i nie stosowa\u0107 w plikach YAML tabulacji. Z regu\u0142y stosuje si\u0119 dwie spacje, ale mo\u017ce by\u0107 ich wi\u0119cej. Wa\u017cne, by by\u0142o to sp\u00f3jne w obr\u0119bie pliku.<\/p>\n<p>Odpowiednik w notacji JSON wygl\u0105da tak:<\/p>\n<pre class=\"\" lang=\"JSON\">{\r\n  \"apiVersion\": \"v1\",\r\n  \"kind\": \"Pod\",\r\n  \"metadata\": {\r\n               \"name\": \"rss-site\",\r\n               \"labels\": {\r\n                          \"app\": \"web\"\r\n                         }\r\n              }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Listy<\/strong><\/p>\n<p>Listy w YAML to sekwencja obiekt\u00f3w:<\/p>\n<pre class=\"\" lang=\"YAML\">args:\r\n  - sleep\r\n  - \"1000\"\r\n  - message\r\n  - \"Bring back Firefly!\"\r\n<\/pre>\n<p>Ka\u017cdy z\u00a0 element\u00f3w listy rozpoczyna si\u0119 od znaku &#8211; wci\u0119tego wzgl\u0119dem rodzica i w praktyce pozwala to na budow\u0119 niesko\u0144czonie d\u0142ugiej struktury.<\/p>\n<p>Odpowiednik w notacji JSON wygl\u0105da tak:<\/p>\n<pre class=\"\" lang=\"YAML\">{\r\n   \"args\": [\"sleep\", \"1000\", \"message\", \"Bring back Firefly!\"]\r\n}\r\n<\/pre>\n<p>Oczywi\u015bcie poszczeg\u00f3lne elementy listy mog\u0105 by\u0107 mapami.<\/p>\n<pre class=\"\" lang=\"YAML\">---\r\napiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  name: rss-site\r\n  labels:\r\n    app: web\r\nspec:\r\n  containers:\r\n    - name: front-end\r\n      image: nginx\r\n      ports:\r\n        - containerPort: 80\r\n    - name: rss-reader\r\n      image: nickchase\/rss-php-nginx:v1\r\n      ports:\r\n        - containerPort: 88\r\n<\/pre>\n<p>Mamy tutaj list\u0119 obiekt\u00f3w kontener (<strong>containers<\/strong>), z kt\u00f3rych ka\u017cdy sk\u0142ada si\u0119 z imienia (<strong>name<\/strong>), obrazu (<strong>image<\/strong>) i listy port\u00f3w (czyli list\u0119 w li\u015bcie).<\/p>\n<p>Ka\u017cdy element listy wci\u0119ty poni\u017cej znacznika <strong>ports<\/strong> jest list\u0105 zawieraj\u0105c\u0105 map\u0119 o nazwie <strong>containerPort<\/strong> i warto\u015bci 80 (lub 88).<\/p>\n<p>Dla por\u00f3wnania, sp\u00f3jrzmy na odpowiednik w postaci JSON:<\/p>\n<pre class=\"\" lang=\"JSON\">{ \u201capiVersion\u201d: \u201cv1\u201d, \u201ckind\u201d: \u201cPod\u201d, \u201cmetadata\u201d: { \u201cname\u201d: \u201crss-site\u201d, \u201clabels\u201d: { \u201capp\u201d: \u201cweb\u201d } }, \u201cspec\u201d: { \u201ccontainers\u201d: [{ \u201cname\u201d: \u201cfront-end\u201d, \u201cimage\u201d: \u201cnginx\u201d, \u201cports\u201d: [{ \u201ccontainerPort\u201d: \u201c80\u201d }] }, { \u201cname\u201d: \u201crss-reader\u201d, \u201cimage\u201d: \u201cnickchase\/rss-php-nginx:v1\u201d, \u201cports\u201d: [{ \u201ccontainerPort\u201d: \u201c88\u201d }] }] } }\r\n\r\n<\/pre>\n<p>Sami szybko dojdziemy do wniosku, \u017ce YAML czyta si\u0119 (i modyfikuje)\u00a0 znacznie lepiej ni\u017c JSON. Dla API Kubernetes nie ma to \u017cadnego znaczenia.<\/p>\n<p>&nbsp;<\/p>\n<p>Podsumowuj\u0105c, mamy do dyspozycji:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>mapy, kt\u00f3re s\u0105 grup\u0105 struktur klucz: warto\u015b\u0107<\/li>\n<li>listy,kt\u00f3re s\u0105 zbiorem indywidualnych warto\u015bci<\/li>\n<li>mapy z\u0142o\u017cone z map<\/li>\n<li>mapy z\u0142o\u017cone z list<\/li>\n<li>listy z\u0142o\u017cone z list<\/li>\n<li>listy z\u0142o\u017cone z map<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Te dwie struktury pozwalaj\u0105 nam z\u0142o\u017cy\u0107 razem bardziej skomplikowane manifesty.<\/p>\n<p>Zacznijmy od najprostszego obiektu jakim jest <strong>pod<\/strong>.<\/p>\n<p>Zapiszmy taki plik w postaci pliku <strong>pod.yaml<\/strong><\/p>\n<pre class=\"\" lang=\"YAML\">\u2014\r\napiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n name: rss-site\r\n labels:\r\n   app: web\r\nspec:\r\n containers:\r\n   \u2013 name: front-end\r\n     image: nginx\r\n     ports:\r\n       \u2013 containerPort: 80\r\n   \u2013 name: rss-reader\r\n     image: nickchase\/rss-php-nginx:v1\r\n     ports:\r\n       \u2013 containerPort: 88\r\n<\/pre>\n<p>Wdro\u017cenie obiektu na klaster jest realizowane za pomoc\u0105 opcji -f, kt\u00f3ra wskazuje plik zawieraj\u0105cy przygotowany manifest.<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl create -f pod.yaml<\/pre>\n<p>&nbsp;<\/p>\n<p>W nast\u0119pnych cz\u0119\u015bciach postaram si\u0119 opisa\u0107 najcz\u0119\u015bciej spotykane zagadnienia w poszczeg\u00f3lnych obszarach tematycznych zakresu egzaminu.<\/p>\n<p>&nbsp;<\/p>\n<h3>6. Kursy<\/h3>\n<p>&nbsp;<\/p>\n<p>Po\u015br\u00f3d wielu kurs\u00f3w, kt\u00f3re mo\u017cna znale\u017a\u0107 na r\u00f3\u017cnych platformach\u00a0 szkoleniowych wybra\u0142em<\/p>\n<p><a href=\"https:\/\/www.udemy.com\/course\/certified-kubernetes-administrator-with-practice-tests\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.udemy.com\/course\/certified-kubernetes-administrator-with-practice-tests\/<\/a><\/p>\n<p>By\u0142o to dobrze wydane kilkadziesi\u0105t z\u0142otych. Warto zrobi\u0107 go spokojnie i po kolei, jedn\u0105 z g\u0142\u00f3wnych zalet s\u0105 przygotowane \u0107wiczenia. Te przygotowane laboratoria stanowi\u0105 cenny dodatek, kt\u00f3ry pozwala nam na nabranie wprawy manualnej i u\u0142atwia poruszanie si\u0119 po nieco ascetycznym \u015brodowisku egzaminacyjnym.<\/p>\n<p>&nbsp;<\/p>\n<p>Nast\u0119pne cz\u0119\u015bci<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\">Certified Kubernetes Administrator (CKA) krok po kroku \u2013 cz\u0119\u015b\u0107 2<\/a><\/p>\n<p>&nbsp;<\/p>\n<h4>Literatura:<\/h4>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.kubernative.net\/de\/17-tutorial\/69-exam-experience-cka\" target=\"_blank\" rel=\"noopener\">https:\/\/www.kubernative.net\/de\/17-tutorial\/69-exam-experience-cka<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/David-VTUK\/CKA-StudyGuide\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/David-VTUK\/CKA-StudyGuide<\/a><\/p>\n<p><a href=\"https:\/\/www.mirantis.com\/blog\/introduction-to-yaml-creating-a-kubernetes-deployment\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.mirantis.com\/blog\/introduction-to-yaml-creating-a-kubernetes-deployment\/<\/a><\/p>\n<p><a href=\"https:\/\/www.katacoda.com\/djkormo\/scenarios\/kubernetes-sandbox\" target=\"_blank\" rel=\"noopener\">https:\/\/www.katacoda.com\/djkormo\/scenarios\/kubernetes-sandbox<\/a><\/p>\n<p><a href=\"https:\/\/codeburst.io\/the-ckad-browser-terminal-10fab2e8122e\" target=\"_blank\" rel=\"noopener\">https:\/\/codeburst.io\/the-ckad-browser-terminal-10fab2e8122e<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes sta\u0142 si\u0119 od pewnego czasu tym orkiestratorem skonteneryzowanych aplikacji, kt\u00f3ry podbija i zdobywa kolejne obszary rozwoju infrastruktury i architektury system\u00f3w informatycznych.\u00a0 Postanowi\u0142em si\u0119 zmierzy\u0107 z certyfikacj\u0105 z tego obszaru. Egzaminy, z jakimi mia\u0142em do tej pory do czynienia, by\u0142y &hellip; <a href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":1060,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[22,27,23,26],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"og:description\" content=\"Kubernetes sta\u0142 si\u0119 od pewnego czasu tym orkiestratorem skonteneryzowanych aplikacji, kt\u00f3ry podbija i zdobywa kolejne obszary rozwoju infrastruktury i architektury system\u00f3w informatycznych.\u00a0 Postanowi\u0142em si\u0119 zmierzy\u0107 z certyfikacj\u0105 z tego obszaru. Egzaminy, z jakimi mia\u0142em do tej pory do czynienia, by\u0142y &hellip; Continued\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\" \/>\n<meta property=\"og:site_name\" content=\"W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-07T01:25:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-24T17:39:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/08\/Kubernetes_New.png\" \/>\n\t<meta property=\"og:image:width\" content=\"730\" \/>\n\t<meta property=\"og:image:height\" content=\"389\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"djkormo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"djkormo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\"},\"author\":{\"name\":\"djkormo\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"headline\":\"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 1\",\"datePublished\":\"2021-05-07T01:25:09+00:00\",\"dateModified\":\"2021-05-24T17:39:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\"},\"wordCount\":1632,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"articleSection\":[\"Certyfikacja\",\"CKA\",\"konteneryzacja\",\"Kubernetes\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\",\"url\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\",\"name\":\"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/#website\"},\"datePublished\":\"2021-05-07T01:25:09+00:00\",\"dateModified\":\"2021-05-24T17:39:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/wchmurze.cloud\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wchmurze.cloud\/#website\",\"url\":\"https:\/\/wchmurze.cloud\/\",\"name\":\"W chmurze o chmurze i nie tylko\",\"description\":\"W chmurze o chmurze i nie tylko\",\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wchmurze.cloud\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\",\"name\":\"djkormo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g\",\"caption\":\"djkormo\"},\"logo\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/","og_locale":"pl_PL","og_type":"article","og_title":"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko","og_description":"Kubernetes sta\u0142 si\u0119 od pewnego czasu tym orkiestratorem skonteneryzowanych aplikacji, kt\u00f3ry podbija i zdobywa kolejne obszary rozwoju infrastruktury i architektury system\u00f3w informatycznych.\u00a0 Postanowi\u0142em si\u0119 zmierzy\u0107 z certyfikacj\u0105 z tego obszaru. Egzaminy, z jakimi mia\u0142em do tej pory do czynienia, by\u0142y &hellip; Continued","og_url":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/","og_site_name":"W chmurze o chmurze i nie tylko","article_published_time":"2021-05-07T01:25:09+00:00","article_modified_time":"2021-05-24T17:39:21+00:00","og_image":[{"width":730,"height":389,"url":"https:\/\/wchmurze.cloud\/wp-content\/uploads\/2019\/08\/Kubernetes_New.png","type":"image\/png"}],"author":"djkormo","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"djkormo","Szacowany czas czytania":"9 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#article","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/"},"author":{"name":"djkormo","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"headline":"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 1","datePublished":"2021-05-07T01:25:09+00:00","dateModified":"2021-05-24T17:39:21+00:00","mainEntityOfPage":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/"},"wordCount":1632,"commentCount":1,"publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"articleSection":["Certyfikacja","CKA","konteneryzacja","Kubernetes"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/","url":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/","name":"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 1 - W chmurze o chmurze i nie tylko","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/#website"},"datePublished":"2021-05-07T01:25:09+00:00","dateModified":"2021-05-24T17:39:21+00:00","breadcrumb":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/wchmurze.cloud\/"},{"@type":"ListItem","position":2,"name":"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 1"}]},{"@type":"WebSite","@id":"https:\/\/wchmurze.cloud\/#website","url":"https:\/\/wchmurze.cloud\/","name":"W chmurze o chmurze i nie tylko","description":"W chmurze o chmurze i nie tylko","publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wchmurze.cloud\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":["Person","Organization"],"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323","name":"djkormo","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/14a901b808871fa98086ae259c45d646?s=96&d=mm&r=g","caption":"djkormo"},"logo":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/image\/"},"url":"https:\/\/wchmurze.cloud\/index.php\/author\/djkormo\/"}]}},"_links":{"self":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1358"}],"collection":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/comments?post=1358"}],"version-history":[{"count":35,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1358\/revisions"}],"predecessor-version":[{"id":1451,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1358\/revisions\/1451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media\/1060"}],"wp:attachment":[{"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/media?parent=1358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=1358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=1358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}