4555 lines
No EOL
175 KiB
HTML
4555 lines
No EOL
175 KiB
HTML
<!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="kube_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>
|
||
<li><a href="#_zadanie_15_service">Zadanie 15. Service</a></li>
|
||
<li><a href="#_zadanie_16_tworzenie_service_typu_nodeport">Zadanie 16. Tworzenie service typu NodePort</a></li>
|
||
<li><a href="#_zadanie_17_tworzenie_ingress">Zadanie 17. Tworzenie Ingress</a></li>
|
||
<li><a href="#_zadanie_18_blokada_ruchu_za_pomocą_networkpolicy">Zadanie 18. Blokada ruchu za pomocą NetworkPolicy</a></li>
|
||
<li><a href="#_zadanie_19_instalacja_minikube">Zadanie 19. Instalacja minikube</a></li>
|
||
<li><a href="#_zadanie_20_użycie_configmap">Zadanie 20. Użycie ConfigMap</a></li>
|
||
<li><a href="#_zadanie_21_tworzenie_serviceaccount">Zadanie 21. Tworzenie ServiceAccount</a></li>
|
||
<li><a href="#_zadanie_22_tworzenie_roli_i_powiązania">Zadanie 22. Tworzenie roli i powiązania</a></li>
|
||
<li><a href="#_zadanie_23_tworzenie_hpa">Zadanie 23. Tworzenie HPA</a></li>
|
||
<li><a href="#_zadanie_24_użycie_helma">Zadanie 24. Użycie Helma</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="kube_pliki/vm.png" alt="vm">
|
||
</div>
|
||
</div>
|
||
<div class="imageblock">
|
||
<div class="content">
|
||
<img src="kube_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="kube_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|<id>[=<socket>|<key>[,<key>]]")
|
||
-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: <name|uid>[:<group|gid>])
|
||
--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="kube_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 runtime’ami 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 <command> --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! && 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="kube_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 class="sect3">
|
||
<h4 id="_zadanie_15_service">Zadanie 15. Service</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz deployment z <code>nginx</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz Service, który będzie spinał pody utworzone przez Deployment</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_16_tworzenie_service_typu_nodeport">Zadanie 16. Tworzenie service typu NodePort</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz deployment z <code>httpd</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz Service typu NodePort, który łączy pody z tym service</p>
|
||
</li>
|
||
<li>
|
||
<p>Sprawdź IP Nodów za pomocą <code>kubectl get nodes -o wide</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Sprawdź za pomocą <code>kubectl get svc</code> na jakim porcie wystawił się service</p>
|
||
</li>
|
||
<li>
|
||
<p>Za pomocą curla uderz do każdego node i sprawdź, czy nginx odpowiada</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_17_tworzenie_ingress">Zadanie 17. Tworzenie Ingress</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Do poprzedniego Deploymentu stwórz Ingressa pod hostem ingress.sX.codomi.dev</p>
|
||
</li>
|
||
<li>
|
||
<p>Pamiętaj o adnotacji <code>cert-manager.io/cluster-issuer: letsencrypt-production</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Wejdź w przeglądarce na powyższy host i sprawdź, czy usługa odpowiada</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_18_blokada_ruchu_za_pomocą_networkpolicy">Zadanie 18. Blokada ruchu za pomocą NetworkPolicy</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz namespace <code>ns1</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz namespace <code>ns2</code></p>
|
||
</li>
|
||
<li>
|
||
<p>W <code>ns1</code> stwórz obraz busybox, który za pomocą curla uderza do obrazu w <code>ns2</code></p>
|
||
</li>
|
||
<li>
|
||
<p>W <code>ns2</code> stwórz obraz busybox, który za pomocą curla uderza do obrazu w <code>ns1</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Za pomocą NetworkPolicy ogranicz ruch pomiędzy namespaceami</p>
|
||
</li>
|
||
<li>
|
||
<p>Sprawdź w logach czy faktycznie komunikacja została ucięta</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_19_instalacja_minikube">Zadanie 19. Instalacja minikube</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Zainstaluj Dockera zgodnie z <a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository" class="bare">https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository</a></p>
|
||
</li>
|
||
<li>
|
||
<p>Zainstaluj <code>kubectl</code> zgodnie z <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux" class="bare">https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux</a></p>
|
||
</li>
|
||
<li>
|
||
<p>Zainstaluj <code>minikube</code> zgodnie z <a href="https://minikube.sigs.k8s.io/docs/start/" class="bare">https://minikube.sigs.k8s.io/docs/start/</a> (tylko punkty 1)</p>
|
||
</li>
|
||
<li>
|
||
<p>Uruchom klaster za pomocą <code>minikube start --driver=docker --nodes 2 --cni calico</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Sprawdź, czy klaster działa za pomocą <code>kubectl cluster-info</code></p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_20_użycie_configmap">Zadanie 20. Użycie ConfigMap</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz ConfigMap z konfiguracją do Nginx</p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz poda z obrazu Nginx i przekaż tę konfigurację do tego poda</p>
|
||
</li>
|
||
<li>
|
||
<p>Zaloguj się do poda i sprawdź czy konfiguracja została wrzucona do odpowiedniego miejsca</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_21_tworzenie_serviceaccount">Zadanie 21. Tworzenie ServiceAccount</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz ServiceAccount o nazwie <code>example-sa</code> w namesapace <code>kubernetes-dashboard</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Wygeneruj token dla tego SA za pomocą <code>kubectl -n kubernetes-dashboard create token example-sa</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Zaloguj się tym tokenem do Dashboardu, sprawdź co widzisz a czego nie</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_22_tworzenie_roli_i_powiązania">Zadanie 22. Tworzenie roli i powiązania</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Stwórz rolę, która umożliwia przeglądanie namespace</p>
|
||
</li>
|
||
<li>
|
||
<p>Powiąż rolę z wcześniej stworzonym ServiceAccount</p>
|
||
</li>
|
||
<li>
|
||
<p>Zaloguj się za pomocą tego konta</p>
|
||
</li>
|
||
<li>
|
||
<p>Sprawdź jak zmieniły się uprawnienia</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_23_tworzenie_hpa">Zadanie 23. Tworzenie HPA</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Na podstawie artykułu <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/" class="bare">https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/</a></p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz odpowiednie deploymenty</p>
|
||
</li>
|
||
<li>
|
||
<p>Stwórz HPA</p>
|
||
</li>
|
||
<li>
|
||
<p>Wygeneruj ruch i sprawdź, czy pody się automatycznie tworzą i kasują</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
<div class="sect3">
|
||
<h4 id="_zadanie_24_użycie_helma">Zadanie 24. Użycie Helma</h4>
|
||
<div class="olist arabic">
|
||
<ol class="arabic">
|
||
<li>
|
||
<p>Uruchom MariaDB za pomocą Helma (<a href="https://github.com/bitnami/charts/tree/main/bitnami/mariadb" class="bare">https://github.com/bitnami/charts/tree/main/bitnami/mariadb</a>)</p>
|
||
</li>
|
||
<li>
|
||
<p>Uruchom PhpMyAdmin za pomocą Helma (<a href="https://github.com/bitnami/charts/tree/main/bitnami/phpmyadmin" class="bare">https://github.com/bitnami/charts/tree/main/bitnami/phpmyadmin</a>)</p>
|
||
</li>
|
||
<li>
|
||
<p>Powiąż PhpMyAdmin z MariaDB</p>
|
||
</li>
|
||
<li>
|
||
<p>Ustaw Ingressa w PhpMyAdmin na host: phpmyadmin.sX.codomi.pl</p>
|
||
</li>
|
||
<li>
|
||
<p>Pamiętaj o adnotacji <code>cert-manager.io/cluster-issuer: letsencrypt-production</code></p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="footer">
|
||
<div id="footer-text">
|
||
Last updated 2024-02-27 07:54:40 UTC
|
||
</div>
|
||
</div>
|
||
|
||
</body></html> |