{"id":1360,"date":"2021-05-24T00:09:40","date_gmt":"2021-05-23T22:09:40","guid":{"rendered":"https:\/\/wchmurze.cloud\/?p=1360"},"modified":"2021-06-13T03:26:54","modified_gmt":"2021-06-13T01:26:54","slug":"certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2","status":"publish","type":"post","link":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/","title":{"rendered":"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 2"},"content":{"rendered":"<p>W kolejnej cz\u0119\u015bci przewodnika po praktykach, kt\u00f3re pomagaj\u0105 zdoby\u0107 certyfikat CKA , chcia\u0142bym skoncentrowa\u0107 si\u0119 na metodach sprawnego generowania manifest\u00f3w obiekt\u00f3w Kubernetes w postaci plik\u00f3w YAML.<\/p>\n<h3>Podstawy<\/h3>\n<p>Og\u00f3lna posta\u0107 polecenia<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl [command] [TYPE] [NAME] [flags]\r\n<\/pre>\n<p><strong>TYPE:<\/strong> Okre\u015bla typ zasobu . W typach zasob\u00f3w nie jest rozr\u00f3\u017cniana wielko\u015b\u0107 liter i mo\u017cna okre\u015bli\u0107 form\u0119 pojedyncz\u0105, mnog\u0105 lub skr\u00f3con\u0105.<\/p>\n<p>Mo\u017cemy pyta\u0107 si\u0119 o to samo na kilka sposob\u00f3w. Dla przyk\u0142adu typ obiektu <strong>node<\/strong> (w\u0119ze\u0142). Forma skroc\u00f3na <strong>no<\/strong>, forma pojedy\u0144cza <strong>node<\/strong>, forma mnoga <strong>nodes<\/strong>.<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl get no\r\n<\/pre>\n<pre lang=\"BASH\">NAME           STATUS   ROLES    AGE   VERSION\r\ncontrolplane   Ready    master   88s   v1.19.0\r\nnode01         Ready       59s   v1.19.0\r\n<\/pre>\n<pre lang=\"BASH\">kubectl get node\r\n<\/pre>\n<pre lang=\"BASH\">NAME           STATUS   ROLES    AGE    VERSION\r\ncontrolplane   Ready    master   114s   v1.19.0\r\nnode01         Ready       85s    v1.19.0\r\n<\/pre>\n<pre lang=\"BASH\">kubectl get nodes\r\n<\/pre>\n<pre lang=\"BASH\">NAME           STATUS   ROLES    AGE     VERSION\r\ncontrolplane   Ready    master   2m10s   v1.19.0\r\nnode01         Ready       101s    v1.19.0\r\n<\/pre>\n<p><strong>NAME:<\/strong> Okre\u015bla nazw\u0119 zasobu. W nazwach jest rozr\u00f3\u017cniana wielko\u015b\u0107 liter. W przypadku pomini\u0119cia nazwy wy\u015bwietlane s\u0105 na przyk\u0142ad szczeg\u00f3\u0142y dotycz\u0105ce wszystkich zasob\u00f3w kubectl get pods.<\/p>\n<pre lang=\"BASH\">kubectl get node node01\r\n<\/pre>\n<pre class=\"\" lang=\"BASH\">NAME     STATUS   ROLES    AGE    VERSION\r\nnode01   Ready       4m6s   v1.19.0\r\n<\/pre>\n<pre lang=\"BASH\">kubectl get node Node01\r\n<\/pre>\n<pre lang=\"BASH\">Error from server (NotFound): nodes \"Node01\" not found\r\n<\/pre>\n<p>Warto o tym pami\u0119ta\u0107 (!)<\/p>\n<p>flags: Okre\u015bla opcjonalne flagi<\/p>\n<h3>Generatory<\/h3>\n<p>&nbsp;<\/p>\n<p>Na pocz\u0105tku spr\u00f3bujmy skorzysta\u0107 z funkcjonalno\u015bci dost\u0119pnych w narz\u0119dziu <strong>kubectl<\/strong>.\u00a0 To jest g\u0142\u00f3wne polecenie typu cli (<strong>c<\/strong>ommand <strong>l<\/strong>ine <strong>i<\/strong>nterface), z kt\u00f3rym si\u0119 trzeba zapozna\u0107, powiem wi\u0119cej, kt\u00f3re przynajmniej musisz polubi\u0107<\/p>\n<p>&nbsp;<\/p>\n<p>Zacznijmy od ma\u0142ego \u015bledztwa<\/p>\n<pre lang=\"BASH\">kubectl create --help\r\n<\/pre>\n<p>W odpowiedzi otrzymamy list\u0119 obiekt\u00f3w, kt\u00f3re mo\u017cemy utworzy\u0107 w spos\u00f3b imperatywny<\/p>\n<pre class=\"\">Create a resource from a file or from stdin.\r\n\r\nJSON and YAML formats are accepted.\r\n\r\nExamples:\r\n# Create a pod using the data in pod.json.\r\nkubectl create -f .\/pod.json\r\n\r\n# Create a pod based on the JSON passed into stdin.\r\ncat pod.json | kubectl create -f -\r\n\r\n# Edit the data in docker-registry.yaml in JSON then create the resource using the edited data.\r\nkubectl create -f docker-registry.yaml --edit -o json\r\n\r\nAvailable Commands:\r\nclusterrole Create a ClusterRole.\r\nclusterrolebinding Create a ClusterRoleBinding for a particular ClusterRole\r\nconfigmap Create a configmap from a local file, directory or literal value\r\ncronjob Create a cronjob with the specified name.\r\ndeployment Create a deployment with the specified name.\r\njob Create a job with the specified name.\r\nnamespace Create a namespace with the specified name\r\npoddisruptionbudget Create a pod disruption budget with the specified name.\r\npriorityclass Create a priorityclass with the specified name.\r\nquota Create a quota with the specified name.\r\nrole Create a role with single rule.\r\nrolebinding Create a RoleBinding for a particular Role or ClusterRole\r\nsecret Create a secret using specified subcommand\r\nservice Create a service using specified subcommand.\r\nserviceaccount Create a service account with the specified name\r\n<\/pre>\n<p>Odfiltruj\u0119, te obiekty, kt\u00f3re nas interesuj\u0105 w zakresie certyfikacji<\/p>\n<pre>configmap Create a configmap from a local file, directory or literal value\r\ncronjob Create a cronjob with the specified name.\r\ndeployment Create a deployment with the specified name.\r\njob Create a job with the specified name.\r\nnamespace Create a namespace with the specified name\r\nquota Create a quota with the specified name.\r\nsecret Create a secret using specified subcommand\r\nservice Create a service using specified subcommand.\r\n<\/pre>\n<p>Uwa\u017cni zwr\u00f3c\u0105 uwag\u0119, i\u017c brakuje mo\u017cliwo\u015bci utworzenia obiektu typu <strong>pod<\/strong>.\u00a0 Z historycznych powod\u00f3w zamiast polecenia <strong>kubectl create<\/strong> nale\u017cy zastosowa\u0107 polecenie <strong>kubectl run<\/strong>.<\/p>\n<p>Zobaczmy jak to wygl\u0105da:<\/p>\n<pre lang=\"BASH\">kubectl run --help\r\n<\/pre>\n<p>W odpowiedzi otrzymujemy bogat\u0105 informacje, kt\u00f3r\u0105 pozwoli\u0142em sobie nieco skr\u00f3ci\u0107 (&#8230;) &#8230; (&#8230;)<\/p>\n<pre class=\"\">Create and run a particular image in a pod.\r\n\r\nExamples:\r\n# Start a nginx pod.\r\nkubectl run nginx --image=nginx\r\n\r\n# Start a hazelcast pod and let the container expose port 5701.\r\nkubectl run hazelcast --image=hazelcast\/hazelcast --port=5701\r\n\r\n# Start a hazelcast pod and set environment variables \"DNS_DOMAIN=cluster\" and\r\n\"POD_NAMESPACE=default\" in the container.\r\nkubectl run hazelcast --image=hazelcast\/hazelcast --env=\"DNS_DOMAIN=cluster\"\r\n--env=\"POD_NAMESPACE=default\"\r\n\r\n# Start a hazelcast pod and set labels \"app=hazelcast\" and \"env=prod\" in the container.\r\nkubectl run hazelcast --image=hazelcast\/hazelcast --labels=\"app=hazelcast,env=prod\"\r\n\r\n# Dry run. Print the corresponding API objects without creating them.\r\nkubectl run nginx --image=nginx --dry-run=client\r\n\r\n# Start a nginx pod, but overload the spec with a partial set of values parsed from JSON.\r\nkubectl run nginx --image=nginx --overrides='{ \"apiVersion\": \"v1\", \"spec\": { ... } }'\r\n\r\n# Start a busybox pod and keep it in the foreground, don't restart it if it exits.\r\nkubectl run -i -t busybox --image=busybox --restart=Never\r\n\r\n# Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that\r\ncommand.\r\nkubectl run nginx --image=nginx -- &lt;arg1&gt; &lt;arg2&gt; ... &lt;argN&gt;\r\n\r\n# Start the nginx pod using a different command and custom arguments.\r\nkubectl run nginx --image=nginx --command -- &lt;cmd&gt; &lt;arg1&gt; ... &lt;argN&gt;\r\n\r\nOptions:\r\n(...)\r\n...\r\n(...)\r\n\r\nUsage:\r\nkubectl run NAME --image=image [--env=\"key=value\"] [--port=port] [--dry-run=server|client]\r\n[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]\r\n<\/pre>\n<p>Lista mo\u017cliwych parametr\u00f3w jest dosy\u0107 d\u0142uga, co ciekawe sporo z tych parametr\u00f3w nie mo\u017ce by\u0107 stosowanych w obiekcie kontroluj\u0105cym pod jakim jest deployment. Na to te\u017c jest spos\u00f3b.<\/p>\n<p>Co z pozosta\u0142ymi obiektami ?<\/p>\n<p>Mamy dwie albo nawet trzy mo\u017cliwo\u015bci<\/p>\n<ol>\n<li>Skorzystanie z przyk\u0142adowych manifest\u00f3w, kt\u00f3re znajduj\u0105 si\u0119 w oficjalnej dokumentacji<\/li>\n<li>Przekszta\u0142cenie jednego typu obiektu w drugi (poka\u017c\u0119, to na kilku przyk\u0142adach)<\/li>\n<li>Wykorzystanie generatora <strong>kubectl run<\/strong> do wklejenia tych cech obiektu, kt\u00f3re nie s\u0105 mo\u017cliwe z poziomu <strong>kubectl create<\/strong><\/li>\n<li>U\u017cycie polecenia <strong>kube explain<\/strong><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Zadanie pierwsze<\/h4>\n<p>&nbsp;<\/p>\n<ol>\n<li>Utw\u00f3rz obiekt pod o nazwie <strong>web<\/strong>\u00a0 w przestrzeni nazw <strong>alpha<\/strong> wykorzystuj\u0105cy obraz <strong>nginx:1.11.9-alpine<\/strong>, kontener ma pracowa\u0107 na portach <strong>80<\/strong> i <strong>443<\/strong>. Uzupe\u0142nij klaster o brakuj\u0105c\u0105 przestrze\u0144 nazw alpha.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Wykorzystajmy <strong>kubectl run<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"eclipse\" data-enlighter-linenumbers=\"false\">kubectl\u00a0run\u00a0web\u00a0--image=nginx:1.11.9-alpine\u00a0--port\u00a080\u00a0\u00a0-o\u00a0yaml\u00a0--dry-run=client &gt;\u00a001.pod.web.yaml<\/pre>\n<p>&nbsp;<\/p>\n<p>W tym miejscu zaczynamy stosowa\u0107 nasz schemat post\u0119powania:<\/p>\n<ul>\n<li>1. imperatywnie tworzymy plik manifestu<\/li>\n<li>2. poprawiamy zawarto\u015b\u0107 tego pliku<\/li>\n<li>3. wdra\u017camy obiekt na klaster Kubernetes<\/li>\n<li>4. po weryfikacji stanu obiektu na klastrze, wracamy do punktu 2 je\u015bli jest taka potrzeba<\/li>\n<li>5. Zabieramy si\u0119 za kolejne zadanie<\/li>\n<\/ul>\n<p>Zobaczmy, co si\u0119 znajduje w naszym pliku<\/p>\n<pre lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: web\r\n  name: web\r\nspec:\r\n  containers:\r\n  - image: nginx:1.11.9-alpine\r\n    name: web\r\n    ports:\r\n    - containerPort: 80\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Edytujemy plik<\/p>\n<pre lang=\"BASH\">vim 01.pod.web.yaml\r\n<\/pre>\n<div>Dodajemy brakuj\u0105cy port 443.<\/div>\n<div>Dodajemy brakuj\u0105c\u0105 przestrze\u0144 nazwa (namespace).<\/div>\n<div>Namespace zawsze jest zawarte w cz\u0119\u015bci metadata manifestu (do zapami\u0119tania)<\/div>\n<div><\/div>\n<div>Przy okazji mo\u017cna pozby\u0107 si\u0119 linii creationTimestamp: null oraz\u00a0 resources: {} i status: {}<\/div>\n<div><\/div>\n<div>Zasoby <strong>resources<\/strong> pozwalaj\u0105 definiowa\u0107 wi\u0119zy wykorzystania procesora i pami\u0119ci naszego kontenera. Je\u015bli nie korzystamy z tych wi\u0119z\u00f3w\u00a0 pole nale\u017cy usun\u0105\u0107.<\/div>\n<div>Pole <strong>status<\/strong> zawiera informacje o stanie obiektu na klastrze, w naszym przypadku powinien by\u0107 pusty<\/div>\n<div>Plik powinien wygl\u0105da\u0107 tak:<\/div>\n<pre lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  labels:\r\n    run: web\r\n  name: web\r\n  namespace: alpha\r\nspec:\r\n  containers:\r\n  - image: nginx:1.11.9-alpine\r\n    name: web\r\n    ports:\r\n    - containerPort: 80\r\n    - containerPort: 443\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\n<\/pre>\n<p>Sk\u0105d wiadomo, \u017ce tak si\u0119 dodaje kolejny port ?<br \/>\nMo\u017cna szuka\u0107 przyk\u0142ad\u00f3w w obszernej dokumentacji Kubernetes, ale <strong>kubectl<\/strong> dostarcza nam polecenie <strong>explain<\/strong><\/p>\n<pre lang=\"BASH\">kubectl explain pod.spec.containers.ports\r\n<\/pre>\n<pre>KIND:     Pod\r\nVERSION:  v1\r\n\r\nRESOURCE: ports &lt;[]Object&gt;\r\nDESCRIPTION:\r\n     List of ports to expose from the container. Exposing a port here gives the\r\n     system additional information about the network connections a container\r\n     uses, but is primarily informational. Not specifying a port here DOES NOT\r\n     prevent that port from being exposed. Any port which is listening on the\r\n     default \"0.0.0.0\" address inside a container will be accessible from the\r\n     network. Cannot be updated.\r\n\r\n     ContainerPort represents a network port in a single container.\r\n\r\nFIELDS:\r\n   containerPort         -required-\r\n     Number of port to expose on the pod's IP address. This must be a valid port\r\n     number, 0 &lt; x &gt; 65536.\r\n\r\n<\/pre>\n<p>Zgodnie z dokumentacj\u0119 mamy do czynienia z list\u0105.<\/p>\n<p>Bez utworzenia obiektu <strong>namespace<\/strong> o nazwie <strong>alpha<\/strong> nasze wdro\u017cenie ko\u0144czy si\u0119 tak:<\/p>\n<pre>kubectl apply -f 01.pod.web.yaml \r\n<\/pre>\n<pre>Error from server (NotFound): error when creating \"01.pod.web.yaml\": namespaces \"alpha\" not found\r\n<\/pre>\n<p>Tu pojawia si\u0119 pokusa, by wykorzysta\u0107 imperatywnie utworzenie przestrzeni nazw za pomoc\u0105<\/p>\n<pre lang=\"BASH\">kubectl create ns alpha\r\n<\/pre>\n<p>Polecam jednak utworzy\u0107 ten obiekt stosuj\u0105c nasz schemat opisany powy\u017cej.<\/p>\n<pre class=\"\">kubectl create ns alpha -o yaml --dry-run=client &gt; 01.ns.alpha.yaml\r\n<\/pre>\n<pre>cat 01.ns.alpha.yaml \r\n<\/pre>\n<pre lang=\"YAML\">apiVersion: v1\r\nkind: Namespace\r\nmetadata:\r\n  creationTimestamp: null\r\n  name: alpha\r\nspec: {}\r\nstatus: {}\r\n<\/pre>\n<pre>kubectl apply -f 01.ns.alpha.yaml \r\n<\/pre>\n<pre>namespace\/alpha created\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>Zadanie drugie<\/h4>\n<div><\/div>\n<div>Wystawi\u0107 za pomoc\u0105 obiektu service o nazwie <strong>webservice\u00a0<\/strong> pod o nazwie <strong>web<\/strong>. Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>. Typ serwisu to ClusterIP.<\/div>\n<div><\/div>\n<div>W przypadku obiekt\u00f3w service mo\u017cna skorzysta\u0107 z polecenia <strong>kubectl expose<\/strong>.<\/div>\n<div><\/div>\n<div><\/div>\n<div>\n<pre lang=\"BASH\">kubectl expose pod\/web --name=webservice -n alpha -o yaml --dry-run=client &gt; 02.svc.webservice.yaml\r\n<\/pre>\n<\/div>\n<p>Jak wygl\u0105da nasz plik ?<\/p>\n<pre lang=\"BASH\"> cat 02.svc.webservice.yaml<\/pre>\n<pre class=\"\" lang=\"YAML\"> apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: web\r\n  name: webservice\r\n  namespace: alpha\r\nspec:\r\n  ports:\r\n  - name: port-1\r\n    port: 80\r\n    protocol: TCP\r\n    targetPort: 80\r\n  - name: port-2\r\n    port: 443\r\n    protocol: TCP\r\n    targetPort: 443\r\n  selector:\r\n    run: web\r\nstatus:\r\n  loadBalancer: {}\r\n<\/pre>\n<div>Koniec pliku od miejsca status: mo\u017cemy usun\u0105\u0107.<\/div>\n<div><\/div>\n<div>Warto zwr\u00f3ci\u0107 uwag\u0119 na zgodno\u015b\u0107 etykiet obiektu pod<\/div>\n<div><\/div>\n<div>metadata:<\/div>\n<div>\u00a0 labels:<\/div>\n<div><strong>\u00a0\u00a0\u00a0 run: web<\/strong><\/div>\n<div><\/div>\n<div>i selektora obiektu service<\/div>\n<p>&nbsp;<\/p>\n<div>\u00a0selector:<\/div>\n<div><strong>\u00a0\u00a0 run: web<\/strong><\/div>\n<div><\/div>\n<div>Je\u017celi b\u0119dziemy mieli niezgodno\u015b\u0107 na poziomie pary klucz-warto\u015b\u0107 wystawiony serwis nie b\u0119dzie poprawnie przykrywa\u0142 poda lub grupy pod\u00f3w przez wsp\u00f3ln\u0105 nazw\u0105.<\/div>\n<div><\/div>\n<div>Na ko\u0144cu pozostaje tylko wdro\u017cenie tak przygotowanego manifestu na klaster.<\/div>\n<div><\/div>\n<pre lang=\"YAML\">kubectl apply -f 02.svc.webservice.yaml\r\n<\/pre>\n<h4><\/h4>\n<h4>Zadanie trzecie<\/h4>\n<p>&nbsp;<\/p>\n<div>\n<div>Utw\u00f3rz obiekt pod o nazwie <strong>postgresql<\/strong> wykorzystuj\u0105cy obraz <strong>postgres:12.4<\/strong> i port <strong>5432<\/strong>. Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>.<\/div>\n<\/div>\n<div><\/div>\n<p>&nbsp;<\/p>\n<div>\n<pre>kubectl\u00a0run\u00a0postgresql\u00a0--image=postgres:12.4\u00a0--port\u00a05432\u00a0-o\u00a0yaml\u00a0--dry-run=client\u00a0&gt; 03.pod.postgresql.yaml\r\n<\/pre>\n<p>Doprowad\u017amy nasz manifest do odpowiedniej postaci dopisuj\u0105c namespace. Warto te\u017c usun\u0105\u0107 ko\u0144cowy status: {}<\/p>\n<pre lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: postgresql\r\n  name: postgresql\r\n  namespace: alpha\r\nspec:\r\n  containers:\r\n  - image: postgres:12.4\r\n    name: postgresql\r\n    ports:\r\n    - containerPort: 5432\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<pre>kubectl\u00a0apply\u00a0-f\u00a003.pod.postgresql.yaml<\/pre>\n<\/div>\n<p>Wnikliwy obserwator zauwa\u017cy, i\u017c obiekt pod nie jest w statusie Running<\/p>\n<pre>kubectl get pod postgresql -n alpha\r\n<\/pre>\n<pre>NAME         READY   STATUS             RESTARTS   AGE\r\npostgresql   0\/1     CrashLoopBackOff   1          17s  \r\n<\/pre>\n<p>Spr\u00f3bujmy dokona\u0107 prostej diagnozy naszego obiektu. W tym celu mo\u017cna skorzysta\u0107 z polecenia <strong>kubectl describe<\/strong>, kt\u00f3re zmienia posta\u0107 obiektu na klastrze na bardziej zrozumia\u0142y opis ( ale to te\u017c jest kwestia dyskusyjna), bez formatu JSON czy YAML.<\/p>\n<pre class=\"\">kubectl describe pod postgresql -n alpha\r\n<\/pre>\n<pre class=\"\">Name:         postgresql\r\nNamespace:    alpha\r\nPriority:     0\r\nNode:         node01\/172.17.0.58\r\nStart Time:   Mon, 10 May 2021 18:17:34 +0000\r\nLabels:       run=postgresql\r\nAnnotations:  \r\nStatus:       Running\r\nIP:           10.244.1.6\r\nIPs:\r\n  IP:  10.244.1.6\r\nContainers:\r\n  postgresql:\r\n    Container ID:   docker:\/\/893dc06e02cdad8cf6998203b08a911a4e46e37919579f213c8422d8a9ee2e61\r\n    Image:          postgres:12.4\r\n    Image ID:       docker-pullable:\/\/postgres@sha256:a1e04460fdd3c338d6b65a2ab66b5aa2748eb18da3e55bcdc9ef17831ed3ad46\r\n    Port:           5432\/TCP\r\n    Host Port:      0\/TCP\r\n    State:          Waiting\r\n      Reason:       CrashLoopBackOff\r\n<\/pre>\n<p><strong> Last State: Terminated Reason: Error Exit Code: 1<\/strong><\/p>\n<pre class=\"\">      Started:      Mon, 10 May 2021 18:20:49 +0000\r\n      Finished:     Mon, 10 May 2021 18:20:49 +0000\r\n    Ready:          False\r\n    Restart Count:  5\r\n    Environment:    \r\n    Mounts:\r\n      \/var\/run\/secrets\/kubernetes.io\/serviceaccount from default-token-57qw5 (ro)\r\nConditions:\r\n  Type              Status\r\n  Initialized       True \r\n  Ready             False \r\n  ContainersReady   False \r\n  PodScheduled      True \r\nVolumes:\r\n  default-token-57qw5:\r\n    Type:        Secret (a volume populated by a Secret)\r\n    SecretName:  default-token-57qw5\r\n    Optional:    false\r\nQoS Class:       BestEffort\r\nNode-Selectors:  \r\nTolerations:     node.kubernetes.io\/not-ready:NoExecute op=Exists for 300s\r\n                 node.kubernetes.io\/unreachable:NoExecute op=Exists for 300s\r\nEvents:\r\n  Type     Reason     Age                     From               Message\r\n  ----     ------     ----                    ----               -------\r\n  Normal   Scheduled  3m55s                   default-scheduler  Successfully assigned alpha\/postgresql to node01\r\n  Normal   Pulling    3m54s                   kubelet, node01    Pulling image \"postgres:12.4\"\r\n  Normal   Pulled     3m53s                   kubelet, node01    Successfully pulled image \"postgres:12.4\" in 1.428701345s\r\n  Normal   Started    3m4s (x4 over 3m53s)    kubelet, node01    Started container postgresql\r\n  Warning  BackOff    2m26s (x10 over 3m51s)  kubelet, node01    Back-off restarting failed container\r\n  Normal   Created    2m12s (x5 over 3m53s)   kubelet, node01    Created container postgresql\r\n  Normal   Pulled     2m12s (x4 over 3m52s)   kubelet, node01    Container image \"postgres:12.4\" already present on machine\r\n\r\n<\/pre>\n<p>Wida\u0107, \u017ce mamy w manife\u015bcie poprawny adres obrazu z repozytorium (Successfully pulled image &#8220;postgres:12.4&#8221;) , ale z jakiego\u015b powolu zwr\u00f3cony jest Exit Code o warto\u015bci 1, a obiekt jest restartowany. gdy\u017c <strong>restartPolicy<\/strong> ustawione jest na warto\u015b\u0107 <strong>Always <\/strong>(taka jest domy\u015blna warto\u015b\u0107 dla tej cechy)<strong><br \/>\n<\/strong><\/p>\n<p>Co mo\u017cemy z tym dalej zrobi\u0107 ?<br \/>\nSpr\u00f3bujmy obejrze\u0107 logi kontenera w obiekcie pod, tym razem korzystaj\u0105c z polecenia <strong>kubectl logs<\/strong>.<\/p>\n<pre class=\"\">kubectl logs postgresql -n alpha\r\n<\/pre>\n<pre>Error: Database is uninitialized and superuser password is not specified.\r\n       You must specify POSTGRES_PASSWORD to a non-empty value for the\r\n       superuser. For example, \"-e POSTGRES_PASSWORD=password\" on \"docker run\".\r\n\r\n       You may also use \"POSTGRES_HOST_AUTH_METHOD=trust\" to allow all\r\n       connections without a password. This is *not* recommended.\r\n\r\n       See PostgreSQL documentation about \"trust\":\r\n       https:\/\/www.postgresql.org\/docs\/current\/auth-trust.html\r\n<\/pre>\n<p>I teraz jest ju\u017c wszystko jasne. Nasz kontener z baz\u0105 postgresql wymaga wstrzykni\u0119cia zmiennych \u015brodowiskowych. Tym zajmiemy si\u0119 w kolejnym zadaniu.<br \/>\nPrzy okazji zrobili\u015bmy ma\u0142y wst\u0119p do zada\u0144 z zakresu naprawy obiekt\u00f3w na klastrze. Zostawmy ten obiekt tak jak jest. Zosta\u0142 przygotowany zgodnie ze warunkami zadania.<\/p>\n<h4><\/h4>\n<h4>Zadanie czwarte<\/h4>\n<div><\/div>\n<div>Utw\u00f3rz obiekt pod o nazwie <strong>postgresql-env<\/strong> wykorzystuj\u0105cy obraz <strong>postgres:12.4<\/strong> i port <strong>5432<\/strong>. Dodaj obs\u0142ug\u0119 trzech zmiennych \u015brodowiskowych. Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>.<\/div>\n<div><\/div>\n<div>Lista zmiennych \u015brodowiskowych<\/div>\n<div><\/div>\n<div>\n<div>\n<div>POSTGRES_DB:\u00a0postgresdb<\/div>\n<div>POSTGRES_USER:\u00a0postgresadmin<\/div>\n<div>POSTGRES_PASSWORD:\u00a0admin123<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<p>Spr\u00f3bujmy wykorzysta\u0107 pomoc dost\u0119pn\u0105 w kubectl i odfiltrowa\u0107 jego bogat\u0105 tre\u015b\u0107:<\/p>\n<pre class=\"\">kubectl run --help| grep -i env\r\n<\/pre>\n<pre class=\"\">  # Start a hazelcast pod and set environment variables \"DNS_DOMAIN=cluster\" and \"POD_NAMESPACE=default\" in the container.\r\n  kubectl run hazelcast --image=hazelcast\/hazelcast --env=\"DNS_DOMAIN=cluster\" --env=\"POD_NAMESPACE=default\"\r\n  # Start a hazelcast pod and set labels \"app=hazelcast\" and \"env=prod\" in the container.\r\n  kubectl run hazelcast --image=hazelcast\/hazelcast --labels=\"app=hazelcast,env=prod\"\r\n      --env=[]: Environment variables to set in the container.\r\n<\/pre>\n<p>Mamy przyk\u0142adowe wywo\u0142anie, kt\u00f3re mo\u017cemy wykorzysta\u0107.<br \/>\nWystarczy do linii polece\u0144 dopisa\u0107 wielokrotnie <strong>&#8211;env=&#8221;KEY=VALUE&#8221;<\/strong><\/p>\n<pre lang=\"BASH\">kubectl\u00a0run\u00a0postgresql-env\u00a0--image=postgres:12.4\u00a0--port\u00a05432\u00a0--env=\"POSTGRES_DB=postgresdb\"\u00a0\r\n  --env=\"POSTGRES_USER=postgresadmin\"\u00a0--env=\"POSTGRES_PASSWORD=admin123\"\u00a0\r\n  -o\u00a0yaml\u00a0--dry-run=client\u00a0\u00a0&gt;\u00a004.pod.postgresql-env.yaml\r\n<\/pre>\n<p>Zobaczmy jak wygl\u0105da nasz plik<\/p>\n<pre lang=\"YAML\">apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    run: postgresql-env\r\n  name: postgresql-env\r\nspec:\r\n  containers:\r\n  - env:\r\n    - name: POSTGRES_DB\r\n      value: postgresdb\r\n    - name: POSTGRES_USER\r\n      value: postgresadmin\r\n    - name: POSTGRES_PASSWORD\r\n      value: admin123\r\n    image: postgres:12.4\r\n    name: postgresql-env\r\n    ports:\r\n    - containerPort: 5432\r\n    resources: {}\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Doprowad\u017amy nasz manifest do odpowiedniej postaci dopisuj\u0105c namespace i usuwaj\u0105c resources: {}, status: {}. Mo\u017cna te\u017c pozby\u0107 si\u0119 rownie\u017c linii creationTimestamp: null w sekcji metadata. Starajmy si\u0119 w plikach trzyma\u0107 jedynie niezb\u0119dne informacje.<\/p>\n<p>Wdra\u017camy obiekt na klaster<\/p>\n<pre class=\"\">kubectl\u00a0apply\u00a0-f\u00a004.pod.postgresql-env.yaml<\/pre>\n<p>Dla zainteresowanych kontrol\u0105 zasob\u00f3w kontenera proponuj\u0119 wykona\u0107<\/p>\n<pre lang=\"BASH\">kubectl run --help |grep limit\r\nkubectl run --help |grep request\r\n<\/pre>\n<pre lang=\"BASH\">kubectl run test --image=nginx --port 80   -o yaml --dry-run=client --limits='cpu=500m,memory=512Mi' --requests='cpu=200m,memory=256Mi'\r\n<\/pre>\n<pre 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    ports:\r\n    - containerPort: 80\r\n    resources:\r\n      limits:\r\n        cpu: 500m\r\n        memory: 512Mi\r\n      requests:\r\n        cpu: 200m\r\n        memory: 256Mi\r\n  dnsPolicy: ClusterFirst\r\n  restartPolicy: Always\r\nstatus: {}\r\n<\/pre>\n<p>Na razie zako\u0144czymy zabaw\u0119 z obiektami pod (w tej cz\u0119\u015bci)\u00a0 i spr\u00f3bujemy przenie\u015b\u0107 si\u0119 na poziom wy\u017cej. Czyli b\u0119dziemy tworzy\u0107 jeden z tych obiekt\u00f3w, kt\u00f3re kontroluj\u0105 obiekty pod. Obiektem tym jest deployment<\/p>\n<p>&nbsp;<\/p>\n<h4>Zadanie pi\u0105te<\/h4>\n<p>&nbsp;<\/p>\n<p>Utw\u00f3rz obiekt deployment o nazwie <strong>nginx-deployment<\/strong>, kt\u00f3ry jest oparty o obraz <strong>nginx:1.18.0<\/strong> z wystawionym portem <strong>80<\/strong>. Umie\u015b\u0107 go w przestrzeni nazw <strong>alpha<\/strong>.<\/p>\n<div>\n<div><\/div>\n<pre lang=\"BASH\">kubectl\u00a0create\u00a0deployment\u00a0nginx-deployment\u00a0--image=nginx:1.18.0\u00a0-n\u00a0alpha\u00a0-o\u00a0yaml\u00a0--dry-run=client\u00a0&gt; 05.deployment.nginx-deployment.yaml\r\n<\/pre>\n<pre lang=\"BASH\">vim\u00a005.deployment.nginx-deployment.yaml\r\n<\/pre>\n<p>Poniewa\u017c <strong>create deployment<\/strong> nie pozwala na dodanie z marszu numeru portu, nale\u017cy uzupe\u0142ni\u0107 go r\u0119cznie.<\/p>\n<p>Czy musimy w ten spos\u00f3b dzia\u0142a\u0107 ? Niekoniecznie.<\/p>\n<p>Mo\u017cna sprobowa\u0107 wygenerowa\u0107 manifest samego obiektu typu pod z wygenerowanym portem (tak jak w zadaniu pierwszym) i potem wklei\u0107 jego zawarto\u015b\u0107 do obiektu deployment w miejscu <strong>spec.template.spec.containers<\/strong>, gdzie kropk\u0105 odzieli\u0142em kolejne zagnie\u017cdzenie.<\/p>\n<pre lang=\"YAML\">apiVersion:\u00a0apps\/v1\r\nkind:\u00a0Deployment\r\nmetadata:\r\n\u00a0\u00a0creationTimestamp:\u00a0null\r\n\u00a0\u00a0labels:\r\n\u00a0\u00a0\u00a0\u00a0app:\u00a0nginx-deployment\r\n\u00a0\u00a0name:\u00a0nginx-deployment\r\n\u00a0\u00a0namespace:\u00a0alpha\r\nspec:\r\n\u00a0\u00a0replicas:\u00a01\r\n\u00a0\u00a0selector:\r\n\u00a0\u00a0\u00a0\u00a0matchLabels:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0app:\u00a0nginx-deployment\r\n\u00a0\u00a0strategy:\u00a0{}\r\n\u00a0\u00a0template:\r\n\u00a0\u00a0\u00a0\u00a0metadata:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0creationTimestamp:\u00a0null\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0labels:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0app:\u00a0nginx-deployment\r\n\u00a0\u00a0\u00a0\u00a0spec:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0containers:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-\u00a0image:\u00a0nginx:1.18.0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name:\u00a0nginx\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ports:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-\u00a0containerPort:\u00a080\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resources:\u00a0{}\r\n<\/pre>\n<p>Mo\u017cna te\u017c skorzysta\u0107 z wbudowanej pomocy i sprawdzi\u0107 jak ma wygl\u0105da\u0107 nasza sk\u0142adnia<\/p>\n<pre lang=\"BASH\">kubectl explain deployment.spec.template.spec.containers --recursive\r\n<\/pre>\n<p>Skr\u00f3cona odpowied\u017a (&#8230;)<\/p>\n<pre lang=\"BASH\">KIND:     Deployment\r\nVERSION:  apps\/v1\r\n\r\nRESOURCE: containers &lt;[]Object&gt;\r\n\r\nDESCRIPTION:\r\n     List of containers belonging to the pod. Containers cannot currently be\r\n     added or removed. There must be at least one container in a Pod. Cannot be\r\n     updated.\r\n\r\n     A single application container that you want to run within a pod.\r\n\r\nFIELDS:\r\n(...)\r\n<\/pre>\n<p>Wdra\u017camy nasz obiekt na klaster<\/p>\n<pre class=\"\">kubectl\u00a0apply\u00a0-f\u00a005.deployment.nginx-deployment.yaml\u00a0-n\u00a0alpha\u00a0--record\r\n<\/pre>\n<div>I przechodzimy do kolejnego wyzwania<\/div>\n<div><\/div>\n<h4>Zadanie sz\u00f3ste<\/h4>\n<div>Wystaw za pomoc\u0105 obiektu service o nazwie <strong>nginx-service<\/strong> obiekt <strong>nginx-deployment<\/strong> wykorzystuj\u0105c typ <strong>ClusterIP<\/strong>. Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>.<\/div>\n<\/div>\n<div><\/div>\n<div>Wystawienie serwisu na podstawie istniej\u0105cego ju\u017c na klastrze obiektu znacznie u\u0142atwia polecenie <strong>kubectl expose<\/strong>.<\/div>\n<div><\/div>\n<div>\n<pre lang=\"BASH\">kubectl\u00a0expose\u00a0deploy\u00a0nginx-deployment\u00a0-n\u00a0alpha\u00a0-o\u00a0yaml\u00a0--port\u00a080\u00a0--name=nginx-service\u00a0-dry-run=client &gt; 06.service.nginx-service.yaml\r\n<\/pre>\n<p>Tak wygl\u0105da nasz manifest<\/p>\n<pre lang=\"YAML\">apiVersion:\u00a0v1\r\nkind:\u00a0Service\r\nmetadata:\u00a0\u00a0\r\n  creationTimestamp:\u00a0null\u00a0\u00a0\r\n  labels:\u00a0\u00a0\u00a0\u00a0\r\n    app:\u00a0nginx-deployment\u00a0\u00a0\r\n  name:\u00a0nginx-service\u00a0\u00a0\r\n  namespace:\u00a0alpha\r\nspec:\u00a0\u00a0\r\n  ports:\u00a0\u00a0\r\n  -\u00a0port:\u00a080\u00a0\u00a0\u00a0\u00a0\r\n    protocol:\u00a0TCP\u00a0\u00a0\u00a0\u00a0\r\n    targetPort:\u00a080\u00a0\u00a0\r\n  selector:\u00a0\u00a0\u00a0\u00a0\r\n    app:\u00a0nginx-deployment\r\nstatus:\u00a0\u00a0\r\n  loadBalancer:\u00a0{}\r\n<\/pre>\n<p>Po poprawieniu manifestu wdra\u017camy go na klaster.<br \/>\nZawsze warto w przypadku \u015brodowiska egzaminacyjunego pami\u0119ta\u0107 o dodaniu dla obiekt\u00f3w wdra\u017canych w przestrzemni nazw (pod, deployment,service i inne) nazwy tej przestrzeni. Pozwala nam to na omini\u0119cie w linii polecee\u0144<br \/>\n<strong>-n nazwa_przestrzeni<\/strong> Je\u015bli natomiast u\u017cyjemy innej nazwy przestrzeni w opcjach polecenia kubectl, a inna b\u0119dzie w deklaracji manifestu wdro\u017cenie nie uda si\u0119. W ten spos\u00f3b zabezpieczamy si\u0119 przed pomy\u0142kami.<\/p>\n<pre class=\"\" lang=\"BASH\">kubectl apply -f 06.service.nginx-service.yaml -n alpha<\/pre>\n<h4><\/h4>\n<h4>Zadanie si\u00f3dme<\/h4>\n<div><\/div>\n<div>Zmie\u0144 obraz obiektu deployment o nazwie<strong> nginx-deployment<\/strong>. Nowy obrazem ma by\u0107 <strong>nginx:1.19.2<\/strong>. Zarejestruj na klastrze t\u0119 zmian\u0119. Obiekty s\u0105 umieszczone w przestrzeni nazw <strong>alpha<\/strong>. Wycofaj t\u0119 zmian\u0119 rejestruj\u0105\u0107 j\u0105 na klastrze. Zwi\u0119ksz liczb\u0119 replik do <strong>pi\u0119ciu<\/strong> (5).<\/div>\n<\/div>\n<div><\/div>\n<div>Do zmiamy obrazu mamny dedykowane polecenie <strong>kubectl set image<\/strong>, gdzie podajemy nazwe obiektu deployment, nowy obraz i nazw\u0119 kontenera, kt\u00f3rego dotyczy.<\/div>\n<div><\/div>\n<div>\u0141atwo rozpocz\u0105\u0107 prac\u0119 wykorzystuj\u0105c <strong>kubectl set image &#8211;help<\/strong><\/div>\n<div><\/div>\n<div>\n<pre class=\"\">kubectl\u00a0set\u00a0image\u00a0deploy\u00a0nginx-deployment\u00a0-n\u00a0alpha\u00a0nginx=nginx:1.19.2\u00a0-o\u00a0yaml\u00a0--dry-run=client\u00a0&gt;\u00a007.deploy.nginx-deployment.yaml\r\n<\/pre>\n<p>W tym momencie mamy juz przygotowany manifest obiektu deployment z nowym obrazem.<\/p>\n<p>Pozostaje nam tylko wdro\u017cenie go na klaster, ale nale\u017cy pamieta\u0107 o rejestracji tej zmiany. Do tego s\u0142u\u017cy flaga &#8211;record<\/p>\n<pre class=\"\">kubectl\u00a0apply\u00a0-f\u00a007.deploy.nginx-deployment.yaml\u00a0-n\u00a0alpha\u00a0--record\r\n<\/pre>\n<p>Zobaczmy jak wygl\u0105da historia<\/p>\n<pre class=\"\">kubectl\u00a0rollout\u00a0history\u00a0deploy\/nginx-deployment\u00a0-n\u00a0alpha\r\n<\/pre>\n<p>Cofnijmy ostatni\u0105 zmian\u0119<\/p>\n<pre class=\"\">kubectl\u00a0rollout\u00a0undo\u00a0deployment\u00a0nginx-deployment\u00a0-n\u00a0alpha\r\n<\/pre>\n<p>Ponownie mo\u017cemy zobaczy\u0107 histori\u0119 obiekty deployment<\/p>\n<pre class=\"\">kubectl\u00a0rollout\u00a0history\u00a0deploy\/nginx-deployment\u00a0-n\u00a0alpha\r\n<\/pre>\n<p>Na ko\u0144cu sprobujmy wyskalowa\u0107 obiekt deployment zwi\u0119kszaj\u0105c list\u0119 replik do pi\u0119ciu. Tu mamy kolejne dedykowane polecenie <strong>kubectl scale<\/strong>. Warto je zapami\u0119ta\u0107, a przyk\u0142ady \u0142atwo znale\u017a\u0107 za pomoc\u0105 <strong>kubectl scale &#8211;help<\/strong>.<\/p>\n<pre class=\"\">kubectl\u00a0scale\u00a0deploy\u00a0nginx-deployment\u00a0-n\u00a0alpha\u00a0--replicas=5\r\n<\/pre>\n<p>To ostatnie jest zrobione w trybie imperatywnym, proponuj\u0119 te\u017c sprobowa\u0107 zmieni\u0107 odpowiedni manifest yaml (pole replicas: x) i wdro\u017cyc w trybie deklaratywnym. Nigdy za ma\u0142o praktyki, przekonacie sie o tym podczas kontroli czasu na egzaminie.<\/p>\n<p>Jakie obiekty tworzy na klastrze wdro\u017cenie typu deployment? Opr\u00f3cz kilku replik obiektu pod, powstanie obiekt replicaset, Nazwa tego obiektu to nazwa <strong>deploymentname_hashreplicaset<\/strong>, a nazwy obiekt\u00f3w pod to <strong>deploymentname_hashreplicaset_hashpod<\/strong>. Po pewnej wprawie \u0142atwo b\u0119dzie si\u0119 mo\u017cna zorientowa\u0107, kt\u00f3ry obiekt jest rodzicem, a kt\u00f3ry dzieckiem.<\/p>\n<\/div>\n<p><img decoding=\"async\" class=\"n3VNCb aligncenter\" src=\"https:\/\/assets.website-files.com\/5acbcf3278f9ca8c8c178e76\/5f23328ec2c89d97f79fc904_thumb-Deploy-Replica-Pod.png\" alt=\"How to K8s: Pods, ReplicaSets, and Deployments\" data-noaft=\"1\" \/><\/p>\n<div>\n<h4>Zadanie \u00f3sme<\/h4>\n<p>Utw\u00f3rz obiekt typu replicaset o nazwie <strong>replicaset-nginx<\/strong> zawieraj\u0105cy obraz <strong>redis:alpine<\/strong>. Liczba instancji powinna wynosi\u0107 <strong>cztery<\/strong> (4). Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>.\u00a0To zadanie mo\u017cna zrobi\u0107 na dwa sposoby.<\/p>\n<p>Pierwszy to si\u0119gn\u0105\u0107 do dokumentacji Kubernetes<\/p>\n<p>https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicaset\/ i znale\u017a\u0107 tam gotowy przyk\u0142ad. Wklei\u0107 kod takiego manifestu, obrobi\u0107 w edytorze tekstu i og\u0142osi\u0107 sukces.<\/p>\n<p>Drugi spos\u00f3b to spreparowa\u0107 obiekt replicaset z obiektu deployment. Spr\u00f3bujmy to zrobi\u0107<\/p>\n<p>Na pocz\u0105tku tworzymy plik o nazwie zgodnej z przyj\u0119ta konwencj\u0105.<\/p>\n<pre lang=\"BASH\">kubectl create deployment replicaset-nginx --image=redis:alpine -n alpha -o yaml --dry-run=client &gt; 08.replicaset.replicaset-nginx.yaml<\/pre>\n<p>Zobaczmy jak wygl\u0105da jego zawarto\u015b\u0107<\/p>\n<pre lang=\"BASH\">cat 08.replicaset.replicaset-nginx.yaml<\/pre>\n<pre lang=\"YAML\">  \r\napiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    app: replicaset-nginx\r\n  name: replicaset-nginx\r\n  namespace: alpha\r\nspec:\r\n  replicas: 1\r\n  selector:\r\n    matchLabels:\r\n      app: replicaset-nginx\r\n  strategy: {}\r\n  template:\r\n    metadata:\r\n      creationTimestamp: null\r\n      labels:\r\n        app: replicaset-nginx\r\n    spec:\r\n      containers:\r\n      - image: redis:alpine\r\n        name: redis\r\n        resources: {}\r\nstatus: {}\r\n<\/pre>\n<p>To co musimy zrobi\u0107 to zmieni\u0107 typ obiektu z <strong>kind: Deployment<\/strong> na <strong>kind: ReplicaSet<\/strong><br \/>\nSprawdzmy jak jaka powinna by\u0107 wersja<\/p>\n<pre lang=\"BASH\">kubectl explain replicaset<\/pre>\n<pre>KIND:     ReplicaSet\r\nVERSION:  apps\/v1<\/pre>\n<p>usu\u0144my strategy{} i ustawmy liczb\u0119 replik na cztery<br \/>\nNasz plik powinien wygl\u0105da\u0107 tak<\/p>\n<pre lang=\"YAML\">apiVersion: apps\/v1\r\nkind: ReplicaSet\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    app: replicaset-nginx\r\n  name: replicaset-nginx\r\n  namespace: alpha\r\nspec:\r\n  replicas: 4\r\n  selector:\r\n    matchLabels:\r\n      app: replicaset-nginx\r\n  template:\r\n    metadata:\r\n      creationTimestamp: null\r\n      labels:\r\n        app: replicaset-nginx\r\n    spec:\r\n      containers:\r\n      - image: redis:alpine\r\n        name: redis\r\n        resources: {}\r\n<\/pre>\n<p>Obiekt taki mo\u017cna nast\u0119pnie wdro\u017cy\u0107 na klaster<\/p>\n<pre>kubectl apply -f 08.replicaset.replicaset-nginx.yaml<\/pre>\n<pre lang=\"BASH\">kubectl get all -n alpha<\/pre>\n<pre>NAME                         READY   STATUS    RESTARTS   \r\nAGEpod\/replicaset-nginx-6ddrz   1\/1     Running   0          98\r\nspod\/replicaset-nginx-95krm   1\/1     Running   0          98s\r\npod\/replicaset-nginx-chs8b   1\/1     Running   0          98s\r\npod\/replicaset-nginx-rqdf2   1\/1     Running   0          98s\r\n\r\nNAME                               DESIRED   CURRENT   READY   AGE\r\nreplicaset.apps\/replicaset-nginx   4         4         4       98s\r\n\r\n<\/pre>\n<p>Strategia jest jest cech\u0105 obiektu deployment i pozwala na \u0142atwe wdra\u017canie\u00a0 kolejnych wersji obrazu. W przypadku obiektu replicaset jest to warto\u015b\u0107 niemutowalna i wymaga usuni\u0119cia obiektu z klastra i utworzenia raz jeszcze. W praktyce samodzielne tworzenie tego typu zasob\u00f3w nie jest popularne.<\/p>\n<p>&nbsp;<\/p>\n<h4>Zadanie dziewi\u0105te<\/h4>\n<p>&nbsp;<\/p>\n<p>Utw\u00f3rz obiekt typu <strong>daemonset<\/strong> o nazwie <strong>daemonset-filebeat<\/strong> zawieraj\u0105cy obraz <strong>filebat<\/strong>. Obiekt nale\u017cy umie\u015bci\u0107 w przestrzeni nazw <strong>alpha<\/strong>.<br \/>\nW aktualnej wersji (1.20) nie ma mo\u017cliwo\u015bci utworzenia obiektu tego typu za pomoc\u0105 <strong>kubectl create daemonset. <\/strong>Wykorzystajmy znany nam obiekt deployment.<strong><br \/>\n<\/strong><\/p>\n<pre class=\"\" lang=\"BASH\">kubectl create deployment daemonset-filebeat --image=filebeat -n alpha -o yaml --dry-run=client &gt; 09.daemonset.daemonset-filebeat.yaml\r\n<\/pre>\n<p>Zobaczmy jak wygl\u0105da nasz manifest<\/p>\n<pre>cat 09.daemonset.daemonset-filebeat.yaml<\/pre>\n<pre lang=\"YAML\">apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  creationTimestamp: null\r\n  labels:\r\n    app: daemonset-filebeat\r\n  name: daemonset-filebeat\r\n  namespace: alpha\r\nspec:\r\n  replicas: 1\r\n  selector:\r\n    matchLabels:\r\n      app: daemonset-filebeat\r\n  strategy: {}\r\n  template:\r\n    metadata:\r\n      creationTimestamp: null\r\n      labels:\r\n        app: daemonset-filebeat\r\n    spec:\r\n      containers:\r\n      - image: filebeat\r\n        name: filebeat\r\n        resources: {}\r\nstatus: {}\r\n<\/pre>\n<p>Sprawdzmy wersje API dla obiektu daemonset. Wersja jest ta sama i nie musimy jej zmienia\u0107, ale warto to sprawdzi\u0107, nie uczmy sie na pami\u0119\u0107.<\/p>\n<pre lang=\"BASH\">kubectl explain daemonset\r\n<\/pre>\n<pre lang=\"BASH\">KIND: DaemonSet\r\nVERSION: apps\/v1\r\n<\/pre>\n<p>Po drobnych zmianach nasz plik powinien wygl\u0105da\u0107 mniej wi\u0119cej tak.<\/p>\n<pre lang=\"YAML\">apiVersion: apps\/v1\r\nkind: DaemonSet\r\nmetadata:\r\n  labels:\r\n    app: daemonset-filebeat\r\n  name: daemonset-filebeat\r\n  namespace: alpha\r\nspec:\r\n  selector:\r\n    matchLabels:\r\n      app: daemonset-filebeat\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: daemonset-filebeat\r\n    spec:\r\n      containers:\r\n      - image: filebeat\r\n        name: filebeat\r\n        resources: {}\r\n<\/pre>\n<p>Jakie to zmiany ? Najwa\u017cniejsza to usuni\u0119cie liczby replik z manifestu. Daemonset to typu obiektu, kt\u00f3ry pozwala na wdro\u017cenie po jednej instancji obiektu pod per w\u0119ze\u0142 (node). Jest z regu\u0142y stosowany do instalacji na klastrze kontener\u00f3w technicznych. Mo\u017cna te\u017c ograniczy\u0107 liczb\u0119 w\u0119z\u0142\u00f3w, na kt\u00f3rych ma si\u0119 pojawi\u0107 korzystaj\u0105\u0107 na przyk\u0142ad z selektor\u00f3w dla w\u0119z\u0142a.<\/p>\n<\/div>\n<p>Wdra\u017camy nasz obiekt na klaster i mamy poczucie dobrze zrobionego zadania.<\/p>\n<p>&nbsp;<\/p>\n<div>\n<p>Dotarli\u015bmy do ko\u0144ca dzisiejszyej audycji i powinni\u015bmy mie\u0107 wra\u017cenie, \u017ce to jest tylko zadrapanie powierzchni z bogatego zakresu zagadnie\u0144 egzaminacyjnych.<\/p>\n<p>Dla tych, kt\u00f3rzy chc\u0105 sobie po\u0107wiczy\u0107 dodatkowo proponuj\u0119 poni\u017csz\u0105 list\u0119 zada\u0144.<\/p>\n<p><a href=\"https:\/\/dev.to\/subodev\/50-questions-for-ckad-and-cka-exam-3bjm\" target=\"_blank\" rel=\"noopener\">https:\/\/dev.to\/subodev\/50-questions-for-ckad-and-cka-exam-3bjm<\/a><\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<p>W poprzedniej cz\u0119\u015bci:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-1\/\" target=\"_blank\" rel=\"noopener\">Certified Kubernetes Administrator (CKA) krok po kroku \u2013 cz\u0119\u015b\u0107 1<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>W nast\u0119pnych cz\u0119\u015bciach<\/p>\n<p><a href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/06\/07\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-3\/\" target=\"_blank\" rel=\"noopener\">Certified Kubernetes Administrator (CKA) krok po kroku &amp;#8211; cz\u0119\u015b\u0107 3<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<div>\n<h4>Literatura:<\/h4>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/conventions\/\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/docs\/reference\/kubectl\/conventions\/<\/a><\/p>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicaset\/\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicaset\/<\/a><\/p>\n<p><a href=\"https:\/\/dev.to\/subodev\/50-questions-for-ckad-and-cka-exam-3bjm\" target=\"_blank\" rel=\"noopener\">https:\/\/dev.to\/subodev\/50-questions-for-ckad-and-cka-exam-3bjm<\/a><\/p>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/cheatsheet\/\" target=\"_blank\" rel=\"noopener\">https:\/\/kubernetes.io\/docs\/reference\/kubectl\/cheatsheet\/<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>W kolejnej cz\u0119\u015bci przewodnika po praktykach, kt\u00f3re pomagaj\u0105 zdoby\u0107 certyfikat CKA , chcia\u0142bym skoncentrowa\u0107 si\u0119 na metodach sprawnego generowania manifest\u00f3w obiekt\u00f3w Kubernetes w postaci plik\u00f3w YAML. Podstawy Og\u00f3lna posta\u0107 polecenia kubectl [command] [TYPE] [NAME] [flags] TYPE: Okre\u015bla typ zasobu . &hellip; <a href=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":1060,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[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 2 - 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\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\" \/>\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 2 - W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"og:description\" content=\"W kolejnej cz\u0119\u015bci przewodnika po praktykach, kt\u00f3re pomagaj\u0105 zdoby\u0107 certyfikat CKA , chcia\u0142bym skoncentrowa\u0107 si\u0119 na metodach sprawnego generowania manifest\u00f3w obiekt\u00f3w Kubernetes w postaci plik\u00f3w YAML. Podstawy Og\u00f3lna posta\u0107 polecenia kubectl [command] [TYPE] [NAME] [flags] TYPE: Okre\u015bla typ zasobu . &hellip; Continued\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\" \/>\n<meta property=\"og:site_name\" content=\"W chmurze o chmurze i nie tylko\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-23T22:09:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-13T01:26:54+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=\"16 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\"},\"author\":{\"name\":\"djkormo\",\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"headline\":\"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 2\",\"datePublished\":\"2021-05-23T22:09:40+00:00\",\"dateModified\":\"2021-06-13T01:26:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\"},\"wordCount\":2071,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323\"},\"articleSection\":[\"CKA\",\"konteneryzacja\",\"Kubernetes\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\",\"url\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\",\"name\":\"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko\",\"isPartOf\":{\"@id\":\"https:\/\/wchmurze.cloud\/#website\"},\"datePublished\":\"2021-05-23T22:09:40+00:00\",\"dateModified\":\"2021-06-13T01:26:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#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 2\"}]},{\"@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 2 - 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\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/","og_locale":"pl_PL","og_type":"article","og_title":"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko","og_description":"W kolejnej cz\u0119\u015bci przewodnika po praktykach, kt\u00f3re pomagaj\u0105 zdoby\u0107 certyfikat CKA , chcia\u0142bym skoncentrowa\u0107 si\u0119 na metodach sprawnego generowania manifest\u00f3w obiekt\u00f3w Kubernetes w postaci plik\u00f3w YAML. Podstawy Og\u00f3lna posta\u0107 polecenia kubectl [command] [TYPE] [NAME] [flags] TYPE: Okre\u015bla typ zasobu . &hellip; Continued","og_url":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/","og_site_name":"W chmurze o chmurze i nie tylko","article_published_time":"2021-05-23T22:09:40+00:00","article_modified_time":"2021-06-13T01:26:54+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":"16 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#article","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/"},"author":{"name":"djkormo","@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"headline":"Certified Kubernetes Administrator (CKA) krok po kroku &#8211; cz\u0119\u015b\u0107 2","datePublished":"2021-05-23T22:09:40+00:00","dateModified":"2021-06-13T01:26:54+00:00","mainEntityOfPage":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/"},"wordCount":2071,"commentCount":1,"publisher":{"@id":"https:\/\/wchmurze.cloud\/#\/schema\/person\/9832cc6f86f99f541d983d2b8d60f323"},"articleSection":["CKA","konteneryzacja","Kubernetes"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/","url":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/","name":"Certified Kubernetes Administrator (CKA) krok po kroku - cz\u0119\u015b\u0107 2 - W chmurze o chmurze i nie tylko","isPartOf":{"@id":"https:\/\/wchmurze.cloud\/#website"},"datePublished":"2021-05-23T22:09:40+00:00","dateModified":"2021-06-13T01:26:54+00:00","breadcrumb":{"@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wchmurze.cloud\/index.php\/2021\/05\/24\/certified-kubernetes-administrator-cka-krok-po-kroku-czesc-2\/#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 2"}]},{"@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\/1360"}],"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=1360"}],"version-history":[{"count":45,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1360\/revisions"}],"predecessor-version":[{"id":1515,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/posts\/1360\/revisions\/1515"}],"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=1360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=1360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wchmurze.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=1360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}