trainings/kubernetes/Kubernetes_1.html
2024-03-18 10:00:12 +01:00

4355 lines
No EOL
169 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.21">
<meta name="author" content="Juliusz Marciniak">
<title>Szkolenie Kubernetes szybki start</title>
<link rel="stylesheet" href="Kubernetes_1_pliki/css.css">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
<h1>Szkolenie Kubernetes szybki start</h1>
<div class="details">
<span id="author" class="author">Juliusz Marciniak</span><br>
</div>
<div id="toc" class="toc">
<div id="toctitle">Spis treści</div>
<ul class="sectlevel1">
<li><a href="#_opis">Opis</a></li>
<li><a href="#_o_trenerze">O trenerze</a></li>
<li><a href="#_agenda">Agenda</a></li>
<li><a href="#_zasady">Zasady</a></li>
<li><a href="#_podstawy_teoretyczne">Podstawy teoretyczne</a>
<ul class="sectlevel2">
<li><a href="#_10_powodów_dla_których_warto_konteneryzować_aplikacje">10 powodów, dla których warto konteneryzować aplikacje</a></li>
<li><a href="#_porównanie_dockera_i_vm">Porównanie Dockera i VM</a></li>
</ul>
</li>
<li><a href="#_docker">Docker</a>
<ul class="sectlevel2">
<li><a href="#_co_to_jest_docker">Co to jest Docker?</a></li>
<li><a href="#_architektura">Architektura</a>
<ul class="sectlevel3">
<li><a href="#_docker_daemon">Docker Daemon</a></li>
<li><a href="#_docker_client">Docker client</a></li>
<li><a href="#_docker_desktop">Docker Desktop</a></li>
<li><a href="#_docker_registries">Docker registries</a></li>
<li><a href="#_docker_objects">Docker objects</a>
<ul class="sectlevel4">
<li><a href="#_images">Images</a></li>
<li><a href="#_containers">Containers</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_instalacja">Instalacja</a></li>
<li><a href="#_komendy">Komendy</a>
<ul class="sectlevel3">
<li><a href="#_docker_pull">docker pull</a></li>
<li><a href="#_docker_build">docker build</a></li>
<li><a href="#_docker_run">docker run</a></li>
<li><a href="#_cheat_sheet">Cheat sheet</a></li>
</ul>
</li>
<li><a href="#_zadania">Zadania</a>
<ul class="sectlevel3">
<li><a href="#_zadanie_1_pobranie_obrazu">Zadanie 1. Pobranie obrazu</a></li>
<li><a href="#_zadanie_2_uruchomienie_obrazu">Zadanie 2. Uruchomienie obrazu</a></li>
<li><a href="#_zadanie_3_sprawdzenie_listy_obrazów">Zadanie 3. Sprawdzenie listy obrazów</a></li>
<li><a href="#_zadanie_4_sprawdzenie_działających_kontenerów">Zadanie 4. Sprawdzenie działających kontenerów</a></li>
<li><a href="#_zadanie_5_uruchomienie_kontenera_na_konkretnym_porcie">Zadanie 5. Uruchomienie kontenera na konkretnym porcie</a></li>
<li><a href="#_zadanie_6_sprawdzanie_logów">Zadanie 6. Sprawdzanie logów</a></li>
<li><a href="#_zadanie_7_uruchomienie_bazy_danych">Zadanie 7. Uruchomienie bazy danych</a></li>
<li><a href="#_zadanie_8_budowanie_obrazu">Zadanie 8. Budowanie obrazu</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_kubernetes">Kubernetes</a>
<ul class="sectlevel2">
<li><a href="#_co_to_jest_kubernetes">Co to jest Kubernetes?</a></li>
<li><a href="#_architektura_2">Architektura</a>
<ul class="sectlevel3">
<li><a href="#_etcd">etcd</a></li>
<li><a href="#_kube_apiserver">kube-apiserver</a></li>
<li><a href="#_kube_scheduler">kube-scheduler</a></li>
<li><a href="#_kube_controller_manager">kube-controller-manager</a></li>
<li><a href="#_cloud_controller_manager_opcjonalny">cloud-controller-manager (opcjonalny)</a></li>
<li><a href="#_kube_proxy">kube-proxy</a></li>
<li><a href="#_kubelet">kubelet</a></li>
<li><a href="#_node">Node</a>
<ul class="sectlevel4">
<li><a href="#_opis_2">Opis</a></li>
<li><a href="#_control_plane">Control plane</a></li>
<li><a href="#_worker">Worker</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_cri">CRI</a>
<ul class="sectlevel3">
<li><a href="#_opis_3">Opis</a></li>
<li><a href="#_wspierane_cri">Wspierane CRI</a></li>
<li><a href="#_dockershim">dockershim</a></li>
</ul>
</li>
<li><a href="#_cykl_wydań_i_wsparcie_w_kubernetes">Cykl Wydań i Wsparcie w Kubernetes</a></li>
<li><a href="#_wersje_api">Wersje API</a></li>
<li><a href="#_wycofywanie_api">Wycofywanie API</a>
<ul class="sectlevel3">
<li><a href="#_zasada_1">Zasada #1</a></li>
<li><a href="#_zasada_2">Zasada #2</a></li>
<li><a href="#_zasada_3">Zasada #3</a></li>
<li><a href="#_zasada_4a">Zasada #4a</a></li>
<li><a href="#_zasada_4b">Zasada #4b</a></li>
</ul>
</li>
<li><a href="#_kubectl">kubectl</a>
<ul class="sectlevel3">
<li><a href="#_opis_4">Opis</a></li>
<li><a href="#_instalacja_2">Instalacja</a></li>
<li><a href="#_komendy_2">Komendy</a></li>
<li><a href="#_cheat_sheet_2">Cheat sheet</a></li>
</ul>
</li>
<li><a href="#_kubeconfig">kubeconfig</a>
<ul class="sectlevel3">
<li><a href="#_opis_5">Opis</a></li>
<li><a href="#_zarządzanie_przez_kubectl">Zarządzanie przez kubectl</a></li>
<li><a href="#_przykładowy_plik_kubeconfig">Przykładowy plik kubeconfig</a></li>
</ul>
</li>
<li><a href="#_podstawowe_obiekty">Podstawowe obiekty</a>
<ul class="sectlevel3">
<li><a href="#_namespace">Namespace</a>
<ul class="sectlevel4">
<li><a href="#_opis_6">Opis</a></li>
<li><a href="#_domyślne_namespace">Domyślne namespace</a></li>
<li><a href="#_przykład_imperatywny">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny">Przykład deklaratywny</a></li>
<li><a href="#_listowanie_przestrzeni_nazw">Listowanie przestrzeni nazw</a></li>
<li><a href="#_pobieranie_obiektów_z_namespace">Pobieranie obiektów z namespace</a></li>
<li><a href="#_api">API</a></li>
</ul>
</li>
<li><a href="#_pod">Pod</a>
<ul class="sectlevel4">
<li><a href="#_opis_7">Opis</a></li>
<li><a href="#_przykład_imperatywny_2">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_2">Przykład deklaratywny</a></li>
<li><a href="#_api_2">API</a></li>
</ul>
</li>
<li><a href="#_deployment">Deployment</a>
<ul class="sectlevel4">
<li><a href="#_opis_8">Opis</a></li>
<li><a href="#_strategie_uaktualnienia">Strategie uaktualnienia</a></li>
<li><a href="#_przykład_imperatywny_3">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_3">Przykład deklaratywny</a></li>
<li><a href="#_api_3">API</a></li>
</ul>
</li>
<li><a href="#_replicaset">ReplicaSet</a>
<ul class="sectlevel4">
<li><a href="#_opis_9">Opis</a></li>
<li><a href="#_api_4">API</a></li>
</ul>
</li>
<li><a href="#_daemonset">DaemonSet</a>
<ul class="sectlevel4">
<li><a href="#_opis_10">Opis</a></li>
<li><a href="#_przykład_imperatywny_4">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_4">Przykład deklaratywny</a></li>
<li><a href="#_api_5">API</a></li>
</ul>
</li>
<li><a href="#_statefulsets">StatefulSets</a>
<ul class="sectlevel4">
<li><a href="#_opis_11">Opis</a></li>
<li><a href="#_przykład_deklaratywny_5">Przykład deklaratywny</a></li>
<li><a href="#_api_6">API</a></li>
</ul>
</li>
<li><a href="#_job">Job</a>
<ul class="sectlevel4">
<li><a href="#_opis_12">Opis</a></li>
<li><a href="#_przykład_imperatywny_5">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_6">Przykład deklaratywny</a></li>
<li><a href="#_api_7">API</a></li>
</ul>
</li>
<li><a href="#_cronjob">CronJob</a>
<ul class="sectlevel4">
<li><a href="#_opis_13">Opis</a></li>
<li><a href="#_cron_schedule_syntax">Cron schedule syntax</a></li>
<li><a href="#_przykład_imperatywny_6">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_7">Przykład deklaratywny</a></li>
<li><a href="#_api_8">API</a></li>
</ul>
</li>
<li><a href="#_service">Service</a>
<ul class="sectlevel4">
<li><a href="#_opis_14">Opis</a></li>
<li><a href="#_przykład_imperatywny_7">Przykład imperatywny</a></li>
<li><a href="#_przykład_deklaratywny_8">Przykład deklaratywny</a></li>
<li><a href="#_api_9">API</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_labels_and_selectors">Labels and Selectors</a>
<ul class="sectlevel3">
<li><a href="#_opis_15">Opis</a></li>
<li><a href="#_well_known_labels">Well-Known Labels</a></li>
</ul>
</li>
<li><a href="#_annotation">Annotation</a>
<ul class="sectlevel3">
<li><a href="#_opis_16">Opis</a></li>
</ul>
</li>
<li><a href="#_uwierzytelnianie">Uwierzytelnianie</a>
<ul class="sectlevel3">
<li><a href="#_serviceaccount">ServiceAccount</a>
<ul class="sectlevel4">
<li><a href="#_opis_17">Opis</a></li>
<li><a href="#_przykład_deklaratywny_9">Przykład deklaratywny</a></li>
<li><a href="#_wyciągnięcie_tokena">Wyciągnięcie tokena</a></li>
</ul>
</li>
<li><a href="#_roleclusterrole">Role/ClusterRole</a>
<ul class="sectlevel4">
<li><a href="#_opis_18">Opis</a></li>
<li><a href="#_przykład_deklaratywny_10">Przykład deklaratywny</a></li>
</ul>
</li>
<li><a href="#_rolebindingclusterrolebinding">RoleBinding/ClusterRoleBinding</a>
<ul class="sectlevel4">
<li><a href="#_opis_19">Opis</a></li>
<li><a href="#_przykład_deklaratywny_11">Przykład deklaratywny</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_sieć">Sieć</a>
<ul class="sectlevel3">
<li><a href="#_sterowniki_cni">Sterowniki CNI</a></li>
<li><a href="#_przykłady_sterowników_cni_w_kubernetes">Przykłady Sterowników CNI w Kubernetes</a>
<ul class="sectlevel4">
<li><a href="#_flannel">Flannel</a></li>
<li><a href="#_calico">Calico</a></li>
<li><a href="#_weave">Weave</a></li>
<li><a href="#_cilium">Cilium</a></li>
<li><a href="#_kube_router">Kube-router</a></li>
<li><a href="#_antrea">Antrea</a></li>
</ul>
</li>
<li><a href="#_rodzaje_service">Rodzaje Service</a>
<ul class="sectlevel4">
<li><a href="#_clusterip">ClusterIP</a></li>
<li><a href="#_nodeport">NodePort</a></li>
<li><a href="#_loadbalancer">LoadBalancer</a></li>
<li><a href="#_externalname">ExternalName</a></li>
</ul>
</li>
<li><a href="#_ingress">Ingress</a>
<ul class="sectlevel4">
<li><a href="#_opis_20">Opis</a></li>
<li><a href="#_przykład_deklaratywny_12">Przykład deklaratywny</a></li>
<li><a href="#_api_10">API</a></li>
</ul>
</li>
<li><a href="#_ingress_controller">Ingress Controller</a>
<ul class="sectlevel4">
<li><a href="#_opis_21">Opis</a></li>
</ul>
</li>
<li><a href="#_przykłady_ingress_controllerów">Przykłady Ingress Controllerów</a>
<ul class="sectlevel4">
<li><a href="#_nginx_ingress_controller">Nginx Ingress Controller</a></li>
<li><a href="#_traefik_ingress_controller">Traefik Ingress Controller</a></li>
<li><a href="#_haproxy_ingress_controller">HAProxy Ingress Controller</a></li>
<li><a href="#_contour_ingress_controller">Contour Ingress Controller</a></li>
</ul>
</li>
<li><a href="#_networkpolicy">NetworkPolicy</a>
<ul class="sectlevel4">
<li><a href="#_opis_22">Opis</a></li>
<li><a href="#_przykład_deklaratywny_13">Przykład deklaratywny</a></li>
<li><a href="#_api_11">API</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_storage">Storage</a>
<ul class="sectlevel3">
<li><a href="#_configmap">ConfigMap</a>
<ul class="sectlevel4">
<li><a href="#_opis_23">Opis</a></li>
<li><a href="#_przykład_deklaratywny_14">Przykład deklaratywny</a></li>
<li><a href="#_api_12">API</a></li>
</ul>
</li>
<li><a href="#_secret">Secret</a>
<ul class="sectlevel4">
<li><a href="#_opis_24">Opis</a></li>
<li><a href="#_typy_sekretów">Typy sekretów</a></li>
<li><a href="#_przykład_deklaratywny_15">Przykład deklaratywny</a></li>
<li><a href="#_api_13">API</a></li>
</ul>
</li>
<li><a href="#_emptydir">EmptyDir</a>
<ul class="sectlevel4">
<li><a href="#_opis_25">Opis</a></li>
<li><a href="#_przykład">Przykład</a></li>
</ul>
</li>
<li><a href="#_hostpath">HostPath</a>
<ul class="sectlevel4">
<li><a href="#_opis_26">Opis</a></li>
<li><a href="#_przykład_2">Przykład</a></li>
</ul>
</li>
<li><a href="#_csi">CSI</a>
<ul class="sectlevel4">
<li><a href="#_opis_27">Opis</a></li>
<li><a href="#_przykłady_sterowników">Przykłady sterowników</a></li>
</ul>
</li>
<li><a href="#_storageclass">StorageClass</a>
<ul class="sectlevel4">
<li><a href="#_opis_28">Opis</a></li>
<li><a href="#_przykład_deklaratywny_16">Przykład deklaratywny</a></li>
<li><a href="#_api_14">API</a></li>
</ul>
</li>
<li><a href="#_pv">PV</a>
<ul class="sectlevel4">
<li><a href="#_opis_29">Opis</a></li>
<li><a href="#_przykład_deklaratywny_17">Przykład deklaratywny</a></li>
<li><a href="#_api_15">API</a></li>
</ul>
</li>
<li><a href="#_pvc">PVC</a>
<ul class="sectlevel4">
<li><a href="#_opis_30">Opis</a></li>
<li><a href="#_przykład_deklaratywny_18">Przykład deklaratywny</a></li>
<li><a href="#_api_16">API</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_dodatkowe_funkcjonalności">Dodatkowe funkcjonalności</a>
<ul class="sectlevel3">
<li><a href="#_nodeselector">NodeSelector</a>
<ul class="sectlevel4">
<li><a href="#_opis_31">Opis</a></li>
<li><a href="#_przykład_3">Przykład</a></li>
</ul>
</li>
<li><a href="#_maintenance">Maintenance</a></li>
</ul>
</li>
<li><a href="#_zadania_2">Zadania</a>
<ul class="sectlevel3">
<li><a href="#_zadanie_1_wejście_na_dashboard">Zadanie 1: Wejście na dashboard</a>
<ul class="sectlevel4">
<li><a href="#_wprowadzenie">Wprowadzenie</a></li>
<li><a href="#_kroki">Kroki</a></li>
</ul>
</li>
<li><a href="#_zadanie_2_utworzenie_namespace">Zadanie 2: Utworzenie namespace</a></li>
<li><a href="#_zadanie_3_usunięcie_namespace">Zadanie 3. Usunięcie namespace</a></li>
<li><a href="#_zadanie_4_stworzenie_poda">Zadanie 4. Stworzenie poda</a></li>
<li><a href="#_zadanie_5_sprawdzenie_poda">Zadanie 5. Sprawdzenie poda</a></li>
<li><a href="#_zadanie_6_usunięcie_poda">Zadanie 6. Usunięcie poda</a></li>
<li><a href="#_zadanie_7_stworzenie_deploymentu">Zadanie 7. Stworzenie deploymentu</a></li>
<li><a href="#_zadanie_8_sprawdzenie_deploymentu">Zadanie 8. Sprawdzenie deploymentu</a></li>
<li><a href="#_zadanie_9_usunięcie_deploymentu">Zadanie 9. Usunięcie deploymentu</a></li>
<li><a href="#_zadanie_10_skalowanie_deploymentu">Zadanie 10. Skalowanie deploymentu</a></li>
<li><a href="#_zadanie_11_utworzenie_bazy_danych">Zadanie 11. Utworzenie bazy danych</a></li>
<li><a href="#_zadanie_12_przerobienie_zmiennej_środowiskowej_z_hasłem_do_postgresa_na_secret">Zadanie 12. Przerobienie zmiennej środowiskowej z hasłem do Postgresa na Secret</a></li>
<li><a href="#_zadanie_13_wolumen_dla_bazy_danych">Zadanie 13. Wolumen dla bazy danych</a></li>
<li><a href="#_zadanie_14_baza_danych_jako_statefulset">Zadanie 14. Baza danych jako StatefulSet</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div style="page-break-after: always;"></div>
</div>
</div>
<div class="sect1">
<h2 id="_opis">Opis</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Szkolenie Kubernetes szybki start obejmuje naukę i praktyczne
doświadczenie związane z zarządzaniem kontenerami. Uczestnicy zdobędą
umiejętności w zakresie konfiguracji i utrzymania klastra Kubernetes, co
obejmuje zarządzanie zasobami, skalowalność i dostępność. W trakcie
szkolenia praktycznego uczestnicy bedą pracować nad rzeczywistymi
przypadkami użycia, implementować aplikacje w kontenerach i nauczą się
jak skutecznie monitorować oraz debugować środowisko. Ponadto szkolenie
obejmuje tematy związane z bezpieczeństwem, takie jak zarządzanie
dostępem, autentykacja i szyfrowanie. Kurs ten umożliwi uczestnikom
zrozumienie ekosystemu Kubernetes i przygotuje ich do efektywnego
wdrażania i utrzymania aplikacji w kontenerach w środowisku
produkcyjnym.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_o_trenerze">O trenerze</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Imię i nazwisko: Juliusz Marciniak</p>
</div>
<div class="paragraph">
<p>Zawód: Programista, DevOps, TechLead</p>
</div>
<div class="paragraph">
<p>Doświadczenie: 10 lat</p>
</div>
<div class="paragraph">
<p>Technologie:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Java, Spring</p>
</li>
<li>
<p>Jenkins, GitLab, Nexus</p>
</li>
<li>
<p>Docker, Kubernetes</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Jestem programistą Java z 10-letnim stażem. W codziennej pracy
zajmuję się tematami cloudowymi i Kubernetesowymi. Oprócz tego doglądam
architektury aplikacji w swoich projektach. Jestem entuzjastą nowych
rozwiązań i technologii. Zwracam dużą uwagę, by rzeczy wdrażane przeze
mnie były przemyślane i spójne. Czasami też programuję… i rekrutuję.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_agenda">Agenda</h2>
<div class="sectionbody">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Wprowadzenie do konteneryzacji</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Jakie problemy rozwiązuje konteneryzacja?</p>
</li>
<li>
<p>Zasada działania i mechanizmy leżące u podstaw konteneryzacji</p>
</li>
<li>
<p>Podstawy konteneryzacji na przykładzie Docker i/lub Podman</p>
</li>
<li>
<p>Kontenery — tworzenie, konfigurowanie, zarządzanie</p>
</li>
<li>
<p>Rejestr obrazów</p>
</li>
<li>
<p>Budowanie obrazów niestandardowych</p>
</li>
<li>
<p>Wolumeny — tworzenie, konfigurowanie, montowanie</p>
</li>
<li>
<p>Konfiguracja i zarządzanie siecią</p>
</li>
<li>
<p>Bezpieczeństwo</p>
</li>
</ol>
</div>
</li>
<li>
<p>Platforma Kubernetes</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Architektura, możliwości oraz najważniejsze elementy klastra</p>
</li>
<li>
<p>Instalacja / przygotowanie środowiska deweloperskiego</p>
</li>
<li>
<p>Deskryptory zasobów</p>
</li>
<li>
<p>Zarządzanie elementami klastra (imperatywne, deklaratywne)</p>
</li>
<li>
<p>Podstawy administracji z wykorzystaniem narzędzia kubectl oraz panelu webowego</p>
</li>
</ol>
</div>
</li>
<li>
<p>Praca z klastrem</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>Tworzenie, wdrażanie i monitorowanie aplikacji w postaci Podów</p>
</li>
<li>
<p>Przechowywanie i dostarczanie konfiguracji do aplikacji (zmienne środowiskowe, argumenty linii poleceń, ConfigMaps, Secrets)</p>
</li>
<li>
<p>Efektywna administracja z wykorzystaniem etykiet, selektorów oraz kontrolerów</p>
</li>
<li>
<p>Skalowanie usług (ręczne, automatyczne)</p>
</li>
<li>
<p>Podział klastra na wirtualne przestrzenie</p>
</li>
<li>
<p>Usługi jako sposób na komunikację między wdrożonymi aplikacjami</p>
</li>
<li>
<p>Udostępnianie usług dla klientów zewnętrznych</p>
</li>
<li>
<p>Ograniczanie komunikacji sieciowej z użyciem polityk</p>
</li>
<li>
<p>Storage i dostęp do danych w oparciu o wolumeny</p>
</li>
<li>
<p>Wdrażanie i utrzymanie usług stanowych</p>
</li>
<li>
<p>Logowanie, monitorowanie oraz troubleshooting klastra i wdrożonych w nim aplikacji</p>
</li>
<li>
<p>Ograniczenie uprawnień oraz kontrola dostępu do elementów klastra</p>
</li>
<li>
<p>Helm jako natywny menedżer pakietów aplikacji w Kubernetes</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_zasady">Zasady</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>Staramy się nie spóźniać</p>
</li>
<li>
<p>Jesteśmy aktywni</p>
</li>
<li>
<p>Jeśli utknęliśmy na problemie podczas realizacji zadań — natychmiast informujemy</p>
</li>
<li>
<p>Nie śmiejemy się z innych i nie krytykujemy pomysłów innych</p>
</li>
<li>
<p>Każdy ma prawo do wyrażania swojej opinii</p>
</li>
<li>
<p>Przerwa na kawę co 1-1,5h</p>
</li>
<li>
<p>Przerwa obiadowa o 13:00</p>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
<div class="sect1">
<h2 id="_podstawy_teoretyczne">Podstawy teoretyczne</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_10_powodów_dla_których_warto_konteneryzować_aplikacje">10 powodów, dla których warto konteneryzować aplikacje</h3>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Izolacja i jednolitość: Kontenery izolują aplikacje od środowiska, co
eliminuje konflikty zależności i zapewnia jednolitość między różnymi
środowiskami.</p>
</li>
<li>
<p>Łatwość przenoszenia: Kontenery zawierają wszystkie niezbędne
zależności, co ułatwia przenoszenie aplikacji między różnymi platformami
i infrastrukturami.</p>
</li>
<li>
<p>Szybkość wdrażania: Kontenery uruchamiają się błyskawicznie, co
przyspiesza proces wdrażania i umożliwia elastyczne skalowanie w
zależności od obciążenia.</p>
</li>
<li>
<p>Elastyczność skalowania: Kontenery umożliwiają dynamiczne dodawanie
lub usuwanie instancji aplikacji w zależności od potrzeb, co wspiera
elastyczne skalowanie.</p>
</li>
<li>
<p>Łatwe zarządzanie zasobami: Kontenery pozwalają precyzyjnie zarządzać
zasobami, co prowadzi do efektywnego wykorzystania infrastruktury i
redukcji kosztów.</p>
</li>
<li>
<p>Łatwość utrzymania: Aktualizacje i poprawki mogą być łatwo wdrażane w
kontenerach, co minimalizuje czas niedostępności aplikacji.</p>
</li>
<li>
<p>Łatwa replikacja środowiska deweloperskiego: Kontenery pozwalają na
dokładne replikowanie środowiska deweloperskiego na produkcji, co
eliminuje problemy wynikające z różnic między środowiskami.</p>
</li>
<li>
<p>Bezpieczeństwo: Kontenery posiadają mechanizmy bezpieczeństwa, takie
jak izolacja procesów, co pomaga w zabezpieczeniu aplikacji i danych
przed nieautoryzowanym dostępem.</p>
</li>
<li>
<p>Automatyzacja: Kontenery integrują się łatwo z narzędziami do automatyzacji, co ułatwia zarządzanie cyklem życia aplikacji.</p>
</li>
<li>
<p>Podział na mikroserwisy: Kontenery wspierają architekturę
mikroserwisów, co ułatwia rozwijanie, utrzymanie i skalowanie
poszczególnych komponentów aplikacji niezależnie.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_porównanie_dockera_i_vm">Porównanie Dockera i VM</h3>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Rozmiar i Wydajność:</p>
<div class="ulist">
<ul>
<li>
<p>Docker: Kontenery Dockerowe są lżejsze od maszyn wirtualnych,
ponieważ dzielą jądro systemowe hosta i współdzielą zasoby z systemem
operacyjnym hosta. To sprawia, że są bardziej wydajne i uruchamiają się
szybciej.</p>
</li>
<li>
<p>Maszyny wirtualne: VM są bardziej obciążające dla systemu host,
ponieważ każda z nich wymaga własnego systemu operacyjnego, co prowadzi
do większego zużycia zasobów.</p>
</li>
</ul>
</div>
</li>
<li>
<p>Izolacja:</p>
<div class="ulist">
<ul>
<li>
<p>Docker: Kontenery Dockerowe używają przestrzeni użytkownika do
izolacji procesów, dzięki czemu są lżejsze. Izolacja jest mniej ścisła
niż w przypadku maszyn wirtualnych.</p>
</li>
<li>
<p>Maszyny wirtualne: VM oferują pełną izolację, ponieważ każda z nich
działa na własnym systemie operacyjnym, ale kosztem większego zużycia
zasobów.</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="Kubernetes_1_pliki/vm.png" alt="vm">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="Kubernetes_1_pliki/containers.png" alt="containers">
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_docker">Docker</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_co_to_jest_docker">Co to jest Docker?</h3>
<div class="paragraph">
<p>Docker to platforma open-source do konteneryzacji, umożliwiająca
pakowanie, dostarczanie i uruchamianie aplikacji w izolowanych
środowiskach zwanych kontenerami. Kontenery Docker zawierają aplikację
oraz wszystkie zależności, co eliminuje problemy związane z różnicami w
środowisku wykonawczym. Platforma pozwala na konsystentne wdrażanie
aplikacji na różnych środowiskach, od środowiska deweloperskiego po
produkcję. Docker używa obrazów, które są szablonami do tworzenia
kontenerów, a te z kolei oparte są na warstwowej strukturze plików, co
ułatwia efektywne dzielenie zasobów. Pozwala na szybkie skalowanie
aplikacji, zarządzanie zależnościami i izolację procesów. Docker
umożliwia prostą integrację z narzędziami do automatyzacji i dostarcza
narzędzi takich jak Docker Compose do definiowania i zarządzania
wielokontenerowymi aplikacjami. Popularność Dockera wynika z jego
elastyczności, wydajności i zdolności do jednolitego zarządzania
aplikacjami w kontenerach na różnych platformach. Platforma ta jest
szeroko stosowana w dziedzinie wdrażania mikroserwisów i tworzenia
skalowalnych i elastycznych architektur aplikacji.</p>
</div>
</div>
<div class="sect2">
<h3 id="_architektura">Architektura</h3>
<div class="imageblock">
<div class="content">
<img src="Kubernetes_1_pliki/docker-architecture.png" alt="docker architecture">
</div>
<div class="title">Figure 1. <a href="https://docs.docker.com/get-started/overview/" class="bare">https://docs.docker.com/get-started/overview/</a></div>
</div>
<div class="sect3">
<h4 id="_docker_daemon">Docker Daemon</h4>
<div class="paragraph">
<p>Docker Daemon, znany jako <code>dockerd</code>, to centralny serwer
Dockera, odpowiedzialny za zarządzanie cyklem życia kontenerów, alokację
zasobów, obsługę żądań klienta Docker oraz kontrolę dostępu do
systemowych zasobów. Działa w tle jako proces, umożliwiając interakcję z
klientami poprzez API REST lub interfejs Unix.</p>
</div>
</div>
<div class="sect3">
<h4 id="_docker_client">Docker client</h4>
<div class="paragraph">
<p>Docker Client to interfejs użytkownika, umożliwiający interakcję z
Docker Daemon poprzez linię poleceń. Działa jako narzędzie wiersza
poleceń, pozwalając użytkownikowi wysyłać żądania do serwera Dockera,
takie jak tworzenie, uruchamianie i zarządzanie kontenerami.</p>
</div>
</div>
<div class="sect3">
<h4 id="_docker_desktop">Docker Desktop</h4>
<div class="paragraph">
<p>Docker Desktop to narzędzie umożliwiające łatwe korzystanie z
platformy Docker na komputerach stacjonarnych. Dostarcza kompletną
instalację Dockera, w tym Docker Daemon, Docker CLI, narzędzia do
wizualnego zarządzania kontenerami oraz integrację z systemem
operacyjnym, umożliwiając szybkie tworzenie, testowanie i uruchamianie
kontenerów na platformie Windows lub macOS.</p>
</div>
</div>
<div class="sect3">
<h4 id="_docker_registries">Docker registries</h4>
<div class="paragraph">
<p>Docker Registries to repozytoria przechowujące i udostępniające
obrazy kontenerów używane przez platformę Docker. Mogą być publiczne,
takie jak Docker Hub, lub prywatne, umożliwiając organizacjom
przechowywanie i udostępnianie własnych obrazów kontenerów.</p>
</div>
</div>
<div class="sect3">
<h4 id="_docker_objects">Docker objects</h4>
<div class="paragraph">
<p>Docker objects to kluczowe elementy w ekosystemie Dockera, obejmujące
kontenery, obrazy, wolumeny, sieci i inne składniki używane do
definiowania i zarządzania środowiskiem kontenerowym. Te obiekty
pozwalają na przenośność aplikacji, izolację zasobów oraz efektywne
zarządzanie cyklem życia aplikacji w kontenerach.</p>
</div>
<div class="sect4">
<h5 id="_images">Images</h5>
<div class="paragraph">
<p>Obrazy (Images) w Dockerze są szablonami, które definiują zawartość i
konfigurację środowiska potrzebnego do uruchomienia aplikacji w
kontenerze. Są to jednokierunkowe, niezmienne struktury, które zawierają
system plików z wszystkimi zależnościami i konfiguracjami niezbędnymi
dla aplikacji. Obrazy są tworzone na podstawie plików Dockerfile, które
zawierają instrukcje dotyczące instalacji aplikacji, konfiguracji
środowiska oraz dodawania danych do obrazu. Po utworzeniu obrazu może on
być przechowywany w Docker Registry, a następnie używany do
uruchamiania wielu kontenerów, co umożliwia jednolite wdrażanie
aplikacji na różnych środowiskach.</p>
</div>
</div>
<div class="sect4">
<h5 id="_containers">Containers</h5>
<div class="paragraph">
<p>Kontenery w Dockerze są lekkimi, przenośnymi jednostkami
wykonawczymi, które zawierają wszystko, co jest niezbędne do
uruchomienia aplikacji, włącznie z kodem, zależnościami i konfiguracją.
Kontenery opierają się na izolacji procesów, dzięki czemu mogą działać
niezależnie od siebie na jednym systemie operacyjnym.</p>
</div>
<div class="paragraph">
<p>Przykładem uruchomienia kontenera może być uruchomienie kontenera
NGINX, popularnego serwera HTTP, za pomocą następującego polecenia w
terminalu:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">docker run -d -p 8080:80 nginx</code></pre>
</div>
</div>
<div class="paragraph">
<p>To polecenie powoduje, że Docker Daemon pobiera obraz NGINX z Docker
Hub (jeśli nie jest już pobrany), a następnie tworzy i uruchamia
instancję kontenera NGINX. Opcja <code>-d</code> oznacza, że kontener będzie działał w tle (detached mode), a <code>-p 8080:80</code>
przekierowuje port 8080 na lokalnej maszynie do portu 80 w kontenerze
NGINX. Po wykonaniu tego polecenia serwer NGINX będzie dostępny lokalnie
pod adresem <a href="http://localhost:8080/" class="bare">http://localhost:8080</a>, obsługując żądania przez uruchomiony kontener.</p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_instalacja">Instalacja</h3>
<div class="paragraph">
<p><a href="https://docs.docker.com/engine/install/" class="bare">https://docs.docker.com/engine/install/</a></p>
</div>
</div>
<div class="sect2">
<h3 id="_komendy">Komendy</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
pull Download an image from a registry
push Upload an image to a registry
images List images
login Log in to a registry
logout Log out from a registry
search Search Docker Hub for images
version Show the Docker version information
info Display system-wide information
Management Commands:
builder Manage builds
buildx* Docker Buildx (Docker Inc., v0.11.2-desktop.5)
compose* Docker Compose (Docker Inc., v2.23.0-desktop.1)
container Manage containers
context Manage contexts
dev* Docker Dev Environments (Docker Inc., v0.1.0)
extension* Manages Docker extensions (Docker Inc., v0.2.20)
image Manage images
init* Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.9)
manifest Manage Docker image manifests and manifest lists
network Manage networks
plugin Manage plugins
sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan* Docker Scan (Docker Inc., v0.26.0)
scout* Docker Scout (Docker Inc., v1.0.9)
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Swarm Commands:
swarm Manage Swarm
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
export Export a container's filesystem as a tar archive
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Global Options:
--config string Location of client config files (default "/Users/jmarciniak/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket to connect to
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/Users/jmarciniak/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/Users/jmarciniak/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/Users/jmarciniak/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Run 'docker COMMAND --help' for more information on a command.
For more help on how to use Docker, head to https://docs.docker.com/go/guides/</code></pre>
</div>
</div>
<div class="sect3">
<h4 id="_docker_pull">docker pull</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Download an image from a registry
Aliases:
docker image pull, docker pull
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_docker_build">docker build</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">Usage: docker buildx build [OPTIONS] PATH | URL | -
Start a build
Aliases:
docker buildx build, docker buildx b
Options:
--add-host strings Add a custom host-to-IP mapping (format: "host:ip")
--allow strings Allow extra privileged entitlement (e.g., "network.host", "security.insecure")
--attest stringArray Attestation parameters (format: "type=sbom,generator=image")
--build-arg stringArray Set build-time variables
--build-context stringArray Additional build contexts (e.g., name=path)
--builder string Override the configured builder instance (default "desktop-linux")
--cache-from stringArray External cache sources (e.g., "user/app:cache", "type=local,src=path/to/dir")
--cache-to stringArray Cache export destinations (e.g., "user/app:cache", "type=local,dest=path/to/dir")
--cgroup-parent string Optional parent cgroup for the container
-f, --file string Name of the Dockerfile (default: "PATH/Dockerfile")
--iidfile string Write the image ID to the file
--label stringArray Set metadata for an image
--load Shorthand for "--output=type=docker"
--metadata-file string Write build result metadata to the file
--network string Set the networking mode for the "RUN" instructions during build (default "default")
--no-cache Do not use cache when building the image
--no-cache-filter stringArray Do not cache specified stages
-o, --output stringArray Output destination (format: "type=local,dest=path")
--platform stringArray Set target platform for build
--progress string Set type of progress output ("auto", "plain", "tty"). Use plain to show container output (default "auto")
--provenance string Shorthand for "--attest=type=provenance"
--pull Always attempt to pull all referenced images
--push Shorthand for "--output=type=registry"
-q, --quiet Suppress the build output and print image ID on success
--sbom string Shorthand for "--attest=type=sbom"
--secret stringArray Secret to expose to the build (format: "id=mysecret[,src=/local/secret]")
--shm-size bytes Size of "/dev/shm"
--ssh stringArray SSH agent socket or keys to expose to the build (format: "default|&lt;id&gt;[=&lt;socket&gt;|&lt;key&gt;[,&lt;key&gt;]]")
-t, --tag stringArray Name and optionally a tag (format: "name:tag")
--target string Set the target build stage to build
--ulimit ulimit Ulimit options (default [])</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_docker_run">docker run</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Create and run a new container from an image
Aliases:
docker container run, docker run
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--annotation map Add an annotation to the container (passed through to the OCI runtime) (default map[])
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
--cgroupns string Cgroup namespace to use (host|private)
'host': Run the container in the Docker host's cgroup namespace
'private': Run the container in its own private cgroup namespace
'': Use the cgroup namespace as configured by the
default-cgroupns-mode option on the daemon (default)
--cidfile string Write the container ID to the file
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-d, --detach Run container in background and print container ID
--detach-keys string Override the key sequence for detaching a container
--device list Add a host device to the container
--device-cgroup-rule list Add a rule to the cgroup allowed devices list
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-read-iops list Limit read rate (IO per second) from a device (default [])
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
--device-write-iops list Limit write rate (IO per second) to a device (default [])
--disable-content-trust Skip image verification (default true)
--dns list Set custom DNS servers
--dns-option list Set DNS options
--dns-search list Set custom DNS search domains
--domainname string Container NIS domain name
--entrypoint string Overwrite the default ENTRYPOINT of the image
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
--expose list Expose a port or a range of ports
--gpus gpu-request GPU devices to add to the container ('all' to pass all GPUs)
--group-add list Add additional groups to join
--health-cmd string Command to run to check health
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
--health-retries int Consecutive failures needed to report unhealthy
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
--help Print usage
-h, --hostname string Container host name
--init Run an init inside the container that forwards signals and reaps processes
-i, --interactive Keep STDIN open even if not attached
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--ipc string IPC mode to use
--isolation string Container isolation technology
--kernel-memory bytes Kernel memory limit
-l, --label list Set meta data on a container
--label-file list Read in a line delimited file of labels
--link list Add link to another container
--link-local-ip list Container IPv4/IPv6 link-local addresses
--log-driver string Logging driver for the container
--log-opt list Log driver options
--mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
--mount mount Attach a filesystem mount to the container
--name string Assign a name to the container
--network network Connect a container to a network
--network-alias list Add network-scoped alias for the container
--no-healthcheck Disable any container-specified HEALTHCHECK
--oom-kill-disable Disable OOM Killer
--oom-score-adj int Tune host's OOM preferences (-1000 to 1000)
--pid string PID namespace to use
--pids-limit int Tune container pids limit (set -1 for unlimited)
--platform string Set platform if server is multi-platform capable
--privileged Give extended privileges to this container
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
--pull string Pull image before running ("always", "missing", "never") (default "missing")
-q, --quiet Suppress the pull output
--read-only Mount the container's root filesystem as read only
--restart string Restart policy to apply when a container exits (default "no")
--rm Automatically remove the container when it exits
--runtime string Runtime to use for this container
--security-opt list Security Options
--shm-size bytes Size of /dev/shm
--sig-proxy Proxy received signals to the process (default true)
--stop-signal string Signal to stop the container
--stop-timeout int Timeout (in seconds) to stop a container
--storage-opt list Storage driver options for the container
--sysctl map Sysctl options (default map[])
--tmpfs list Mount a tmpfs directory
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
-u, --user string Username or UID (format: &lt;name|uid&gt;[:&lt;group|gid&gt;])
--userns string User namespace to use
--uts string UTS namespace to use
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
-w, --workdir string Working directory inside the container</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_cheat_sheet">Cheat sheet</h4>
<div class="paragraph">
<p><a href="https://docs.docker.com/get-started/docker_cheatsheet.pdf" class="bare">https://docs.docker.com/get-started/docker_cheatsheet.pdf</a></p>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
<div class="sect2">
<h3 id="_zadania">Zadania</h3>
<div class="sect3">
<h4 id="_zadanie_1_pobranie_obrazu">Zadanie 1. Pobranie obrazu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Pobierz obraz <code>nginx</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_2_uruchomienie_obrazu">Zadanie 2. Uruchomienie obrazu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Uruchom kontener z obrazu <code>httpd</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_3_sprawdzenie_listy_obrazów">Zadanie 3. Sprawdzenie listy obrazów</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Sprawdź listę obrazów komendą <code>docker image ls</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_4_sprawdzenie_działających_kontenerów">Zadanie 4. Sprawdzenie działających kontenerów</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Sprawdź listę działających kontenerów komendą <code>docker ps</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_5_uruchomienie_kontenera_na_konkretnym_porcie">Zadanie 5. Uruchomienie kontenera na konkretnym porcie</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Uruchom kontener z obrazu <code>nginx</code></p>
</li>
<li>
<p>Wskaż port 8000 na hoście, na którym ma działać ten kontener</p>
</li>
<li>
<p>Sprawdź, czy <code>nginx</code> działa</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_6_sprawdzanie_logów">Zadanie 6. Sprawdzanie logów</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Sprawdź logi kontenera z poprzedniego zadania za pomocą <code>docker logs</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_7_uruchomienie_bazy_danych">Zadanie 7. Uruchomienie bazy danych</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Uruchom kontener z obrazu <code>postgres</code></p>
</li>
<li>
<p>Wskaż odpowiednie porty</p>
</li>
<li>
<p>Przekaż odpowiednie zmienne środowiskowe</p>
</li>
<li>
<p>Ustaw odpowiednie volumeny</p>
</li>
<li>
<p>Sprawdź, czy baza danych działa (możesz za pomocą logów)</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_8_budowanie_obrazu">Zadanie 8. Budowanie obrazu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Stwórz <code>Dockerfile</code></p>
</li>
<li>
<p>Stwórz obraz z <code>nginx</code></p>
</li>
<li>
<p>Zbuduj obraz i otaguj go jako <code>my-nginx</code></p>
</li>
<li>
<p>Uruchom kontener z tego obrazu</p>
</li>
<li>
<p>Sprawdź, czy kontener działa (możesz za pomocą logów)</p>
</li>
</ol>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_kubernetes">Kubernetes</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_co_to_jest_kubernetes">Co to jest Kubernetes?</h3>
<div class="paragraph">
<p>Kubernetes to otwarte oprogramowanie do automatycznego wdrażania,
skalowania i zarządzania kontenerami aplikacyjnymi. Jest często używane
do orkiestrowania kontenerów Dockera, chociaż obsługuje również inne
kontenery. Kubernetes dostarcza narzędzi i mechanizmów do zarządzania
mikroserwisowymi aplikacjami w sposób zdecentralizowany. Pozwala na
definiowanie, uruchamianie i skalowanie aplikacji składających się z
wielu kontenerów, umożliwiając elastyczne zarządzanie zasobami.
Kubernetes obsługuje automatyczne przywracanie zgodnie z zdefiniowanym
stanem oraz umożliwia równomierne rozłożenie obciążenia między różnymi
instancjami aplikacji. Dzięki deklaratywnemu podejściu do konfiguracji
Kubernetes umożliwia programistom skupienie się na opisie zamierzonego
stanu systemu, pozostawiając platformie zadanie samodzielnego
dostosowywania rzeczywistego stanu do deklaratywnie określonego stanu.
Kubernetes jest szeroko stosowany w środowiskach chmurowych oraz w
środowiskach lokalnych do budowy skalowalnych i odpornych na awarie
aplikacji opartych na kontenerach.</p>
</div>
</div>
<div class="sect2">
<h3 id="_architektura_2">Architektura</h3>
<div class="imageblock">
<div class="content">
<img src="Kubernetes_1_pliki/kubernetes-architecture.svg" alt="kubernetes architecture">
</div>
<div class="title">Figure 2. <a href="https://kubernetes.io/docs/concepts/architecture/" class="bare">https://kubernetes.io/docs/concepts/architecture/</a></div>
</div>
<div class="sect3">
<h4 id="_etcd">etcd</h4>
<div class="paragraph">
<p><code>etcd</code> pełni kluczową rolę wewnątrz klastra Kubernetes
jako rozproszony i niezawodny magazyn danych, przechowujący konfigurację
klastra, stan zasobów oraz inne ważne informacje w formie kluczy i
wartości. To rozproszone repozytorium przechowuje dane w sposób spójny,
co pozwala na synchronizację i dostęp do informacji pomiędzy różnymi
węzłami klastra. <code>etcd</code> obsługuje automatyczne przywracanie,
co sprawia, że jest niezawodnym źródłem prawdy, a jego spójność danych
jest kluczowa dla poprawnego działania wszystkich komponentów
Kubernetes. Działa również jako mechanizm blokujący, umożliwiając
koordynację i rozwiązanie problemów związanych z jednoczesnym dostępem
do danych przez różne komponenty klastra.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kube_apiserver">kube-apiserver</h4>
<div class="paragraph">
<p><code>kube-apiserver</code> jest komponentem kluczowym w klastrze
Kubernetes, pełniącym rolę interfejsu API dla zarządzania klastrami.
Jego głównym zadaniem jest wystawianie interfejsu RESTful API, który
umożliwia komunikację pomiędzy różnymi komponentami klastra oraz
interakcję z użytkownikami i narzędziami zewnętrznymi. <code>kube-apiserver</code>
odpowiedzialny jest za przyjmowanie żądań API, autentykację,
autoryzację, a także przekazywanie tych żądań do odpowiednich
komponentów systemu. To centralne miejsce, w którym konfigurowane są
obiekty Kubernetes, takie jak Pod, Service czy Deployment, co umożliwia
jednolite zarządzanie zasobami klastra.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kube_scheduler">kube-scheduler</h4>
<div class="paragraph">
<p><code>kube-scheduler</code> w klastrze Kubernetes odpowiada za
decyzje dotyczące tego, na którym węźle klastra należy uruchomić nowo
tworzone kontenery. Jego rola polega na analizowaniu dostępnych zasobów w
klastrze, takich jak CPU i pamięć, oraz uwzględnianiu wymagań
dotyczących zasobów i polityk wdrażania określonych przez użytkownika.
Kiedy nowy pod jest tworzony, <code>kube-scheduler</code> decyduje, na
którym węźle powinien zostać uruchomiony, co pozwala na równomierne
rozłożenie obciążenia w klastrze. Ten komponent jest integralną częścią
procesu wdrażania i skalowania aplikacji w Kubernetes, zapewniając
optymalne wykorzystanie dostępnych zasobów w klastrze.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kube_controller_manager">kube-controller-manager</h4>
<div class="paragraph">
<p><code>kube-controller-manager</code> pełni kluczową rolę wewnątrz
klastra Kubernetes, zarządzając różnymi kontrolerami, które monitorują i
utrzymują stan klastra zgodnie z określonymi specyfikacjami. Kontrolery
te obejmują różne obszary, takie jak zarządzanie replikami, wdrażanie
aplikacji, dostawcy chmury oraz zarządzanie woluminami. Działa w tle,
automatyzując zadania administracyjne i zapewniając, że deklaratywny
stan klastra jest zawsze zgodny z zamierzonymi specyfikacjami. W ten
sposób <code>kube-controller-manager</code> wspomaga utrzymanie stabilności, niezawodności i zgodności z oczekiwaniami użytkownika w środowisku Kubernetes.</p>
</div>
</div>
<div class="sect3">
<h4 id="_cloud_controller_manager_opcjonalny">cloud-controller-manager (opcjonalny)</h4>
<div class="paragraph">
<p><code>cloud-controller-manager</code> zajmuje się zarządzaniem
kontrolerami specyficznymi dla dostawcy chmury. Jego głównym zadaniem
jest umożliwienie integracji z zasobami chmurowymi dostawcy, takimi jak
AWS, GCP lub Azure, zapewniając optymalne wykorzystanie funkcji
oferowanych przez danego dostawcę. <code>cloud-controller-manager</code>
deleguje kontrolery chmury do zewnętrznego dostawcy, co umożliwia
modularność i elastyczność w zarządzaniu różnymi aspektami klastra,
takimi jak równoważenie obciążenia, routing sieciowy czy dostosowywanie
rozmiaru węzłów. Dzięki temu komponentowi Kubernetes może skutecznie
dostosować się do specyfiki środowiska chmurowego, co jest kluczowe dla
efektywnego i spójnego zarządzania zasobami w klastrze.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kube_proxy">kube-proxy</h4>
<div class="paragraph">
<p><code>kube-proxy</code> to komponent wewnątrz klastra Kubernetes
odpowiedzialny za zarządzanie ruchem sieciowym między różnymi podami.
Jego głównym zadaniem jest utrzymanie reguł przekierowań (routingu) na
poziomie węzła, umożliwiając komunikację między różnymi podami w
klastrze. <code>kube-proxy</code> implementuje funkcje takie jak Network
Address Translation (NAT) i Load Balancing, umożliwiając dostęp do
aplikacji działających w kontenerach na różnych węzłach klastra. Działa
zarówno w trybie użytkownika (user space) jak i w trybie jądra (kernel
space), dostosowując się do specyfiki środowiska.</p>
</div>
<div class="paragraph">
<p>Ten komponent jest kluczowy dla zapewnienia komunikacji między podami
w klastrze, zarządzając dostępem do usług oraz umożliwiając skalowanie
aplikacji w sposób przezroczysty dla użytkownika. Dzięki <code>kube-proxy</code>,
Kubernetes oferuje jednolity sposób zarządzania ruchem sieciowym,
niezależnie od tego, czy aplikacje działają wewnątrz klastra, czy są
dostępne publicznie.</p>
</div>
</div>
<div class="sect3">
<h4 id="_kubelet">kubelet</h4>
<div class="paragraph">
<p><code>kubelet</code> to agent działający na każdym węźle w klastrze
Kubernetes, odpowiedzialny za zarządzanie i utrzymanie kontenerów na
danym węźle. Jego główną rolą jest monitorowanie stanu podów (instancji
kontenerów) i ich zarządzanie zgodnie z deklaratywną konfiguracją
dostarczoną przez <code>kube-apiserver</code>. <code>Kubelet</code>
komunikuje się z serwerem API Dockera (lub innej implementacji
kontenerów) na danym węźle, inicjując operacje związane z cyklem życia
kontenerów, takie jak ich uruchamianie, zatrzymywanie czy usuwanie.
Dodatkowo, Kubelet sprawuje kontrolę nad zasobami węzła, raportując
informacje na temat dostępności, zużycia pamięci czy CPU.</p>
</div>
<div class="paragraph">
<p><code>Kubelet</code> jest kluczowym elementem umożliwiającym
realizację deklaratywnego modelu zarządzania zasobami w klastrze
Kubernetes. Działa w tle, utrzymując zgodność stanu rzeczywistego węzła z
zamierzoną konfiguracją. Jego rola obejmuje także raportowanie stanu
podów i węzła do <code>kube-apiserver</code>, co umożliwia koordynację działań na poziomie klastra.</p>
</div>
</div>
<div class="sect3">
<h4 id="_node">Node</h4>
<div class="sect4">
<h5 id="_opis_2">Opis</h5>
<div class="paragraph">
<p>W Kubernetes, node to pojedyncza jednostka obliczeniowa w klastrze,
na której uruchamiane są kontenery. Każdy node reprezentuje fizyczną
maszynę lub wirtualną maszynę w infrastrukturze klastra. W skład jednego
noda wchodzą kluczowe komponenty, takie jak Kubelet, który zarządza
podami na danym węźle, oraz Kube-proxy, który odpowiada za
przekierowywanie ruchu sieciowego między podami. Node zawiera także
runtime kontenerów, na przykład Docker, który wykonuje kontenery na
poziomie węzła. W klastrze Kubernetes, pody są uruchamiane na węzłach,
tworząc jednostki wdrażania dla aplikacji. Etykietowanie węzłów
umożliwia przypisywanie im różnych właściwości, ułatwiając selekcję
węzłów do konkretnych zadań. Dynamiczne skalowanie pozwala na elastyczne
uruchamianie i zarządzanie podami na różnych węzłach w zależności od
dostępności zasobów. Węzły są zarządzane przez kontroler zarządzania
węzłami, co obejmuje monitorowanie i utrzymanie ich stanu w klastrze
Kubernetes.</p>
</div>
</div>
<div class="sect4">
<h5 id="_control_plane">Control plane</h5>
<div class="paragraph">
<p>Control Plane w Kubernetes to centralny zestaw komponentów
odpowiedzialnych za zarządzanie i kontrolowanie działania klastra.
Składa się z kluczowych elementów, takich jak API Server, etcd,
Kube-scheduler i Controller Manager, które współpracują w celu
utrzymania pożądanego stanu klastra. API Server pełni rolę interfejsu
komunikacyjnego, etcd przechowuje trwałe dane konfiguracyjne,
Kube-scheduler odpowiada za planowanie pracy, a Controller Manager
monitoruje stan klastra i podejmuje działania w celu utrzymania
spójności. Control Plane jest zarządzane przez główny węzeł w klastrze,
który przyjmuje polecenia od użytkowników i koordynuje działanie
pozostałych węzłów.</p>
</div>
</div>
<div class="sect4">
<h5 id="_worker">Worker</h5>
<div class="paragraph">
<p>Worker node w klastrze Kubernetes to węzeł, który pełni rolę
wykonawczą, uruchamiając kontenery i hostując pody. Jest to fizyczna
maszyna lub wirtualna maszyna, na której działa agent Kubelet,
odpowiadający za komunikację z głównym API serwerem kontrolnym i
zarządzanie podami. Dodatkowo, na worker node działa Kube-proxy, który
odpowiada za zarządzanie ruchem sieciowym między podami. Węzły robocze
są kluczowym elementem klastra, zapewniającym miejsce do uruchamiania
aplikacji i realizowania obliczeń.</p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_cri">CRI</h3>
<div class="sect3">
<h4 id="_opis_3">Opis</h4>
<div class="paragraph">
<p>CRI, czyli Container Runtime Interface, to standardowy interfejs w
Kubernetesie, który umożliwia komunikację między Kubelet (komponentem
działającym na węzłach w klastrze) a różnymi runtimeami kontenerów. CRI
pełni kluczową rolę w modularności Kubernetes, pozwalając na używanie
różnych runtimeów kontenerów wewnątrz klastra.</p>
</div>
</div>
<div class="sect3">
<h4 id="_wspierane_cri">Wspierane CRI</h4>
<div class="ulist">
<ul>
<li>
<p>containerd</p>
</li>
<li>
<p>CRI-O</p>
</li>
<li>
<p>Docker Engine (cri-dockerd)</p>
</li>
<li>
<p>Mirantis Container Runtime</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_dockershim">dockershim</h4>
<div class="paragraph">
<p>W grudniu 2020 roku Kubernetes ogłosił plany usunięcia wsparcia dla
dockershim, który był interfejsem CRI używanym przez Docker w celu
integracji z Kubeletem. W wydaniu Kubernetes 1.20 dockershim było
oznaczone jako przestarzałe, ostatecznie usunięto wsparcie w wersji
1.24.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_cykl_wydań_i_wsparcie_w_kubernetes">Cykl Wydań i Wsparcie w Kubernetes</h3>
<div class="paragraph">
<p>Wydania Kubernetes są planowane i publikowane regularnie, co trzy
miesiące. Cykl wydawniczy jest stosunkowo krótki, co oznacza, że nowa
stabilna wersja jest publikowana kwartalnie.</p>
</div>
<div class="paragraph">
<p>Wsparcie dla poszczególnych wersji jest zarządzane zgodnie z zasadami
określonymi w "Kubernetes Version Skew Policy". Te zasady obejmują dwie
kwestie: wsparcie dla wersji stabilnej (version skew) oraz wsparcie dla
konkretnego wydania (release support).</p>
</div>
<div class="paragraph">
<p><strong>Wersja Stabilna (Version Skew):</strong> Kubernetes wspiera
wersję stabilną, co oznacza, że nowszy Kubelet (węzeł) może komunikować
się z starszym API Serverem (główny węzeł) i odwrotnie, ale z pewnym
ograniczeniem. Zaleca się jednak aktualizację wszystkich komponentów
klastra do najnowszej wersji.</p>
</div>
<div class="paragraph">
<p><strong>Wsparcie dla Wydania (Release Support):</strong> Oficjalne
wsparcie dla danego wydania Kubernetes trwa około 1 roku od daty
wydania. W ciągu tego czasu dostarczane są nowe poprawki bezpieczeństwa i
łatki dla danej wersji. Po upływie tego okresu wydanie traci oficjalne
wsparcie.</p>
</div>
<div class="paragraph">
<p>Warto zaznaczyć, że dostawcy klastrów oraz narzędzi do zarządzania
klastrami mogą oferować dłuższe wsparcie dla konkretnych wersji. Dlatego
ważne jest sprawdzenie oficjalnej dokumentacji i polityki wsparcia dla
danego dostawcy lub narzędzia, jeśli używasz Kubernetes w konkretnym
środowisku.</p>
</div>
<div class="paragraph">
<p>Aktualizacje Kubernetes są wprowadzane często, aby dostarczać nowe
funkcje, poprawiać bezpieczeństwo, zwiększać wydajność oraz dostosowywać
platformę do zmieniających się wymagań. Dlatego zaleca się regularne
aktualizacje klastra Kubernetes, aby korzystać z najnowszych korzyści i
poprawek.</p>
</div>
</div>
<div class="sect2">
<h3 id="_wersje_api">Wersje API</h3>
<div class="ulist">
<ul>
<li>
<p>Alfa</p>
<div class="ulist">
<ul>
<li>
<p>Nazwy wersji zawierają alfa (na przykład v1alpha1).</p>
</li>
<li>
<p>Wbudowane wersje API alfa są domyślnie wyłączone i muszą być jawnie włączone w konfiguracji kube-apiserver, aby zostały użyte.</p>
</li>
<li>
<p>Oprogramowanie może zawierać błędy. Włączenie funkcji może ujawnić błędy.</p>
</li>
<li>
<p>Wsparcie dla wersji alfa API może zostać usunięte w dowolnym momencie bez wcześniejszego powiadomienia.</p>
</li>
<li>
<p>API może ulec zmianie w sposób niekompatybilny w późniejszym wydaniu oprogramowania bez wcześniejszego powiadomienia.</p>
</li>
<li>
<p>Oprogramowanie jest zalecane do użytku tylko w krótkotrwałych
klastrach testowych ze względu na zwiększone ryzyko błędów i brak
długoterminowego wsparcia.</p>
</li>
</ul>
</div>
</li>
<li>
<p>Beta</p>
<div class="ulist">
<ul>
<li>
<p>Nazwy wersji zawierają beta (na przykład v2beta3).</p>
</li>
<li>
<p>Wbudowane wersje API beta są domyślnie wyłączone i muszą być jawnie
włączone w konfiguracji kube-apiserver, aby zostały użyte (z wyjątkiem
wersji beta API wprowadzonych przed Kubernetes 1.22, które były
domyślnie włączone).</p>
</li>
<li>
<p>Wbudowane wersje API beta mają maksymalny okres życia 9 miesięcy lub 3
wydań (zależnie od tego, które jest dłuższe) od wprowadzenia do
przestarzałości, a także 9 miesięcy lub 3 wydań (zależnie od tego, które
jest dłuższe) od przestarzałości do usunięcia.</p>
</li>
<li>
<p>Oprogramowanie jest dobrze przetestowane. Włączenie funkcji uważane jest za bezpieczne.</p>
</li>
<li>
<p>Wsparcie dla funkcji nie zostanie usunięte, chociaż szczegóły mogą ulec zmianie.</p>
</li>
<li>
<p>Schemat i/lub semantyka obiektów mogą ulec zmianie w sposób
niekompatybilny w późniejszej wersji API beta lub stabilnej. W przypadku
takich zmian udostępniane są instrukcje migracyjne. Przystosowanie do
kolejnej wersji API beta lub stabilnej może wymagać edycji lub ponownego
tworzenia obiektów API i może nie być prostą operacją. Migracja może
wymagać czasu przestoju dla aplikacji korzystających z danej funkcji.</p>
</li>
<li>
<p>Oprogramowanie nie jest zalecane do użycia w środowisku produkcyjnym.
Kolejne wydania mogą wprowadzać zmiany niekompatybilne. Użycie wersji
API beta jest konieczne do przejścia do kolejnych wersji API beta lub
stabilnych po tym, jak wersja API beta zostanie przestarzała i
przestanie być obsługiwana.</p>
</li>
</ul>
</div>
</li>
<li>
<p>Stabilne</p>
<div class="ulist">
<ul>
<li>
<p>Nazwa wersji to vX, gdzie X to liczba całkowita.</p>
</li>
<li>
<p>Stabilne wersje API pozostają dostępne we wszystkich przyszłych
wydaniach w ramach danej wersji głównej Kubernetes, i nie ma obecnych
planów na rewizję głównej wersji Kubernetes, która usuwałaby stabilne
API.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_wycofywanie_api">Wycofywanie API</h3>
<div class="sect3">
<h4 id="_zasada_1">Zasada #1</h4>
<div class="paragraph">
<p>API elementy mogą być usuwane jedynie poprzez zwiększenie wersji grupy API.</p>
</div>
<div class="paragraph">
<p>Po dodaniu elementu API do grupy API w konkretnej wersji, nie można
go usunąć z tej wersji ani istotnie zmienić jego zachowania, niezależnie
od ścieżki.</p>
</div>
</div>
<div class="sect3">
<h4 id="_zasada_2">Zasada #2</h4>
<div class="paragraph">
<p>Obiekty API muszą być w stanie przemieszczać się między wersjami API w
danym wydaniu bez utraty informacji, z wyjątkiem całych zasobów REST,
które nie istnieją w niektórych wersjach.</p>
</div>
<div class="paragraph">
<p>Na przykład obiekt można zapisać jako v1, odczytać jako v2 i
przekonwertować na v1, a rezultujący zasób v1 będzie identyczny z
oryginalnym. Reprezentacja w v2 może różnić się od v1, ale system
potrafi je konwertować w obie strony. Dodatkowo, każde nowe pole dodane w
v2 musi być w stanie przemieszczać się między v1 a z powrotem, co
oznacza, że v1 może musieć dodać równoważne pole lub reprezentować je
jako adnotację.</p>
</div>
</div>
<div class="sect3">
<h4 id="_zasada_3">Zasada #3</h4>
<div class="paragraph">
<p>Wersji API w danej ścieżce nie wolno przestarzać na rzecz mniej stabilnej wersji API.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Wersje GA mogą zastępować wersje beta i alfa.</p>
</li>
<li>
<p>Wersje beta mogą zastępować wcześniejsze wersje beta i alfa, ale nie mogą zastępować wersji GA.</p>
</li>
<li>
<p>Wersje alfa mogą zastępować wcześniejsze wersje alfa, ale nie mogą zastępować wersji GA ani beta.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_zasada_4a">Zasada #4a</h4>
<div class="paragraph">
<p>Żywotność API jest określana przez poziom stabilności API.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Wersje GA mogą być oznaczone jako przestarzałe, ale nie mogą być usuwane w ramach głównej wersji Kubernetes.</p>
</li>
<li>
<p>Wersje beta są przestarzałe nie wcześniej niż 9 miesięcy lub 3
wydania po wprowadzeniu (zależnie od tego, co jest dłuższe) i przestają
być obsługiwane 9 miesięcy lub 3 wydania po przestarzałości (zależnie od
tego, co jest dłuższe).</p>
</li>
<li>
<p>Wersje alfa mogą być usuwane w dowolnej wersji bez wcześniejszego ogłoszenia przestarzałości.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>To zapewnia, że wsparcie dla wersji beta obejmuje maksymalne
wspierane odchylenie wersji wynoszące 2 wydania, oraz że API nie utyka
na niestabilnych wersjach beta, gromadząc użycie w produkcji, które
zostanie zakłócone, gdy wsparcie dla wersji beta zakończy się.</p>
</div>
</div>
<div class="sect3">
<h4 id="_zasada_4b">Zasada #4b</h4>
<div class="paragraph">
<p>"Preferowana" wersja API i "wersja przechowywania" dla danej grupy
nie mogą się zmieniać, dopóki nie zostanie wydane wsparcie dla obu nowej
i poprzedniej wersji.</p>
</div>
<div class="paragraph">
<p>Użytkownicy muszą być w stanie zaktualizować się do nowej wersji
Kubernetes, a następnie cofnąć się do poprzedniej wersji, bez konwersji
do nowej wersji API lub doświadczania awarii (chyba że używali wyłącznie
funkcji dostępnych w nowszej wersji). Jest to szczególnie istotne w
przechowywanej reprezentacji obiektów.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_kubectl">kubectl</h3>
<div class="sect3">
<h4 id="_opis_4">Opis</h4>
<div class="paragraph">
<p><code>kubectl</code> to narzędzie wiersza poleceń używane do
interakcji z klastrami Kubernetes. Pozwala użytkownikom na wysyłanie
poleceń do serwera Kubernetes, zarządzanie zasobami klastra, wdrażanie
aplikacji oraz monitorowanie stanu kontenerów i podów.</p>
</div>
</div>
<div class="sect3">
<h4 id="_instalacja_2">Instalacja</h4>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/tasks/tools/" class="bare">https://kubernetes.io/docs/tasks/tools/</a></p>
</div>
</div>
<div class="sect3">
<h4 id="_komendy_2">Komendy</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/
Basic Commands (Beginner):
create Create a resource from a file or from stdin
expose Take a replication controller, service, deployment or pod and expose it as a new Kubernetes service
run Run a particular image on the cluster
set Set specific features on objects
Basic Commands (Intermediate):
explain Get documentation for a resource
get Display one or many resources
edit Edit a resource on the server
delete Delete resources by file names, stdin, resources and names, or by resources and label selector
Deploy Commands:
rollout Manage the rollout of a resource
scale Set a new size for a deployment, replica set, or replication controller
autoscale Auto-scale a deployment, replica set, stateful set, or replication controller
Cluster Management Commands:
certificate Modify certificate resources
cluster-info Display cluster information
top Display resource (CPU/memory) usage
cordon Mark node as unschedulable
uncordon Mark node as schedulable
drain Drain node in preparation for maintenance
taint Update the taints on one or more nodes
Troubleshooting and Debugging Commands:
describe Show details of a specific resource or group of resources
logs Print the logs for a container in a pod
attach Attach to a running container
exec Execute a command in a container
port-forward Forward one or more local ports to a pod
proxy Run a proxy to the Kubernetes API server
cp Copy files and directories to and from containers
auth Inspect authorization
debug Create debugging sessions for troubleshooting workloads and nodes
events List events
Advanced Commands:
diff Diff the live version against a would-be applied version
apply Apply a configuration to a resource by file name or stdin
patch Update fields of a resource
replace Replace a resource by file name or stdin
wait Experimental: Wait for a specific condition on one or many resources
kustomize Build a kustomization target from a directory or URL
Settings Commands:
label Update the labels on a resource
annotate Update the annotations on a resource
completion Output shell completion code for the specified shell (bash, zsh, fish, or powershell)
Other Commands:
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config Modify kubeconfig files
plugin Provides utilities for interacting with plugins
version Print the client and server version information
Usage:
kubectl [flags] [options]
Use "kubectl &lt;command&gt; --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_cheat_sheet_2">Cheat sheet</h4>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" class="bare">https://kubernetes.io/docs/reference/kubectl/cheatsheet/</a></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_kubeconfig">kubeconfig</h3>
<div class="sect3">
<h4 id="_opis_5">Opis</h4>
<div class="paragraph">
<p><code>kubeconfig</code> to plik konfiguracyjny używany przez narzędzie <code>kubectl</code>
do skonfigurowania dostępu do klastra Kubernetes. Ten plik zawiera
informacje takie jak adres serwera API klastra, dane uwierzytelniające
użytkownika, konteksty, ustawienia klastra czy konfiguracje proxy. <code>kubeconfig</code>
umożliwia użytkownikowi definiowanie różnych konfiguracji dla różnych
klastrów lub kontekstów, co pozwala na łatwe przełączanie między różnymi
środowiskami Kubernetes.</p>
</div>
</div>
<div class="sect3">
<h4 id="_zarządzanie_przez_kubectl">Zarządzanie przez kubectl</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">Modify kubeconfig files using subcommands like "kubectl config set current-context my-context".
The loading order follows these rules:
1. If the --kubeconfig flag is set, then only that file is loaded. The flag may only be set once and no merging takes
place.
2. If $KUBECONFIG environment variable is set, then it is used as a list of paths (normal path delimiting rules for
your system). These paths are merged. When a value is modified, it is modified in the file that defines the stanza. When
a value is created, it is created in the first file that exists. If no files in the chain exist, then it creates the
last file in the list.
3. Otherwise, ${HOME}/.kube/config is used and no merging takes place.
Available Commands:
current-context Display the current-context
delete-cluster Delete the specified cluster from the kubeconfig
delete-context Delete the specified context from the kubeconfig
delete-user Delete the specified user from the kubeconfig
get-clusters Display clusters defined in the kubeconfig
get-contexts Describe one or many contexts
get-users Display users defined in the kubeconfig
rename-context Rename a context from the kubeconfig file
set Set an individual value in a kubeconfig file
set-cluster Set a cluster entry in kubeconfig
set-context Set a context entry in kubeconfig
set-credentials Set a user entry in kubeconfig
unset Unset an individual value in a kubeconfig file
use-context Set the current-context in a kubeconfig file
view Display merged kubeconfig settings or a specified kubeconfig file
Usage:
kubectl config SUBCOMMAND [options]</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_przykładowy_plik_kubeconfig">Przykładowy plik kubeconfig</h4>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: test
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: test
namespace: default
user: experimenter
name: exp-test
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
# Documentation note (this comment is NOT part of the command output).
# Storing passwords in Kubernetes client config is risky.
# A better alternative would be to use a credential plugin
# and store the credentials separately.
# See https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
password: some-password
username: exp</code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_podstawowe_obiekty">Podstawowe obiekty</h3>
<div class="paragraph">
<p>Obiekty w Kubernetes są abstrakcyjnymi reprezentacjami różnych
elementów klastra, definiującymi jego stan i funkcjonalności. To
kluczowy koncept w modelu deklaratywnego zarządzania zasobami, gdzie
użytkownik opisuje zamierzony stan klastra za pomocą plików
konfiguracyjnych YAML, a kontrolery Kubernetes są odpowiedzialne za
utrzymanie zgodności rzeczywistego stanu z deklaratywnie zdefiniowanym.</p>
</div>
<div class="paragraph">
<p>Podstawowe obiekty to m.in. pody, które reprezentują jednostki
uruchomieniowe, usługi, które definiują stałe punkty końcowe, i
wdrożenia, które pozwalają na zarządzanie replikacją i aktualizacją
podów. Dodatkowe obiekty obejmują konfiguracje, tajemnice, przestrzenie
nazw i konta usług, które wspierają różne aspekty aplikacji i
zarządzania zasobami w klastrze.</p>
</div>
<div class="sect3">
<h4 id="_namespace">Namespace</h4>
<div class="sect4">
<h5 id="_opis_6">Opis</h5>
<div class="paragraph">
<p>W Kubernetes, przestrzenie nazw (Namespaces) to mechanizm, który
umożliwia podział klastra na logiczne grupy zasobów. Przestrzenie nazw
pozwalają na izolację i segmentację zasobów, co jest szczególnie
przydatne w środowiskach, gdzie istnieje wiele aplikacji lub zespołów
pracujących w jednym klastrze. Każda przestrzeń nazw posiada swoje
unikalne zasoby, takie jak pody, usługi czy konfiguracje, co pozwala na
organizację klastra w bardziej przejrzysty sposób. Przestrzenie nazw są
używane do unikania konfliktów w nazwach oraz wspierają efektywne
zarządzanie i skalowanie klastrów Kubernetes.</p>
</div>
</div>
<div class="sect4">
<h5 id="_domyślne_namespace">Domyślne namespace</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>default:</strong> Główna przestrzeń nazw, do której zasoby są
dodawane, jeśli nie zostanie podana żadna inna przestrzeń nazw podczas
tworzenia obiektów.</p>
</li>
<li>
<p><strong>kube-system:</strong> Przestrzeń nazw zawierająca zasoby systemowe i komponenty samego klastra Kubernetes, takie jak <code>kube-dns</code>, <code>kube-proxy</code> czy <code>coredns</code>.</p>
</li>
<li>
<p><strong>kube-public:</strong> Przestrzeń nazw dostępna do odczytu
przez wszystkich użytkowników (read-only) i zawierająca zasoby, które
mają być dostępne publicznie w klastrze.</p>
</li>
<li>
<p><strong>kube-node-lease:</strong> Przestrzeń nazw zawierająca obiekty Lease, które służą do monitorowania i zarządzania stanem węzłów w klastrze.</p>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create namespace NAMESPACE_NAME</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Namespace
metadata:
name: NAMESPACE_NAME</code></pre>
</div>
</div>
<div class="paragraph">
<p>Zapisz ten plik, na przykład jako <code>my-namespace.yaml</code>, a następnie zastosuj definicję za pomocą narzędzia <code>kubectl</code> poniższą komendą:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl apply -f my-namespace.yaml</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_listowanie_przestrzeni_nazw">Listowanie przestrzeni nazw</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl get namespaces</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_pobieranie_obiektów_z_namespace">Pobieranie obiektów z namespace</h5>
<div class="paragraph">
<p>Aby pobrać obiekt z określonej przestrzeni nazw w Kubernetes, użyj poniższej komendy <code>kubectl</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl get OBJECT_TYPE -n NAMESPACE_NAME OBJECT_NAME</code></pre>
</div>
</div>
<div class="paragraph">
<p>Gdzie:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>OBJECT_TYPE</code> to rodzaj obiektu, np. <code>pods</code>, <code>services</code>, <code>deployments</code>, itp.</p>
</li>
<li>
<p><code>NAMESPACE_NAME</code> to nazwa przestrzeni nazw, z której chcesz pobrać obiekt.</p>
</li>
<li>
<p><code>OBJECT_NAME</code> to nazwa konkretnego obiektu w danej przestrzeni nazw.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Domyślnie, jeśli nie zostanie podana przestrzeń nazw, <code>kubectl</code>
korzysta z przestrzeni nazw "default". Przykładowo, aby pobrać
informacje o podzie o nazwie "moj-pod" z przestrzeni nazw "default",
użyj:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl get pods moj-pod</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#namespace-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#namespace-v1-core</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_pod">Pod</h4>
<div class="sect4">
<h5 id="_opis_7">Opis</h5>
<div class="paragraph">
<p>Pody w Kubernetes (K8s) są najmniejszymi jednostkami uruchomieniowymi
w klastrze. Reprezentują abstrakcję pojedynczego egzemplarza
działającego kontenera lub grupy kontenerów, współdzielących przestrzeń
sieciową i pamięci na jednym węźle klastra. Pody są tworzone, zarządzane
i monitorowane przez Kubelet (agenta na węźle klastra), a każdy pod
może zawierać jedną lub więcej aplikacji, które dzielą te same zasoby i
mają dostęp do wspólnego środowiska. Pody mogą być dynamicznie
skalowalne, a zarządzanie nimi obejmuje zarówno utrzymanie ich liczby,
jak i rozdział ruchu sieciowego oraz równoważenie obciążenia.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_2">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl run moj-pod --image=nginx</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_2">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Pod
metadata:
name: moj-pod
spec:
containers:
- name: kontener-nginx
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: MOJA_ZMIENNA
value: "wartosc"
ports:
- containerPort: 80
protocol: TCP</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_2">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#pod-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#pod-v1-core</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_deployment">Deployment</h4>
<div class="sect4">
<h5 id="_opis_8">Opis</h5>
<div class="paragraph">
<p>Deployment w Kubernetes to obiekt, który definiuje i zarządza cyklem
życia replik aplikacji w klastrze. Jest to zalecane narzędzie do
wdrażania aplikacji, które oferuje deklaratywny sposób zarządzania
replikami podów. Deployment umożliwia automatyczne skalowanie,
aktualizacje wersji aplikacji, a także zapewnia równoważenie obciążenia i
automatyczną obsługę awarii, co przyczynia się do nieprzerwanego
dostarczania aplikacji w kontenerach. Przy użyciu Deployment, można
zdefiniować i kontrolować stan aplikacji, a Kubernetes zadba o jego
utrzymanie.</p>
</div>
</div>
<div class="sect4">
<h5 id="_strategie_uaktualnienia">Strategie uaktualnienia</h5>
<div class="ulist">
<ul>
<li>
<p>RollingUpdate:</p>
<div class="ulist">
<ul>
<li>
<p>Jest to strategia domyślna.</p>
</li>
<li>
<p>Nowe pody są wdrażane stopniowo, jeden po drugim, minimalizując wpływ aktualizacji na dostępność aplikacji.</p>
</li>
<li>
<p>Kontrolowane jest, ile maksymalnie nowych podów może być wdrożonych jednocześnie (określane przez parametr <code>maxSurge</code>).</p>
</li>
<li>
<p>Jednocześnie kontrolowane jest, ile minimalnie starych podów musi być
utrzymanych w trakcie aktualizacji (określane przez parametr <code>maxUnavailable</code>).</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre>strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%</pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Recreate:</p>
<div class="ulist">
<ul>
<li>
<p>Wszystkie stare pody są zatrzymywane jednocześnie, a następnie wdrażane są nowe pody.</p>
</li>
<li>
<p>W tym przypadku, przez krótki okres, aplikacja może być niedostępna.</p>
</li>
<li>
<p>Ta strategia jest prostsza, ale może być mniej zalecana w przypadku aplikacji wymagających ciągłej dostępności.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre>strategy:
type: Recreate</pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_3">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create deployment moj-deployment --image=nginx</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_3">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: apps/v1
kind: Deployment
metadata:
name: moj-deployment
spec:
replicas: 3
selector:
matchLabels:
app: moja-aplikacja
template:
metadata:
labels:
app: moja-aplikacja
spec:
containers:
- name: kontener-nginx
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: MOJA_ZMIENNA
value: "wartosc"
ports:
- containerPort: 80
protocol: TCP
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_3">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#deployment-v1-apps" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#deployment-v1-apps</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_replicaset">ReplicaSet</h4>
<div class="sect4">
<h5 id="_opis_9">Opis</h5>
<div class="paragraph">
<p>ReplicaSet w Kubernetes to obiekt, który definiuje żądaną liczbę
replik (kopii) podów działających w klastrze. Jego głównym celem jest
utrzymanie stałej liczby replik, co umożliwia skalowanie aplikacji.
ReplicaSet monitoruje stany podów i automatycznie utrzymuje zdefiniowaną
liczbę replik, wznawiając lub tworząc nowe podczas awarii lub innych
zmian w klastrze. Jest używany wraz z Deploymentem, który dostarcza
bardziej zaawansowanego zarządzania cyklem życia replik i wersjami
aplikacji.</p>
</div>
</div>
<div class="sect4">
<h5 id="_api_4">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#replicaset-v1-apps" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#replicaset-v1-apps</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_daemonset">DaemonSet</h4>
<div class="sect4">
<h5 id="_opis_10">Opis</h5>
<div class="paragraph">
<p>DaemonSet w Kubernetes to obiekt, który zapewnia uruchomienie jednej
repliki poda na każdym węźle klastra. Jego głównym zadaniem jest
utrzymanie identycznej kopii poda na wszystkich węzłach, co czyni go
idealnym dla zadań, które muszą być uruchomione na każdym węźle, takich
jak monitorowanie, zbieranie logów czy dostarczanie specyficznych usług.
DaemonSet automatycznie tworzy i usuwa repliki w zależności od zmian w
klastrze, umożliwiając skalowalne i jednolite wdrożenie na wszystkich
węzłach. Jest często używany do instalacji oprogramowania
infrastrukturalnego na każdym węźle, na przykład agentów monitoringu czy
proxy.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_4">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create daemonset moj-daemonset --image=nginx</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_4">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: apps/v1
kind: DaemonSet
metadata:
name: moj-daemonset
spec:
selector:
matchLabels:
app: moja-aplikacja
template:
metadata:
labels:
app: moja-aplikacja
spec:
containers:
- name: kontener-nginx
image: nginx</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_5">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#daemonset-v1-apps" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#daemonset-v1-apps</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_statefulsets">StatefulSets</h4>
<div class="sect4">
<h5 id="_opis_11">Opis</h5>
<div class="paragraph">
<p>StatefulSets w Kubernetes to obiekty używane do wdrażania i
zarządzania aplikacjami, które wymagają trwałych, unikalnych
identyfikatorów i stabilnych adresów sieciowych, takich jak bazy danych.
Są one szczególnie przydatne dla aplikacji, które przechowują dane
stanowe, ponieważ gwarantują, że instancje StatefulSet mają stabilne
nazwy oraz indeksy, co ułatwia identyfikację i dostęp do nich.
StatefulSets automatycznie zarządzają cyklem życia podów, zapewniając
unikalne nazwy hostów, które pozostają niezmienne nawet po ponownym
uruchomieniu. Są idealne do zastosowań, gdzie ważna jest kolejność
uruchamiania, takich jak klastry baz danych z replikacją.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_5">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: moj-statefulset
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: kontener-nginx
image: nginx</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_6">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#statefulset-v1-apps" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#statefulset-v1-apps</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_job">Job</h4>
<div class="sect4">
<h5 id="_opis_12">Opis</h5>
<div class="paragraph">
<p>W Kubernetes, Job to kontroler, który zarządza zadaniami
wykonywalnymi jednorazowo w klastrze. Job zapewnia, że zadanie jest
zakończone poprawnie przed zamknięciem. Jeśli zadanie kończy się błędem,
Job może zrestartować go, aż osiągnie sukces. Jest to przydatne do
zadań, które muszą być wykonane dokładnie raz, takich jak przetwarzanie
danych czy obliczenia wsadowe. Job w K8s umożliwia definiowanie
parametrów takich jak liczba replik zadania, strategia restartowania
oraz obsługa błędów, co pozwala na skuteczne zarządzanie wykonywaniem
zadań w klastrze.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_5">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create job moje-zadanie --image=obraz-kontenera --restart=OnFailure -- command --argument1=value1 --argument2=value2</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_6">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: batch/v1
kind: Job
metadata:
name: moje-zadanie
spec:
template:
metadata:
labels:
app: moja-aplikacja
spec:
restartPolicy: OnFailure
containers:
- name: moj-kontener
image: obraz-kontenera
command: ["sh", "-c", "echo Hello Kubernetes! &amp;&amp; sleep 3600"]
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
backoffLimit: 2</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_7">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#job-v1-batch" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#job-v1-batch</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_cronjob">CronJob</h4>
<div class="sect4">
<h5 id="_opis_13">Opis</h5>
<div class="paragraph">
<p>CronJob w Kubernetes to kontroler, który umożliwia planowanie i
regularne wykonywanie zadań na podstawie składni czasu znanego z systemu
Unixowego crona. Może być używany do automatyzacji powtarzających się
operacji, takich jak wykonywanie kopii zapasowych, aktualizacje danych,
czy czyszczenie zasobów. Definiuje się go za pomocą manifestu YAML,
gdzie określa się harmonogram, obraz kontenera oraz inne parametry,
takie jak limity czasowe czy strategię restartowania. CronJob w K8s
zapewnia elastyczne rozwiązanie dla pracy w tle, automatyzując cykliczne
czynności w klastrze.</p>
</div>
</div>
<div class="sect4">
<h5 id="_cron_schedule_syntax">Cron schedule syntax</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code># ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │ OR sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │
# * * * * *</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_6">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create cronjob moj-cronjob --image=obraz-kontenera --schedule="*/5 * * * *" --restart=OnFailure -- command --argument1=value1 --argument2=value2</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_7">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_8">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#cronjob-v1-batch" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#cronjob-v1-batch</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_service">Service</h4>
<div class="sect4">
<h5 id="_opis_14">Opis</h5>
<div class="paragraph">
<p>W Kubernetes usługa (Service) to abstrakcja, która definiuje stały
punkt dostępowy do jednego lub wielu podów w klastrze. Usługi pozwalają
na komunikację między różnymi komponentami aplikacji, niezależnie od ich
położenia czy dynamicznie przypisywanych adresów IP. Usługi Kubernetes
obsługują równoważenie obciążenia, umożliwiając skalowanie aplikacji,
oraz oferują mechanizmy odkrywania usług, dzięki czemu inne komponenty
mogą dynamicznie odnajdywać usługi w klastrze.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_imperatywny_7">Przykład imperatywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create service clusterip moja-usluga --tcp=80:8080</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_8">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: moja-usluga
spec:
selector:
app: moja-aplikacja
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_9">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#service-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#service-v1-core</a></p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_labels_and_selectors">Labels and Selectors</h3>
<div class="sect3">
<h4 id="_opis_15">Opis</h4>
<div class="paragraph">
<p>Etykiety (labels) w Kubernetes to kluczowe elementy metadanych, które
umożliwiają dodanie do obiektów informacji identyfikacyjnych i
organizacyjnych. Są to pary klucz-wartość przypisane do zasobów
Kubernetes, które pozwalają na ich jednoznaczne oznaczenie oraz
kategoryzację. Etykiety są używane do różnych celów, takich jak
identyfikacja, grupowanie, selekcja i organizacja zasobów w klastrze.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">metadata:
labels:
app: frontend
environment: production</code></pre>
</div>
</div>
<div class="paragraph">
<p>Selektory w Kubernetes to mechanizm używany do identyfikowania i
wybierania zasobów (takich jak pod, serwis, itp.) na podstawie ich
etykiet. Selektory pozwalają na definiowanie kryteriów, które muszą być
spełnione przez etykiety zasobów, aby zostały wybrane.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">spec:
selector:
app: frontend
environment: production</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_well_known_labels">Well-Known Labels</h4>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/" class="bare">https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/</a></p>
</div>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/labels-annotations-taints/" class="bare">https://kubernetes.io/docs/reference/labels-annotations-taints/</a></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_annotation">Annotation</h3>
<div class="sect3">
<h4 id="_opis_16">Opis</h4>
<div class="paragraph">
<p>W Kubernetes, annotations (adnotacje) to metadane, czyli
klucz-wartość, które można przypisać do obiektów w klastrze, takich jak
pod, usługa, czy przestrzeń nazw. Adnotacje nie mają bezpośredniego
wpływu na działanie samego obiektu, ale mogą być używane do
przechowywania dodatkowych informacji, opisów czy konfiguracji.</p>
</div>
<div class="paragraph">
<p>Adnotacje są elastycznym mechanizmem, który pozwala użytkownikom na
dostosowanie obiektów według własnych potrzeb, bez ingerencji w ich
podstawowe atrybuty. Przykłady użycia adnotacji to dodawanie informacji
auditowych, zarządzanie konfiguracją, czy dostarczanie dodatkowych
danych do zautomatyzowanego systemu zarządzania klastrami. Adnotacje
można odczytywać i modyfikować zarówno za pomocą narzędzia <code>kubectl</code>, jak i interfejsu API Kubernetesa.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">metadata:
annotations:
example.com/description: "To jest mój przykładowy pod."
team: "operations"</code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_uwierzytelnianie">Uwierzytelnianie</h3>
<div class="sect3">
<h4 id="_serviceaccount">ServiceAccount</h4>
<div class="sect4">
<h5 id="_opis_17">Opis</h5>
<div class="paragraph">
<p>ServiceAccount w Kubernetes to zasób, który dostarcza jednoznaczną
identyfikację dla podów w klastrze. Każdy ServiceAccount ma przypisany
unikalny token uwierzytelniający, umożliwiający podom dostęp do API
serwera Kubernetes i innych zasobów klastra. ServiceAccounty są
powiązane z rolami i uprawnieniami, co umożliwia precyzyjne zarządzanie
dostępem podów do różnych zasobów. Stanowią ważny element zarządzania
bezpieczeństwem i kontroli dostępu w środowisku Kubernetes.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_9">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: ServiceAccount
metadata:
name: moj-service-account
namespace: moj-namespace</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_wyciągnięcie_tokena">Wyciągnięcie tokena</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">kubectl create token moj-service-account -n moj-namespace</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_roleclusterrole">Role/ClusterRole</h4>
<div class="sect4">
<h5 id="_opis_18">Opis</h5>
<div class="paragraph">
<p>Role/ClusterRole to zasób, który definiuje zestaw uprawnień dla
operacji na zasobach w klastrze. Każda rola jest przypisana do
konkretnego namespace, a jej zastosowanie ogranicza się do jednego
obszaru klastra. Role są wykorzystywane do precyzyjnego zarządzania
dostępem do zasobów, takich jak pod, usługi czy konfiguracje. Rola
klastrowa za to nie ma przypisanego namespace.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_10">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# "namespace" omitted since ClusterRoles are not namespaced
name: secret-reader
rules:
- apiGroups: [""]
#
# at the HTTP level, the name of the resource for accessing Secret
# objects is "secrets"
resources: ["secrets"]
verbs: ["get", "watch", "list"]</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_rolebindingclusterrolebinding">RoleBinding/ClusterRoleBinding</h4>
<div class="sect4">
<h5 id="_opis_19">Opis</h5>
<div class="paragraph">
<p>W Kubernetes, RoleBinding/ClusterRoleBinding to zasób, który
ustanawia powiązanie między konkretnym użytkownikiem, grupą użytkowników
lub serwisem a rolą w określonym namespace (lub bez namespace dla
ClusterRoleBinding). RoleBinding/ClusterRoleBinding definiuje, jakie
uprawnienia są przyznane danemu podmiotowi w kontekście danego obszaru
klastra.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_11">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: rbac.authorization.k8s.io/v1
# This role binding allows "dave" to read secrets in the "development" namespace.
# You need to already have a ClusterRole named "secret-reader".
kind: RoleBinding
metadata:
name: read-secrets
#
# The namespace of the RoleBinding determines where the permissions are granted.
# This only grants permissions within the "development" namespace.
namespace: development
subjects:
- kind: User
name: dave # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
name: read-secrets-global
subjects:
- kind: Group
name: manager # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_sieć">Sieć</h3>
<div class="sect3">
<h4 id="_sterowniki_cni">Sterowniki CNI</h4>
<div class="paragraph">
<p>Sterowniki CNI (Container Network Interface) w Kubernetes (K8s) są to
elementy oprogramowania, które zarządzają konfiguracją i działaniem
sieci pomiędzy kontenerami w klastrze. Służą one do ustanawiania,
konfigurowania i utrzymania połączeń sieciowych pomiędzy różnymi
jednostkami obliczeniowymi w klastrze Kubernetes.</p>
</div>
<div class="paragraph">
<p>Sterowniki CNI pełnią kluczową rolę w umożliwianiu komunikacji między
kontenerami, zarządzaniu adresacją IP, a także wdrożeniu polityk
bezpieczeństwa sieciowego. Wspierają różne technologie sieciowe, takie
jak przełączniki programowalne, routery i protokoły komunikacyjne.</p>
</div>
<div class="paragraph">
<p>Ich głównym zadaniem jest zapewnienie spójności sieciowej oraz
umożliwienie elastycznego dostosowywania konfiguracji sieciowej w miarę
potrzeb. Sterowniki CNI umożliwiają integrację różnych rozwiązań
sieciowych, co pozwala na dostosowanie infrastruktury sieciowej klastra
do konkretnych wymagań aplikacji i środowiska.</p>
</div>
<div class="paragraph">
<p>Każdy kontener w klastrze K8s posiada swoje unikalne interfejsy
sieciowe, a sterowniki CNI zapewniają, że te interfejsy są
skonfigurowane zgodnie z zasadami i wymaganiami określonymi dla danego
klastra. Ostatecznie, sterowniki CNI ułatwiają elastyczne i skalowalne
zarządzanie siecią w środowisku Kubernetes.</p>
</div>
</div>
<div class="sect3">
<h4 id="_przykłady_sterowników_cni_w_kubernetes">Przykłady Sterowników CNI w Kubernetes</h4>
<div class="sect4">
<h5 id="_flannel">Flannel</h5>
<div class="paragraph">
<p>Flannel to prosty i lekki sterownik CNI, który dostarcza warstwę
abstrakcji dla sieci kontenerowej. Umożliwia konfigurację podsieci dla
kontenerów.</p>
</div>
</div>
<div class="sect4">
<h5 id="_calico">Calico</h5>
<div class="paragraph">
<p>Calico to otwarte oprogramowanie, które implementuje sieć opartą na
protokole BGP (Border Gateway Protocol). Zapewnia zaawansowane funkcje
bezpieczeństwa, takie jak polityki sieciowe.</p>
</div>
</div>
<div class="sect4">
<h5 id="_weave">Weave</h5>
<div class="paragraph">
<p>Weave to elastyczny sterownik CNI, który automatycznie tworzy sieć
między kontenerami w klastrze. Posiada wbudowaną funkcjonalność routingu
i wsparcie dla wielu chmur.</p>
</div>
</div>
<div class="sect4">
<h5 id="_cilium">Cilium</h5>
<div class="paragraph">
<p>Cilium to sterownik, który łączy funkcje sieciowe z bezpieczeństwem.
Oferuje zaawansowane funkcje takie jak ochrona przed atakami, detekcja
intruzów i kontrola dostępu.</p>
</div>
</div>
<div class="sect4">
<h5 id="_kube_router">Kube-router</h5>
<div class="paragraph">
<p>Kube-router to lekki sterownik CNI zaimplementowany w Go, który oferuje obsługę wielu protokołów sieciowych, w tym BGP.</p>
</div>
</div>
<div class="sect4">
<h5 id="_antrea">Antrea</h5>
<div class="paragraph">
<p>Antrea to sterownik CNI rozwijany przez projekt CNCF (Cloud Native
Computing Foundation), który dostarcza funkcje zarówno w zakresie sieci,
jak i bezpieczeństwa dla klastrów Kubernetes.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_rodzaje_service">Rodzaje Service</h4>
<div class="sect4">
<h5 id="_clusterip">ClusterIP</h5>
<div class="paragraph">
<p>ClusterIP to domyślny rodzaj usługi w Kubernetes. Przypisuje stały
adres IP wewnętrzny do usługi, który jest dostępny tylko w obrębie
klastra. Jest to użyteczne, gdy komponenty aplikacji w klastrze muszą
komunikować się między sobą.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_nodeport">NodePort</h5>
<div class="paragraph">
<p>NodePort przypisuje stały port na każdym węźle w klastrze i
przekierowuje ruch z tego portu do usługi. Pozwala to na dostęp do
usługi z zewnątrz klastra.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: NodePort</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_loadbalancer">LoadBalancer</h5>
<div class="paragraph">
<p>LoadBalancer automatycznie przydzielana jest zewnętrznemu
równoważnikowi obciążenia, który przekierowuje ruch do serwisu. Jest to
przydatne, gdy potrzebujesz publicznego dostępu do usługi.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_externalname">ExternalName</h5>
<div class="paragraph">
<p>ExternalName to rodzaj usługi, który działa jako alias dla
zewnętrznego usługodawcy. Pozwala na dostęp do zewnętrznego serwisu
przez DNS.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: my.database.example.com</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_ingress">Ingress</h4>
<div class="sect4">
<h5 id="_opis_20">Opis</h5>
<div class="paragraph">
<p>Ingress w Kubernetes to mechanizm umożliwiający zarządzanie dostępem
zewnętrznym do usług w klastrze. Działa jako kontroler obsługujący
żądania HTTP i HTTPS, umożliwiając konfigurację reguł routingu na
podstawie ścieżek URL, hostów i innych atrybutów zapytania. Ingress
obsługuje również terminację TLS/SSL, umożliwiając dekodowanie
zaszyfrowanych żądań HTTPS. Pozwala na elastyczne definiowanie reguł
przekierowywania ruchu do różnych usług w klastrze.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_12">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /app
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls-secret</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_10">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#ingress-v1-networking-k8s-io" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#ingress-v1-networking-k8s-io</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_ingress_controller">Ingress Controller</h4>
<div class="sect4">
<h5 id="_opis_21">Opis</h5>
<div class="paragraph">
<p>Ingress Controller w Kubernetes to komponent odpowiedzialny za
implementację i obsługę zasobów Ingress. Jest to oprogramowanie lub
moduł, który działa jako proxy HTTP/HTTPS, przetwarzając ruch zewnętrzny
i kierując go do odpowiednich usług w klastrze na podstawie
zdefiniowanych reguł Ingress. Ingress Controller może obsługiwać różne
aspekty, takie jak zarządzanie ścieżkami URL, routingiem na podstawie
hostów DNS oraz terminacją TLS/SSL. Istnieje wiele dostępnych Ingress
Controllerów, a ich wybór zależy od konkretnych wymagań i preferencji
konfiguracyjnych klastra.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_przykłady_ingress_controllerów">Przykłady Ingress Controllerów</h4>
<div class="sect4">
<h5 id="_nginx_ingress_controller">Nginx Ingress Controller</h5>
<div class="paragraph">
<p>Nginx Ingress Controller to popularny kontroler Ingress oparty na
serwerze proxy Nginx. Zapewnia zaawansowane funkcje routingu i obsługi
TLS.</p>
</div>
</div>
<div class="sect4">
<h5 id="_traefik_ingress_controller">Traefik Ingress Controller</h5>
<div class="paragraph">
<p>Traefik to dynamiczny kontroler Ingress, który automatycznie odkrywa
usługi w klastrze. Posiada intuicyjny interfejs konfiguracyjny i
obsługuje wiele backendów.</p>
</div>
</div>
<div class="sect4">
<h5 id="_haproxy_ingress_controller">HAProxy Ingress Controller</h5>
<div class="paragraph">
<p>HAProxy Ingress to kontroler Ingress, który wykorzystuje silnik
HAProxy do przekierowywania ruchu. Posiada zaawansowane funkcje i
obsługuje wiele trybów równoważenia obciążenia.</p>
</div>
</div>
<div class="sect4">
<h5 id="_contour_ingress_controller">Contour Ingress Controller</h5>
<div class="paragraph">
<p>Contour to kontroler Ingress rozwijany przez projekt Contour,
bazujący na Envoy Proxy. Posiada zaawansowane funkcje routingu i obsługi
TLS.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_networkpolicy">NetworkPolicy</h4>
<div class="sect4">
<h5 id="_opis_22">Opis</h5>
<div class="paragraph">
<p>NetworkPolicy w Kubernetes to zasób, który definiuje zasady
bezpieczeństwa dla ruchu sieciowego pomiędzy różnymi podami w klastrze.
Umożliwia precyzyjną kontrolę dostępu do usług i zasobów, definiując,
które pody mogą komunikować się ze sobą, a które nie. NetworkPolicy
pozwala na określenie reguł, takich jak blokowanie lub umożliwianie
ruchu na podstawie etykiet podów, portów, protokołów i innych atrybutów.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_13">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: my-network-policy
spec:
podSelector:
matchLabels:
role: backend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_11">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#networkpolicy-v1-networking-k8s-io" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#networkpolicy-v1-networking-k8s-io</a></p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_storage">Storage</h3>
<div class="sect3">
<h4 id="_configmap">ConfigMap</h4>
<div class="sect4">
<h5 id="_opis_23">Opis</h5>
<div class="paragraph">
<p>ConfigMap to to zasób służący do przechowywania konfiguracji
aplikacji. Jest to sposób na odseparowanie konfiguracji od kodu
aplikacji, umożliwiający elastyczne zarządzanie ustawieniami bez
konieczności modyfikowania kodu źródłowego. ConfigMap może być używany
do przekazywania informacji, takich jak zmienne środowiskowe, pliki
konfiguracyjne czy inne dane, do kontenerów uruchamianych w klastrze
Kubernetes. Aplikacje mogą dynamicznie odczytywać wartości z ConfigMap,
co ułatwia dostosowywanie konfiguracji bez konieczności ponownego
uruchamiania kontenerów.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_14">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# property-like keys; each key maps to a simple value
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# file-like keys
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_12">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#configmap-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#configmap-v1-core</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_secret">Secret</h4>
<div class="sect4">
<h5 id="_opis_24">Opis</h5>
<div class="paragraph">
<p>Secret to zasób służący do bezpiecznego przechowywania informacji
poufnych, takich jak hasła, klucze API czy certyfikaty. Sekrety są
używane do separacji i zarządzania wrażliwymi danymi w klastrze. Mogą
być wykorzystywane przez aplikacje jako zabezpieczony sposób
przechowywania danych uwierzytelniających lub innych poufnych
informacji, a dostęp do nich jest kontrolowany na poziomie klastra.
Sekrety mogą być używane w kontenerach jako zmienne środowiskowe lub
zamontowane jako systemy plików, umożliwiając aplikacjom dostęp do
poufnych danych bez konieczności trzymania ich w kodzie źródłowym.</p>
</div>
</div>
<div class="sect4">
<h5 id="_typy_sekretów">Typy sekretów</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Opaque (Nieustrukturyzowany)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: Opaque</code></p>
</li>
<li>
<p>Jest to domyślny typ Secret, który traktuje dane jako
nieustrukturyzowane bity. Oznacza to, że Secret może przechowywać
dowolne dane binarne.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubernetes.io/tls (TLS/SSL)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: kubernetes.io/tls</code></p>
</li>
<li>
<p>Służy do przechowywania certyfikatu SSL/TLS oraz odpowiadającego mu klucza prywatnego.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubernetes.io/dockerconfigjson (Docker Registry Credentials)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: kubernetes.io/dockerconfigjson</code></p>
</li>
<li>
<p>Wykorzystywany do przechowywania danych uwierzytelniających potrzebnych do dostępu do prywatnych repozytoriów Docker.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubernetes.io/basic-auth (Basic Authentication)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: kubernetes.io/basic-auth</code></p>
</li>
<li>
<p>Zawiera dane do uwierzytelniania Basic Auth, takie jak nazwa użytkownika i hasło.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>bootstrap.kubernetes.io/token (Bootstrap Token)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: bootstrap.kubernetes.io/token</code></p>
</li>
<li>
<p>Używany do dostarczania tokena, który jest używany podczas inicjalizacji klastra Kubernetes.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubernetes.io/service-account-token (Service Account Token)</strong></p>
<div class="ulist">
<ul>
<li>
<p><code>type: kubernetes.io/service-account-token</code></p>
</li>
<li>
<p>Automatycznie generowany Secret, który zawiera token dostępu dla konta usługi w klastrze.</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_15">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Secret
metadata:
name: moj-secret
type: Opaque
data:
haslo: cGFzc3dvcmQxMjM=</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Secret
metadata:
name: moj-tls-secret
type: kubernetes.io/tls
data:
tls.crt: BASE64_ENCODED_CERTIFICATE
tls.key: BASE64_ENCODED_PRIVATE_KEY</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_13">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#secret-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#secret-v1-core</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_emptydir">EmptyDir</h4>
<div class="sect4">
<h5 id="_opis_25">Opis</h5>
<div class="paragraph">
<p>EmptyDir w Kubernetes to rodzaj zasobu pamięci masowej, który jest
używany jako wolumin tymczasowy do współdzielenia danych między
kontenerami w ramach tego samego poda. EmptyDir jest tworzony, gdy pod
jest uruchamiany na węźle, a jego zawartość jest pusta. Podczas
działania poda, kontenery w tym podzie mogą zapisywać i odczytywać dane z
tego woluminu.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład">Przykład</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Pod
metadata:
name: moj-pod
spec:
containers:
- name: kontener-1
image: busybox
volumeMounts:
- name: moj-emptydir
mountPath: /data
- name: kontener-2
image: busybox
volumeMounts:
- name: moj-emptydir
mountPath: /data
volumes:
- name: moj-emptydir
emptyDir: {}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_hostpath">HostPath</h4>
<div class="sect4">
<h5 id="_opis_26">Opis</h5>
<div class="paragraph">
<p>hostPath w Kubernetes to typ woluminu, który umożliwia zamontowanie
ścieżki z hosta bezpośrednio do poda. Oznacza to, że dane dostępne na
węźle fizycznym mogą być udostępniane dla kontenerów wewnątrz poda.
Jednak korzystanie z hostPath może być ryzykowne, ponieważ narusza
izolację kontenerów i może prowadzić do problemów z bezpieczeństwem oraz
przenośnością aplikacji.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_2">Przykład</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Pod
metadata:
name: moj-pod
spec:
containers:
- name: kontener-1
image: busybox
volumeMounts:
- name: moj-hostpath
mountPath: /data
volumes:
- name: moj-hostpath
hostPath:
path: /ścieżka/na/węźle</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_csi">CSI</h4>
<div class="sect4">
<h5 id="_opis_27">Opis</h5>
<div class="paragraph">
<p>CSI, czyli Container Storage Interface, to standardowy interfejs dla
systemów zarządzania pamięcią masową w kontenerach w środowisku
Kubernetes. Działa jako most między klastrem Kubernetes a różnymi
rozwiązaniami do przechowywania danych, umożliwiając dynamiczne
przydzielanie i zwalnianie przestrzeni dyskowej dla kontenerów. CSI
pozwala na integrację różnorodnych rozwiązań do przechowywania danych,
co umożliwia elastyczne dostosowanie do potrzeb aplikacji w kontenerach.
Dzięki CSI wdrażanie i zarządzanie przechowywaniem danych w klastrze
Kubernetes staje się bardziej interoperacyjne i zgodne ze standardami.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykłady_sterowników">Przykłady sterowników</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>AWS EBS (Elastic Block Store)</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: Amazon EBS</p>
</li>
<li>
<p>Pozwala na dynamiczne przydzielanie woluminów EBS do kontenerów w klastrze Kubernetes.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Azure Disk</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: Microsoft Azure</p>
</li>
<li>
<p>Umożliwia dynamiczne przydzielanie dysków Azure dla kontenerów.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>GCE PD (Google Compute Engine Persistent Disk)</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: Google Cloud</p>
</li>
<li>
<p>Pozwala na dynamiczne przydzielanie persistentnych dysków dla kontenerów w klastrze Kubernetes.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Ceph</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: Ceph</p>
</li>
<li>
<p>Integruje Kubernetes z rozproszonym systemem plików Ceph, umożliwiając dynamiczne przydzielanie zasobów pamięci masowej.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>NFS (Network File System)</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: NFS</p>
</li>
<li>
<p>Umożliwia podłączanie woluminów NFS do kontenerów, co jest przydatne, gdy potrzebujesz współdzielonego dostępu do danych.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>vSphere</strong></p>
<div class="ulist">
<ul>
<li>
<p>Dostawca: VMware vSphere</p>
</li>
<li>
<p>Integruje Kubernetes z infrastrukturą wirtualizacyjną vSphere, umożliwiając dynamiczne zarządzanie woluminami.</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_storageclass">StorageClass</h4>
<div class="sect4">
<h5 id="_opis_28">Opis</h5>
<div class="paragraph">
<p>StorageClass to zasób definiujący dynamiczny sposób przydzielania
pamięci masowej dla aplikacji w klastrze. Określa typy pamięci masowej
dostępne dla klastra oraz parametry z nimi związane, takie jak dostawca i
konfiguracja. StorageClass umożliwia dynamiczne tworzenie woluminów na
żądanie, co eliminuje konieczność ręcznego zarządzania dostępnym
magazynem danych. Jest kluczowym elementem w ułatwianiu elastycznego i
efektywnego zarządzania przechowywaniem w klastrze Kubernetes.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="Kubernetes_1_pliki/storageclass.png" alt="storageclass">
</div>
<div class="title">Figure 3. <a href="https://blog.mayadata.io/kubernetes-storage-basics-pv-pvc-and-storageclass" class="bare">https://blog.mayadata.io/kubernetes-storage-basics-pv-pvc-and-storageclass</a></div>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_16">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_14">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#storageclass-v1-storage-k8s-io" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#storageclass-v1-storage-k8s-io</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_pv">PV</h4>
<div class="sect4">
<h5 id="_opis_29">Opis</h5>
<div class="paragraph">
<p>PV (Persistent Volume) w Kubernetes to abstrakcyjna reprezentacja
zasobu pamięci masowej w klastrze. PV reprezentuje fizyczne lub
wirtualne zasoby pamięci masowej, takie jak dyski, partycje dyskowe, czy
woluminy sieciowe, które mogą być udostępniane dla aplikacji
działających w klastrze. PV umożliwia odseparowanie dostępu do pamięci
masowej od aplikacji, co pozwala na elastyczne zarządzanie
przechowywaniem danych w klastrze.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_17">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
nfs:
path: /my/nfs/path
server: nfs-server.example.com</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_15">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#persistentvolume-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#persistentvolume-v1-core</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_pvc">PVC</h4>
<div class="sect4">
<h5 id="_opis_30">Opis</h5>
<div class="paragraph">
<p>PVC (Persistent Volume Claim) w Kubernetes to abstrakcyjny sposób,
który pozwala aplikacjom wnioskować o dostęp do pamięci masowej w
klastrze. PVC jest zasobem, który pozwala programom na żądanie
określonej ilości pamięci masowej o określonych cechach, takich jak
pojemność, tryb dostępu czy klasa pamięci masowej.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_deklaratywny_18">Przykład deklaratywny</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 1Gi</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_api_16">API</h5>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#persistentvolumeclaim-v1-core" class="bare">https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#persistentvolumeclaim-v1-core</a></p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_dodatkowe_funkcjonalności">Dodatkowe funkcjonalności</h3>
<div class="sect3">
<h4 id="_nodeselector">NodeSelector</h4>
<div class="sect4">
<h5 id="_opis_31">Opis</h5>
<div class="paragraph">
<p>nodeSelector w Kubernetes to funkcja, która umożliwia ograniczenie,
na których węzłach klastra powinny być uruchamiane konkretne pody.
Działa to poprzez dostarczenie specyficznych etykiet (labels) węzłom, a
następnie określenie tych etykiet w definicji poda przy użyciu
nodeSelector.</p>
</div>
<div class="paragraph">
<p>Podczas tworzenia poda, nodeSelector jest używane do wskazania
etykiet węzła, na którym chcesz uruchomić dany pod. Jeśli etykieta na
węźle odpowiada etykiecie w nodeSelector, pod może być uruchomiony na
tym węźle. Jeśli nie ma dopasowania, pod nie zostanie uruchomiony na tym
węźle.</p>
</div>
</div>
<div class="sect4">
<h5 id="_przykład_3">Przykład</h5>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">apiVersion: v1
kind: Pod
metadata:
name: moj-pod
spec:
containers:
- name: moj-kontener
image: nginx
nodeSelector:
disktype: ssd</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_maintenance">Maintenance</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>kubectl get events</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl get events</code> umożliwia przeglądanie
zdarzeń w klastrze, co jest przydatne do diagnostyki problemów i
monitorowania różnych operacji w klastrze.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubectl logs</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl logs</code> pozwala na przeglądanie logów kontenerów wewnątrz poda, co jest użyteczne do debugowania i analizy błędów w aplikacjach.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubectl top</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl top</code> dostarcza informacje na temat
zasobów zużywanych przez pody w klastrze, takie jak CPU i pamięć. Pomaga
to w monitorowaniu wydajności klastra.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubectl drain</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl drain</code> jest używane do przygotowania węzła do wyłączenia, przenosząc pody z tego węzła na inne węzły w klastrze.</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubectl cordon</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl uncordon</code> wyłącza dostępność węzła</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>kubectl uncordon</strong></p>
<div class="ulist">
<ul>
<li>
<p>Polecenie <code>kubectl uncordon</code> przywraca dostępność węzła</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
<div style="page-break-after: always;"></div>
</div>
</div>
<div class="sect2">
<h3 id="_zadania_2">Zadania</h3>
<div class="sect3">
<h4 id="_zadanie_1_wejście_na_dashboard">Zadanie 1: Wejście na dashboard</h4>
<div class="sect4">
<h5 id="_wprowadzenie">Wprowadzenie</h5>
<div class="paragraph">
<p>Zarządzać i monitorować klaster można w bardzo różny sposób.
Providerzy cloudowi dostarczają często swoje narzędzia. Mamy również do
dyspozycji narzędzia konsolowe, dzisiaj jednak skupimy się na w miarę
prostym graficznym narzędziu, które pozwoli nam przeglądać zasoby
klastra. Zainstalujemy Kubernetes Dashboard za pomocą plików yaml.
Dokumentacja znajduje się tutaj: <a href="https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/" class="bare">https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/</a></p>
</div>
</div>
<div class="sect4">
<h5 id="_kroki">Kroki</h5>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Wygeneruj token, który będzie potrzebny do zalogowania <code>kubectl -n kubernetes-dashboard create token admin-user</code></p>
</li>
<li>
<p>Powinieneś otrzymać token na kształt tego poniżej. Zapisz go na boku, przyda się za chwilę</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Przykładowy token</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>eyJhbGciOiJSUzI1NiIsImtpZCI6IlZCYXdWMmJUZ3ozVEpKbHpIRVdFeHppOUV3T2llVDIxbmZ5UWpvOVQxT28ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjg1MTI0ODc5LCJpYXQiOjE2ODUxMjEyNzksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiZDU2MTJjZDktNjM5NS00ZWFhLTgxY2UtZGRkM2M0ODgzNDljIn19LCJuYmYiOjE2ODUxMjEyNzksInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.d2Kab8lyfTb08cJS5wjoW_OEzE66UJVHCcqgIghQ6lWLDOnO4MaudwskTNhMIpUorJaMwDy3ifH0OwTo2P6WZ3Y_oywdj8T-EFws22Ot7sFvvXK1C1B8wTJYQnx4SviaqhixKnLoy1nWTMmUbtn2O7NPXB40_RvCt3ehoYzrleNUb3Cdp5nUfYYWHoyExSblQYvBVK98tj7eozGOeVMuYjvSemJVCdEmjzAXdqr7uCanzspw7I6DQDJCfgG9Hl7D-UdxiK9ZaiZjPt8xMLmmFkJ0FFNO9HuEx26HQe_1Dwim-yEcpRUmBbccEFZHioPCLW2eXElQxRX0xGHHE4OQIg</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="8">
<li>
<p>Wejdź na <a href="https://dashboard.sx.codomi.dev/" class="bare">https://dashboard.sX.codomi.dev</a></p>
</li>
<li>
<p>Zaloguj się za pomocą wcześniej wygenerowanego tokena</p>
</li>
<li>
<p>Obejrzyj zasoby swojego klastra</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_2_utworzenie_namespace">Zadanie 2: Utworzenie namespace</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Utwórz imperatywnie namespace <code>szkolenie-imp</code></p>
</li>
<li>
<p>Utwórz deklaratywnie namespace <code>szkolenie-dek</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_3_usunięcie_namespace">Zadanie 3. Usunięcie namespace</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Usuń namespace <code>szkolenie-imp</code> i <code>szkolenie-dek</code> w odpowiadający im sposób</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_4_stworzenie_poda">Zadanie 4. Stworzenie poda</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Utwórz namespace <code>szkolenie</code></p>
</li>
<li>
<p>Utwórz imperatywnie poda z obrazu <code>nginx</code> o nazwie <code>nginx-imp</code> w powyższym namespace</p>
</li>
<li>
<p>Utwórz deklaratywnie poda z obrazu <code>nginx</code> o nazwie <code>nginx-dek</code> w powyższym namespace</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_5_sprawdzenie_poda">Zadanie 5. Sprawdzenie poda</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Wylistuj wszystkie pody w namespace <code>szkolenie</code></p>
</li>
<li>
<p>Za pomocą komendy <code>kubectl describe</code> sprawdź pody <code>nginx-imp</code> i <code>nginx-dek</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_6_usunięcie_poda">Zadanie 6. Usunięcie poda</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Usuń pody <code>nginx-imp</code> i <code>nginx-dek</code> w odpowiadający im sposób</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_7_stworzenie_deploymentu">Zadanie 7. Stworzenie deploymentu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Stwórz deployment z obrazu <code>nginx</code> o nazwie <code>nginx</code> w namespace <code>szkolenie</code></p>
</li>
<li>
<p>Zrób 3 repliki</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_8_sprawdzenie_deploymentu">Zadanie 8. Sprawdzenie deploymentu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Wylistuj wszystkie deploymenty w namespace <code>szkolenie</code></p>
</li>
<li>
<p>Wylistuj wszystkie pody w namespace <code>szkolenie</code></p>
</li>
<li>
<p>Za pomocą komendy <code>kubectl describe</code> sprawdź deployment <code>nginx</code></p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_9_usunięcie_deploymentu">Zadanie 9. Usunięcie deploymentu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Usuń któregoś z podów</p>
</li>
<li>
<p>Co się stało?</p>
</li>
<li>
<p>Usuń cały deployment</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_10_skalowanie_deploymentu">Zadanie 10. Skalowanie deploymentu</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Zeskaluj deployment do 2 replik</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_11_utworzenie_bazy_danych">Zadanie 11. Utworzenie bazy danych</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Na podstawie <a href="https://hub.docker.com/_/postgres" class="bare">https://hub.docker.com/_/postgres</a> utwórz Deployment z bazą danych</p>
</li>
<li>
<p>NIE twórz volumenu i sekretów</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_12_przerobienie_zmiennej_środowiskowej_z_hasłem_do_postgresa_na_secret">Zadanie 12. Przerobienie zmiennej środowiskowej z hasłem do Postgresa na Secret</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Dodaj sekret, w którym będzie zapisane hasło do bazy danych</p>
</li>
<li>
<p>Dodaj obsługę sekretu w Postgresie, żeby wartość zmiennej środowiskowej była z niego brana</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_13_wolumen_dla_bazy_danych">Zadanie 13. Wolumen dla bazy danych</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Dodaj PVC</p>
</li>
<li>
<p>Zmodyfikuj Deployment z bazą danych, żeby obsługiwał PVC</p>
</li>
<li>
<p>Zrób 2 repliki</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_zadanie_14_baza_danych_jako_statefulset">Zadanie 14. Baza danych jako StatefulSet</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Przerób bazę danych na StatefulSet</p>
</li>
</ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2024-02-26 14:00:03 UTC
</div>
</div>
</body></html>