рдХрд┐рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп Kubernetes

рд▓реЗрдЦрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрджрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рд╣реЛрддрд╛ "DevOps рд╕рд░рд╛рд╡ рдЖрдгрд┐ рд╕рд╛рдзрдиреЗ".

рдХрд┐рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп Kubernetes

рдЬрд░ рддреБрдореНрд╣реА рд╣реЗ рд╡рд╛рдЪрдд рдЕрд╕рд╛рд▓, рддрд░ рддреБрдореНрд╣реА рдХрджрд╛рдЪрд┐рдд рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдмрджреНрджрд▓ рдХрд╛рд╣реАрддрд░реА рдРрдХрд▓реЗ рдЕрд╕реЗрд▓ (рдЖрдгрд┐ рдирд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдЗрдереЗ рдХрд╕реЗ рдкреЛрд╣реЛрдЪрд▓рд╛рдд?) рдкрдг рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдореНрд╣рдгрдЬреЗ рдирдХреНрдХреА рдХрд╛рдп? рдпрд╛ "рдФрджреНрдпреЛрдЧрд┐рдХ рджрд░реНрдЬрд╛рдЪреНрдпрд╛ рдХрдВрдЯреЗрдирд░рдЪреЗ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди"? рдХрд┐рдВрд╡рд╛ "рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рд╡реНрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо"? рдпрд╛рдЪрд╛ рдЕрд░реНрде рдХрд╛рдп?

рдЦрд░реЗ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдорд▓рд╛ 100% рдЦрд╛рддреНрд░реА рдирд╛рд╣реА. рдкрд░рдВрддреБ рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рдЗрдВрдЯрд░реНрдирд▓реНрд╕рдордзреНрдпреЗ рдЦреЛрджрдгреЗ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рдЕрдореВрд░реНрддрддреЗрдЪреНрдпрд╛ рдЕрдиреЗрдХ рд╕реНрддрд░рд╛рдВрдЦрд╛рд▓реА рдЦрд░реЛрдЦрд░ рдХрд╛рдп рдЪрд╛рд▓рд▓реЗ рдЖрд╣реЗ рддреЗ рдкрд╛рд╣рдгреЗ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ. рддрд░ рдлрдХреНрдд рдордиреЛрд░рдВрдЬрдирд╛рд╕рд╛рдареА, рдПрдХ рдХрд┐рдорд╛рди тАЬрдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░тАЭ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╕рд╛ рджрд┐рд╕рддреЛ рддреЗ рдкрд╛рд╣реВ. (рд╣реЗ рдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╕реЛрдкреЗ рд╣реЛрдИрд▓ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдж рд╣рд╛рд░реНрдб рд╡реЗ.)

рдореА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕, рд▓рд┐рдирдХреНрд╕ рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░рдЪреЗ рдореВрд▓рднреВрдд рдЬреНрдЮрд╛рди рдЖрд╣реЗ. рдЖрдореНрд╣реА рдпреЗрдереЗ рдЬреЗ рдХрд╛рд╣реА рдмреЛрд▓рддреЛ рддреЗ рдлрдХреНрдд рд╕рдВрд╢реЛрдзрди/рд╢рд┐рдХрдгреНрдпрд╛рдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдиреЗ рдЖрд╣реЗ, рддреНрдпрд╛рддреАрд▓ рдХрд╛рд╣реАрд╣реА рдЙрддреНрдкрд╛рджрдирд╛рдд рдЯрд╛рдХреВ рдирдХрд╛!

рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рдЕрдиреЗрдХ рдШрдЯрдХ рдЕрд╕рддрд╛рдд. рддреНрдпрд╛рдиреБрд╕рд╛рд░ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛, рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

рдХрд┐рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп Kubernetes

рдпреЗрдереЗ рдХрд┐рдорд╛рди рдЖрда рдШрдЯрдХ рджрд╛рдЦрд╡рд▓реЗ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рддреНрдпрд╛рдкреИрдХреА рдмрд╣реБрддреЗрдХрд╛рдВрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВ. рдорд▓рд╛ рд╣реЗ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдореНрд╣рдгрддрд╛ рдпреЗрдИрд▓ рдЕрд╢рд╛ рдХрд┐рдорд╛рди рдЧреЛрд╖реНрдЯреАрдордзреНрдпреЗ рддреАрди рдореБрдЦреНрдп рдШрдЯрдХ рдЕрд╕рддрд╛рдд:

  • рдХреБрдмреЗрд▓реЗрдЯ
  • kube-apiserver (рдЬреЗ etcd рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ - рддреНрдпрд╛рдЪрд╛ рдбреЗрдЯрд╛рдмреЗрд╕)
  • рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо (рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдбреЙрдХрд░)

рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдмрджреНрджрд▓ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдХрд╛рдп рдореНрд╣рдгрддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛ (rus., рдЗрдВрдЧреНрд░рдЬреА.). рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдХреБрдмреЗрд▓реЗрдЯ:

рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд╡рд░ рдПрдХ рдПрдЬрдВрдЯ рдХрд╛рд░реНрдпрд░рдд рдЖрд╣реЗ. рдкреЙрдбрдордзреНрдпреЗ рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓реВ рдЖрд╣реЗрдд рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рддреЗ.

рдкреБрд░реЗрд╕реЗ рд╕реЛрдкреЗ рд╡рд╛рдЯрддреЗ. рддреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рдп рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдореНрд╕ (рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо)?

рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рд╣рд╛ рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрд╣реЗ.

рдЕрддрд┐рд╢рдп рдорд╛рд╣рд┐рддреАрдкреВрд░реНрдг. рдкрд░рдВрддреБ рдЬрд░ рддреБрдореНрд╣реА рдбреЙрдХрд░рд╢реА рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд╛рд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХрд╛рдп рдХрд░рддреЗ рдпрд╛рдЪреА рд╕рд╛рдорд╛рдиреНрдп рдХрд▓реНрдкрдирд╛ рдЕрд╕рд╛рд╡реА. (рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдЖрдгрд┐ рдХреБрдмреЗрд▓реЗрдЯрдордзреАрд▓ рдЬрдмрд╛рдмрджрд╛рд▒реНрдпрд╛рдВрдЪреНрдпрд╛ рдкреГрдердХреНрдХрд░рдгрд╛рдЪреЗ рддрдкрд╢реАрд▓ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЦреВрдкрдЪ рд╕реВрдХреНрд╖реНрдо рдЖрд╣реЗрдд рдЖрдгрд┐ рдореА рдпреЗрдереЗ рддреНрдпрд╛рдордзреНрдпреЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА.)

╨Ш API рд╕рд░реНрд╡реНрд╣рд░?

API рд╕рд░реНрд╡реНрд╣рд░ рд╣рд╛ Kubernetes рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓ рдШрдЯрдХ рдЖрд╣реЗ рдЬреЛ Kubernetes API рдЙрдШрдб рдХрд░рддреЛ. API рд╕рд░реНрд╡реНрд╣рд░ рд╣реА Kubernetes рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓рдЪреА рдХреНрд▓рд╛рдпрдВрдЯ рдмрд╛рдЬреВ рдЖрд╣реЗ

рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕реЛрдмрдд рдЬреНрдпрд╛рдиреЗ рдХрдзреАрд╣реА рдХрд╛рд╣реАрд╣реА рдХреЗрд▓реЗ рдЕрд╕реЗрд▓ рддреНрдпрд╛рд▓рд╛ рдереЗрдЯ рдХрд┐рдВрд╡рд╛ рдХреБрдмреЗрдХреНрдЯрд▓рджреНрд╡рд╛рд░реЗ API рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ. рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдмрдирд╡рдгрд╛рд░реЗ рд╣реЗ рд╣реГрджрдп рдЖрд╣реЗ - рд╣рд╛ рдореЗрдВрджреВ рдЬреЛ YAML рдЪреНрдпрд╛ рдкрд░реНрд╡рддрд╛рдВрдирд╛ рдЖрдкрд▓реНрдпрд╛ рд╕рд░реНрд╡рд╛рдВрдирд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ (?) рдХрд╛рд░реНрдпрд░рдд рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдордзреНрдпреЗ рдмрджрд▓рддреЛ. рд╣реЗ рд╕реНрдкрд╖реНрдЯ рджрд┐рд╕рддреЗ рдХреА API рдЖрдордЪреНрдпрд╛ рдХрд┐рдорд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЙрдкрд╕реНрдерд┐рдд рдЕрд╕рд╛рд╡реЗ.

рдкреВрд░реНрд╡ рд╢рд░реНрдд

  • рд░реВрдЯ рдНрдХреНрд╕реЗрд╕рд╕рд╣ рд▓рд┐рдирдХреНрд╕ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдХрд┐рдВрд╡рд╛ рдлрд┐рдЬрд┐рдХрд▓ рдорд╢реАрди (рдореА рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирд╡рд░ рдЙрдмрдВрдЯреВ 18.04 рд╡рд╛рдкрд░рдд рдЖрд╣реЗ).
  • рдЖрдгрд┐ рд╣реЗ рд╕рд░реНрд╡ рдЖрд╣реЗ!

рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рд╕реНрдерд╛рдкрдирд╛

рдЖрдореНрд╣реА рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдорд╢реАрдирд╡рд░ рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. (рдбреЙрдХрд░ рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдпрд╛рдмрджреНрджрд▓ рдореА рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА; рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рддреЗрдереЗ рдЖрд╣реЗ рдЕрдкреНрд░рддрд┐рдо рд▓реЗрдЦ). рдЪрд▓рд╛ рдлрдХреНрдд рддреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛ apt:

$ sudo apt install docker.io
$ sudo systemctl start docker

рддреНрдпрд╛рдирдВрддрд░, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдмрд╛рдпрдирд░реА рдорд┐рд│рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЦрд░рдВ рддрд░, рдЖрдордЪреНрдпрд╛ "рдХреНрд▓рд╕реНрдЯрд░" рдЪреНрдпрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрдгрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ kubelet, рдЗрддрд░ рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ kubelet. рдЖрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдЪрд╛рд▓реВ рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ kubectl.

$ curl -L https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz > server.tar.gz
$ tar xzvf server.tar.gz
$ cp kubernetes/server/bin/kubelet .
$ cp kubernetes/server/bin/kubectl .
$ ./kubelet --version
Kubernetes v1.18.5

рдиреБрд╕рддреЗ рдзрд╛рд╡рд▓реЗ рддрд░ рдХрд╛рдп рд╣реЛрдИрд▓ kubelet?

$ ./kubelet
F0609 04:03:29.105194    4583 server.go:254] mkdir /var/lib/kubelet: permission denied

kubelet рд░реВрдЯ рдореНрд╣рдгреВрди рдЪрд╛рд▓рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрдЧрджреА рддрд╛рд░реНрдХрд┐рдХ, рдХрд╛рд░рдг рддреНрдпрд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдиреЛрдб рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЪрд▓рд╛ рддреНрдпрд╛рдЪреЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд╛рд╣реВ:

$ ./kubelet -h
<╤Б╨╗╨╕╤И╨║╨╛╨╝ ╨╝╨╜╨╛╨│╨╛ ╤Б╤В╤А╨╛╨║, ╤З╤В╨╛╨▒╤Л ╤А╨░╨╖╨╝╨╡╤Б╤В╨╕╤В╤М ╨╖╨┤╨╡╤Б╤М>
$ ./kubelet -h | wc -l
284

рд╡реНрд╡рд╛, рдмрд░реЗрдЪ рдкрд░реНрдпрд╛рдп! рд╕реБрджреИрд╡рд╛рдиреЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдкреИрдХреА рдлрдХреНрдд рджреЛрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдкреИрдХреА рдПрдХ рдпреЗрдереЗ рдЖрд╣реЗ:

--pod-manifest-path string

рд╕реНрдЯреЕрдЯрд┐рдХ рдкреЙрдбреНрд╕рд╕рд╛рдареА рдлрд╛рдЗрд▓реНрд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдЪрд╛ рдорд╛рд░реНрдЧ рдХрд┐рдВрд╡рд╛ рд╕реНрдЯреЕрдЯрд┐рдХ рдкреЙрдбреНрд╕рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд▒реНрдпрд╛ рдлрд╛рдЗрд▓рдЪрд╛ рдорд╛рд░реНрдЧ. рдбреЙрдЯреНрд╕рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгрд╛рд▒реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. (рдирд╛рдкрд╕рдВрдд: рд╣рд╛ рдкрд░реНрдпрд╛рдп рдХреБрдмреЗрд▓реЗрдЯрд▓рд╛ --config рдкрд░реНрдпрд╛рдпрд╛рджреНрд╡рд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, рдкрд╣рд╛ kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file .)

рд╣рд╛ рдкрд░реНрдпрд╛рдп рдЖрдореНрд╣рд╛рд▓рд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ рд╕реНрдерд┐рд░ рд╢реЗрдВрдЧрд╛ тАФ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ API рджреНрд╡рд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреЙрдбреНрд╕. рд╕реНрдЯреЕрдЯрд┐рдХ рдкреЙрдбреНрд╕ рдХреНрд╡рдЪрд┐рддрдЪ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдкрд░рдВрддреБ рдХреНрд▓рд╕реНрдЯрд░ рддреНрд╡рд░реАрдд рд╡рд╛рдврд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдЦреВрдк рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗрдд рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╣реЗрдЪ рд╣рд╡реЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдпрд╛ рдореЛрдареНрдпрд╛ рдЪреЗрддрд╛рд╡рдгреАрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВ (рдкреБрдиреНрд╣рд╛, рд╣реЗ рдЙрддреНрдкрд╛рджрдирд╛рдд рдЪрд╛рд▓рд╡реВ рдирдХрд╛!) рдЖрдгрд┐ рдЖрдореНрд╣реА рдкреЙрдб рдЪрд╛рд▓реВ рдХрд░реВ рд╢рдХрддреЛ рдХрд╛ рддреЗ рдкрд╛рд╣реВ.

рдкреНрд░рдердо рдЖрдкрдг рд╕реНрдЯреЕрдЯрд┐рдХ рдкреЙрдбреНрд╕рд╕рд╛рдареА рдбрд┐рд░реЗрдХреНрдЯрд░реА рддрдпрд╛рд░ рдХрд░реВ рдЖрдгрд┐ рд░рди рдХрд░реВ kubelet:

$ mkdir pods
$ sudo ./kubelet --pod-manifest-path=pods

рддреНрдпрд╛рдирдВрддрд░, рджреБрд╕рд░реНтАНрдпрд╛ рдЯрд░реНрдорд┐рдирд▓/tmux рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ/рдХрд╛рд╣реАрд╣реА, рдЖрдореНрд╣реА рдкреЙрдб рдореЕрдирд┐рдлреЗрд╕реНрдЯ рддрдпрд╛рд░ рдХрд░реВ:

$ cat <<EOF > pods/hello.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello
spec:
  containers:
  - image: busybox
    name: hello
    command: ["echo", "hello world!"]
EOF

kubelet рдХрд╛рд╣реА рдЗрд╢рд╛рд░реЗ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рддреЗ рдЖрдгрд┐ рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдХрд╛рд╣реАрд╣реА рд╣реЛрдд рдирд╛рд╣реА. рдкрдг рддреЗ рдЦрд░реЗ рдирд╛рд╣реА! рдЪрд▓рд╛ рдбреЙрдХрд░ рдкрд╛рд╣реВ:

$ sudo docker ps -a
CONTAINER ID        IMAGE                  COMMAND                 CREATED             STATUS                      PORTS               NAMES
8c8a35e26663        busybox                "echo 'hello world!'"   36 seconds ago      Exited (0) 36 seconds ago                       k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
68f670c3c85f        k8s.gcr.io/pause:3.2   "/pause"                2 minutes ago       Up 2 minutes                                    k8s_POD_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_0
$ sudo docker logs k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
hello world!

kubelet рдореА рдкреЙрдб рдореЕрдирд┐рдлреЗрд╕реНрдЯ рд╡рд╛рдЪрд▓рд╛ рдЖрдгрд┐ рдбреЙрдХрд░рд▓рд╛ рдЖрдордЪреНрдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдиреБрд╕рд╛рд░ рджреЛрди рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдЬреНрдЮрд╛ рджрд┐рд▓реА. (рддреБрдореНрд╣реА "рдкреЙрдЬ" рдХрдВрдЯреЗрдирд░рдмрджреНрджрд▓ рд╡рд┐рдЪрд╛рд░ рдХрд░рдд рдЕрд╕рд╛рд▓ рддрд░, рд╣реЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╣реЕрдХ рдЖрд╣реЗ - рдкрд╣рд╛ рд╣рд╛ рдмреНрд▓реЙрдЧ.) рдХреБрдмреЗрд▓реЗрдЯ рдЖрдордЪрд╛ рдХрдВрдЯреЗрдирд░ рд▓рд╛рдБрдЪ рдХрд░реЗрд▓ busybox рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрджреЗрд╢рд╛рд╕рд╣ рдЖрдгрд┐ рд╕реНрдЯреЕрдЯрд┐рдХ рдкреЙрдб рд╣рдЯрд╡рд▓реЗ рдЬрд╛рдИрдкрд░реНрдпрдВрдд рддреЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд│рд╛рд╕рд╛рдареА рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реЗрд▓.

рд╕реНрд╡рддрдГрдЪреЗ рдЕрднрд┐рдирдВрджрди рдХрд░рд╛. рдЖрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдЯрд░реНрдорд┐рдирд▓рд╡рд░ рдордЬрдХреВрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрдгрд╛рд░рд╛ рдорд╛рд░реНрдЧ рд╢реЛрдзреВрди рдХрд╛рдврд▓рд╛!

рд▓рд╛рдБрдЪ рдЗ

Kubernetes API рдЪрд╛рд▓рд╡рдгреЗ рд╣реЗ рдЖрдордЪреЗ рдЕрдВрддрд┐рдо рдзреНрдпреЗрдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо рдЪрд╛рд▓рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЗ. рдкреЙрдбреНрд╕ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдареЗрд╡реВрди рдХрд┐рдорд╛рди etcd рдХреНрд▓рд╕реНрдЯрд░ рд╕реБрд░реВ рдХрд░реВрдпрд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, pods/etcd.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: etcd
  namespace: kube-system
spec:
  containers:
  - name: etcd
    command:
    - etcd
    - --data-dir=/var/lib/etcd
    image: k8s.gcr.io/etcd:3.4.3-0
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
  hostNetwork: true
  volumes:
  - hostPath:
      path: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

рддреБрдореНрд╣реА рдХрдзреА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕реЛрдмрдд рдХрд╛рдо рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдпрд╛ YAML рдлрд╛рдЗрд▓реНрд╕ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд╛рд╡реНрдпрд╛рдд. рдпреЗрдереЗ рдлрдХреНрдд рджреЛрди рдореБрджреНрджреЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗрдд:

рдЖрдореНрд╣реА рд╣реЛрд╕реНрдЯ рдлреЛрд▓реНрдбрд░ рдорд╛рдЙрдВрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ /var/lib/etcd рдкреЙрдбрдордзреНрдпреЗ рдЬреЗрдгреЗрдХрд░реБрди рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ etcd рдбреЗрдЯрд╛ рдЬрддрди рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ (рдЬрд░ рд╣реЗ рдХреЗрд▓реЗ рдирд╛рд╣реА, рддрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдкреЙрдб рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓реНрдпрд╛рд╡рд░ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд┐рддреА рдорд┐рдЯрд╡рд▓реА рдЬрд╛рдИрд▓, рдЬреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕рдЪреНрдпрд╛ рдХрд┐рдорд╛рди рд╕реНрдерд╛рдкрдиреЗрд╕рд╛рдареА рджреЗрдЦреАрд▓ рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА).

рдЖрдореНрд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ hostNetwork: true. рд╣реЗ рд╕реЗрдЯрд┐рдВрдЧ, рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ, рдкреЙрдбрдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдиреЗрдЯрд╡рд░реНрдХрдРрд╡рдЬреА рд╣реЛрд╕реНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА etcd рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рддреЗ (рдпрд╛рдореБрд│реЗ API рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ etcd рдХреНрд▓рд╕реНрдЯрд░ рд╢реЛрдзрдгреЗ рд╕реЛрдкреЗ рд╣реЛрдИрд▓).

рдПрдХ рд╕рд╛рдзреА рддрдкрд╛рд╕рдгреА рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА etcd рдЦрд░реЛрдЦрд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯрд╡рд░ рдЪрд╛рд▓рдд рдЖрд╣реЗ рдЖрдгрд┐ рдбрд┐рд╕реНрдХрд╡рд░ рдбреЗрдЯрд╛ рдЬрддрди рдХрд░рдд рдЖрд╣реЗ:

$ curl localhost:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
$ sudo tree /var/lib/etcd/
/var/lib/etcd/
тФФтФАтФА member
    тФЬтФАтФА snap
    тФВ   тФФтФАтФА db
    тФФтФАтФА wal
        тФЬтФАтФА 0.tmp
        тФФтФАтФА 0000000000000000-0000000000000000.wal

API рд╕рд░реНрд╡реНрд╣рд░ рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЗ

Kubernetes API рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓рд╡рдгреЗ рдЖрдгрдЦреА рд╕реЛрдкреЗ рдЖрд╣реЗ. рдлрдХреНрдд рдкреЕрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ --etcd-servers, рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрд╣реЗ рддреЗ рдХрд░рддреЗ:

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --etcd-servers=http://127.0.0.1:2379
    image: k8s.gcr.io/kube-apiserver:v1.18.5
  hostNetwork: true

рд╣реА YAML рдлрд╛рдИрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдареЗрд╡рд╛ pods, рдЖрдгрд┐ API рд╕рд░реНрд╡реНрд╣рд░ рд╕реБрд░реВ рд╣реЛрдИрд▓. рд╕рд╣ рддрдкрд╛рд╕рдд рдЖрд╣реЗ curl рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ API рдкреЛрд░реНрдЯ 8080 рд╡рд░ рдкреВрд░реНрдгрдкрдгреЗ рдЦреБрд▓реНрдпрд╛ рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╣ рдРрдХрдд рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рджрд░реНрд╢рд╡рд┐рддреЗ - рдХреЛрдгрддреЗрд╣реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА!

$ curl localhost:8080/healthz
ok
$ curl localhost:8080/api/v1/pods
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/pods",
    "resourceVersion": "59"
  },
  "items": []
}

(рдкреБрдиреНрд╣рд╛, рд╣реЗ рдЙрддреНрдкрд╛рджрдирд╛рдд рдЪрд╛рд▓рд╡реВ рдирдХрд╛! рдорд▓рд╛ рдереЛрдбреЗ рдЖрд╢реНрдЪрд░реНрдп рд╡рд╛рдЯрд▓реЗ рдХреА рдбреАрдлреЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдЗрддрдХреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ. рдкрд░рдВрддреБ рдорд╛рдЭрд╛ рдЕрдВрджрд╛рдЬ рдЖрд╣реЗ рдХреА рд╣реЗ рд╡рд┐рдХрд╛рд╕ рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рд╕реБрд▓рдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╣реЗ.)

рдЖрдгрд┐, рдЖрдирдВрджрджрд╛рдпреА рдЖрд╢реНрдЪрд░реНрдп, рдХреБрдмреЗрдХреНрдЯрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╢рд┐рд╡рд╛рдп рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ!

$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ ./kubectl get pod
No resources found in default namespace.

рд╕рдорд╕реНрдпрд╛

рдкрд░рдВрддреБ рдЬрд░ рдЖрдкрдг рдереЛрдбреЗ рдЦреЛрд▓ рдЦреЛрджрд▓реЗ рддрд░ рдХрд╛рд╣реАрддрд░реА рдЪреВрдХ рд╣реЛрдд рдЖрд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.

рдЖрдореНрд╣реА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рд░ рд╢реЗрдВрдЧрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд! рдЦрд░рдВ рддрд░, рдЖрдордЪрд╛ рдХреБрдмреЗрд▓реЗрдЯ рдиреЛрдб рдЕрдЬрд┐рдмрд╛рдд рд╕рд╛рдкрдбрд▓реЗрд▓рд╛ рдирд╛рд╣реА:

$ ./kubectl get nodes
No resources found in default namespace.

рдХрд╛рдп рдЭрд▓рд╛? рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рдкрд░рд┐рдЪреНрдЫреЗрдж рдкреВрд░реНрд╡реА рдЖрдард╡рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреНрдпрд╛ рдЕрддреНрдпрдВрдд рд╕реЛрдкреНрдпрд╛ рд╕реЗрдЯрд╕рд╣ рдХреБрдмреЗрд▓реЗрдЯ рд╕реБрд░реВ рдХреЗрд▓реЗ, рддреНрдпрд╛рдореБрд│реЗ рдПрдкреАрдЖрдп рд╕рд░реНрд╡реНрд╣рд░рд╢реА рд╕рдВрдкрд░реНрдХ рдХрд╕рд╛ рд╕рд╛рдзрд╛рд╡рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рд╕реНрдерд┐рддреА рдХрд╢реА рд╕реВрдЪрд┐рдд рдХрд░рд╛рд╡реА рд╣реЗ рдХреБрдмреЗрд▓реЗрдЯрд▓рд╛ рдХрд│рдд рдирд╛рд╣реА. рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдзреНрд╡рдЬ рд╕рд╛рдкрдбрддреЛ:

--kubeconfig string

рдлрд╛рдИрд▓рдЪрд╛ рдорд╛рд░реНрдЧ kubeconfig, рдЬреЗ API рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рд╛рдпрдЪреЗ рддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ. рдЙрдкрд▓рдмреНрдзрддрд╛ --kubeconfig API рд╕рд░реНрд╡реНрд╣рд░ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░рддреЗ, рдирд╛рд╣реА --kubeconfig рдСрдлрд▓рд╛рдЗрди рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░рддреЗ.

рдПрд╡рдвреНрдпрд╛ рд╡реЗрд│рд╛рдд, рдирдХрд│рдд, рдЖрдореНрд╣реА "рдСрдлрд▓рд╛рдЗрди рдореЛрдб" рдордзреНрдпреЗ рдХреБрдмреЗрд▓реЗрдЯ рдЪрд╛рд▓рд╡рдд рд╣реЛрддреЛ. (рдЖрдореНрд╣реА рдкреЗрдбреЗрдВрдЯрд┐рдХ рдЕрд╕рд▓реЛ рддрд░, рдЖрдореНрд╣реА "рдХрд┐рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХреБрдмреЗрд░рдиреЗрдЯ" рдореНрд╣рдгреВрди рд╕реНрд╡рддрдВрддреНрд░ рдХреБрдмреЗрд▓реЗрдЯрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ, рдкрд░рдВрддреБ рддреЗ рдЦреВрдк рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдЕрд╕реЗрд▓). "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ kubeconfig рдлрд╛рдЗрд▓ kubelet рдордзреНрдпреЗ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реБрди API рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрд╕реЗ рдмреЛрд▓рд╛рдпрдЪреЗ рддреЗ рдХрд│реЗрд▓. рд╕реБрджреИрд╡рд╛рдиреЗ рд╣реЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ (рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХреЛрдгрддреЗрд╣реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд┐рдВрд╡рд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдорд╕реНрдпрд╛ рдирд╛рд╣реАрдд):

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: http://127.0.0.1:8080
  name: mink8s
contexts:
- context:
    cluster: mink8s
  name: mink8s
current-context: mink8s

рд╣реЗ рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХрд░рд╛ kubeconfig.yamlрдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╖реНрдЯ рдХрд░рд╛ kubelet рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рд╛:

$ sudo ./kubelet --pod-manifest-path=pods --kubeconfig=kubeconfig.yaml

(рддрд╕реЗ, рдХреБрдмреЗрд▓реЗрдЯ рдЪрд╛рд▓реВ рдирд╕рддрд╛рдирд╛ рддреБрдореНрд╣реА рдХрд░реНрд▓рджреНрд╡рд╛рд░реЗ API рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓реНрдпрд╛рд╕, рддреЗ рдЕрдЬреВрдирд╣реА рдЪрд╛рд▓реВ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдврд│реЗрд▓! рдХреБрдмреЗрд▓реЗрдЯ рд╣реЗ рдбреЙрдХрд░ рд╕рд╛рд░рдЦреНрдпрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреЙрдбреНрд╕рдЪреЗ "рдкрд╛рд▓рдХ" рдирд╛рд╣реА, рддреЗ "рдирд┐рдпрдВрддреНрд░рдг" рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ. рдбрд┐рдорди." рдХреБрдмреЗрд▓реЗрдЯрджреНрд╡рд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗрд▓реЗ рдХрдВрдЯреЗрдирд░ рдХреБрдмреЗрд▓реЗрдЯ рдерд╛рдВрдмреЗрдкрд░реНрдпрдВрдд рдЪрд╛рд▓рдд рд░рд╛рд╣рддреАрд▓.)

рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдд kubectl рдЖрдордЪреНрдпрд╛ рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╢реЗрдВрдЧрд╛ рдЖрдгрд┐ рдиреЛрдбреНрд╕ рджрд╛рдЦрд╡рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд:

$ ./kubectl get pods -A
NAMESPACE     NAME                    READY   STATUS             RESTARTS   AGE
default       hello-mink8s            0/1     CrashLoopBackOff   261        21h
kube-system   etcd-mink8s             1/1     Running            0          21h
kube-system   kube-apiserver-mink8s   1/1     Running            0          21h
$ ./kubectl get nodes -owide
NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
mink8s   Ready    <none>   21h   v1.18.5   10.70.10.228   <none>        Ubuntu 18.04.4 LTS   4.15.0-109-generic   docker://19.3.6

рдЪрд▓рд╛ рдпрд╛ рд╡реЗрд│реА рд╕реНрд╡рддрдГрдЪреЗ рдЕрднрд┐рдирдВрджрди рдХрд░реВрдпрд╛ (рдорд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рдореА рдЖрдзреАрдЪ рд╕реНрд╡рддрдГрдЪреЗ рдЕрднрд┐рдирдВрджрди рдХреЗрд▓реЗ рдЖрд╣реЗ) - рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреВрд░реНрдгрддрдГ рдХрд╛рд░реНрдпрд╢реАрд▓ API рд╕рд╣ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд┐рдорд╛рди рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ "рдХреНрд▓рд╕реНрдЯрд░" рдЖрд╣реЗ!

рдЖрдореНрд╣реА рдЕрдВрддрд░реНрдЧрдд рд▓рд╛рдБрдЪ рдХрд░рддреЛ

рдЖрддрд╛ API рдХрд╛рдп рд╕рдХреНрд╖рдо рдЖрд╣реЗ рддреЗ рдкрд╛рд╣реВ. рдЪрд▓рд╛ nginx рдкреЙрдбрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx

рдпреЗрдереЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдРрд╡рдЬреА рдордиреЛрд░рдВрдЬрдХ рддреНрд░реБрдЯреА рдорд┐рд│рддреЗ:

$ ./kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx" is
forbidden: error looking up service account default/default: serviceaccount
"default" not found
$ ./kubectl get serviceaccounts
No resources found in default namespace.

рдпреЗрдереЗ рдЖрдкрдг рдкрд╛рд╣рддреЛ рдХреА рдЖрдкрд▓реЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд┐рддреА рдЕрдкреВрд░реНрдг рдЖрд╣реЗ - рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕реЗрд╡рд╛рдВрд╕рд╛рдареА рдХреЛрдгрддреЗрд╣реА рдЦрд╛рддреЗ рдирд╛рд╣реАрдд. рдЪрд▓рд╛ рдореЕрдиреНрдпреБрдЕрд▓реА рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░реВрди рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рдЖрдгрд┐ рдХрд╛рдп рд╣реЛрддреЗ рддреЗ рдкрд╛рд╣реВ:

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
EOS
serviceaccount/default created
$ ./kubectl apply -f nginx.yaml
Error from server (ServerTimeout): error when creating "nginx.yaml": No API
token found for service account "default", retry after the token is
automatically created and added to the service account

рдЖрдореНрд╣реА рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдореЕрдиреНрдпреБрдЕрд▓реА рддрдпрд╛рд░ рдХреЗрд▓реЗ рддрд░реАрд╣реА, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдд рдирд╛рд╣реА. рдЬрд╕рдЬрд╕реЗ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдорд┐рдирд┐рдорд▓рд┐рд╕реНрдЯрд┐рдХ "рдХреНрд▓рд╕реНрдЯрд░" рдЪрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдд рд░рд╛рд╣реВ, рддрд╕рддрд╕реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдврд│реЗрд▓ рдХреА рд╕рд╣рд╕рд╛ рдЖрдкреЛрдЖрдк рдШрдбрдгрд╛рд▒реНрдпрд╛ рдмрд╣реБрддреЗрдХ рдЙрдкрдпреБрдХреНрдд рдЧреЛрд╖реНрдЯреА рдЧрд╣рд╛рд│ рд╣реЛрддреАрд▓. Kubernetes API рд╕рд░реНрд╡реНрд╣рд░ рд╣рд╛ рдЕрдЧрджреА рдорд┐рдирд┐рдорд▓рд┐рд╕реНрдЯрд┐рдХ рдЖрд╣реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдмрд╣реБрддреЗрдХ рд╣реЗрд╡реА рд▓рд┐рдлреНрдЯрд┐рдВрдЧ рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд┐рд╡рд┐рдз рдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдЖрдгрд┐ рдмреЕрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдмреНрд╕рдордзреНрдпреЗ рд╣реЛрдд рдЖрд╣реЗ рдЬреЗ рдЕрджреНрдпрд╛рдк рдЪрд╛рд▓реВ рдирд╛рд╣реАрдд.

рдЖрдореНрд╣реА рдкрд░реНрдпрд╛рдп рд╕реЗрдЯ рдХрд░реВрди рдпрд╛ рд╕рдорд╕реНрдпреЗрд╡рд░ рдХрд╛рдо рдХрд░реВ рд╢рдХрддреЛ automountServiceAccountToken рд╕реЗрд╡рд╛ рдЦрд╛рддреНрдпрд╛рд╕рд╛рдареА (рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рддрд░реАрд╣реА рд╡рд╛рдкрд░рд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░ рдирд╛рд╣реА):

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: default
automountServiceAccountToken: false
EOS
serviceaccount/default configured
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Pending   0          13m

рд╢реЗрд╡рдЯреА, рдкреЙрдб рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ! рдкрдг рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рддреЗ рд╕реБрд░реВ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдирд╛рд╣реА рдирд┐рдпреЛрдЬрдХ (рд╢реЗрдбреНрдпреБрд▓рд░) рд╣рд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдЪрд╛ рдЖрдгрдЦреА рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдШрдЯрдХ рдЖрд╣реЗ. рдкреБрдиреНрд╣рд╛, рдЖрдореНрд╣реА рдкрд╛рд╣рддреЛ рдХреА Kubernetes API рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ "рдореВрдХ" рдЖрд╣реЗ - рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА API рдордзреНрдпреЗ рдкреЙрдб рддрдпрд╛рд░ рдХрд░рддрд╛ рддреЗрд╡реНрд╣рд╛ рддреЗ рддреНрдпрд╛рдЪреА рдиреЛрдВрджрдгреА рдХрд░рддреЗ, рдкрд░рдВрддреБ рддреЗ рдХреЛрдгрддреНрдпрд╛ рдиреЛрдбрд╡рд░ рдЪрд╛рд▓рд╡рд╛рдпрдЪреЗ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдд рдирд╛рд╣реА.

рдЦрд░рдВ рддрд░, рдкреЙрдб рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рд╢реЗрдбреНрдпреБрд▓рд░рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рддреБрдореНрд╣реА рдкреЕрд░рд╛рдореАрдЯрд░рдордзреАрд▓ рдореЕрдирд┐рдлреЗрд╕реНрдЯрдордзреНрдпреЗ рдореЕрдиреНрдпреБрдЕрд▓реА рдиреЛрдб рдЬреЛрдбреВ рд╢рдХрддрд╛ nodeName:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
  nodeName: mink8s

(рдмрджрд▓рд╛ mink8s рдиреЛрдбрдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╡рд░.) рдбрд┐рд▓реАрдЯ рдЖрдгрд┐ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдкрд╛рд╣рддреЛ рдХреА nginx рд╕реБрд░реВ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдВрддрд░реНрдЧрдд IP рдкрддреНрддрд╛ рдРрдХрдд рдЖрд╣реЗ:

$ ./kubectl delete pod nginx
pod "nginx" deleted
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          30s   172.17.0.2   mink8s   <none>           <none>
$ curl -s 172.17.0.2 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

рдкреЙрдбреНрд╕рдордзреАрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдд рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рджреБрд╕рд░реНрдпрд╛ рдкреЙрдбрдордзреВрди рдХрд░реНрд▓ рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ:

$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl
spec:
  containers:
  - image: curlimages/curl
    name: curl
    command: ["curl", "172.17.0.2"]
  nodeName: mink8s
EOS
pod/curl created
$ ./kubectl logs curl | head -6
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

рдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЦреЛрджрдгреЗ рдЖрдгрд┐ рдХрд╛рдп рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ рдХрд╛рдп рдирд╛рд╣реА рд╣реЗ рдкрд╛рд╣рдгреЗ рдЦреВрдк рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ. рдорд▓рд╛ рдЖрдврд│рд▓реЗ рдХреА рдХреЙрдиреНрдлрд┐рдЧрдореЕрдк рдЖрдгрд┐ рд╕рд┐рдХреНрд░реЗрдЯ рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рд╕реЗрд╡рд╛ рдЖрдгрд┐ рдЙрдкрдпреЛрдЬрди рдХрд░рдд рдирд╛рд╣реАрдд.

рдпрд╢!

рд╣реА рдкреЛрд╕реНрдЯ рд▓рд╛рдВрдмрдд рдЪрд╛рд▓рд▓реА рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдореА рд╡рд┐рдЬрдп рдШреЛрд╖рд┐рдд рдХрд░рдгрд╛рд░ рдЖрд╣реЗ рдЖрдгрд┐ рдореНрд╣рдгреЗрди рдХреА рд╣реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрд╣реЗ рдЬреНрдпрд╛рд▓рд╛ "рдХреБрдмрд░рдиреЗрдЯреЗрд╕" рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдереЛрдбрдХреНрдпрд╛рдд: рдЪрд╛рд░ рдмрд╛рдпрдирд░реА, рдкрд╛рдЪ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдгрд┐ YAML рдЪреНрдпрд╛ "рдлрдХреНрдд" 45 рдУрд│реА (рдирд╛рд╣реА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдЪреНрдпрд╛ рдорд╛рдирдХрд╛рдВрдиреБрд╕рд╛рд░) рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдмрд░реНтАНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдХрд╛рд░реНрдпрд░рдд рдЖрд╣реЗрдд:

  • рд╢реЗрдВрдЧрд╛ рдирд┐рдпрдорд┐рдд рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ API рд╡рд╛рдкрд░реВрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд (рдХрд╛рд╣реА рд╣реЕрдХрд╕рд╣)
  • рддреБрдореНрд╣реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрдВрдЯреЗрдирд░ рдкреНрд░рддрд┐рдорд╛ рдЕрдкрд▓реЛрдб рдЖрдгрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрддрд╛
  • рд╢реЗрдВрдЧрд╛ рдЬрд┐рд╡рдВрдд рд░рд╛рд╣рддрд╛рдд рдЖрдгрд┐ рдЖрдкреЛрдЖрдк рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рд╣реЛрддрд╛рдд
  • рдПрдХрд╛рдЪ рдиреЛрдбрдордзреАрд▓ рдкреЙрдбреНрд╕рдордзреАрд▓ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ
  • рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ рдХреЙрдиреНрдлрд┐рдЧрдореЕрдк, рдЧреБрдкреНрдд рдЖрдгрд┐ рд╕рд╛рдзреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдорд╛рдЙрдВрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп

рдкрд░рдВрддреБ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЦрд░реЛрдЦрд░ рдЙрдкрдпреБрдХреНрдд рдмрдирд╡рдгрд╛рд░реЗ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЕрджреНрдпрд╛рдк рдЧрд╣рд╛рд│ рдЖрд╣реЗ, рдЬрд╕реЗ рдХреА:

  • рдкреЙрдб рд╢реЗрдбреНрдпреВрд▓рд░
  • рдкреНрд░рдорд╛рдгреАрдХрд░рдг/рдЕрдзрд┐рдХреГрддреАрдХрд░рдг
  • рдПрдХрд╛рдзрд┐рдХ рдиреЛрдбреНрд╕
  • рд╕реЗрд╡рд╛рдВрдЪреЗ рдиреЗрдЯрд╡рд░реНрдХ
  • рдХреНрд▓рд╕реНрдЯрд░ рдХреЗрд▓реЗрд▓реЗ рдЕрдВрддрд░реНрдЧрдд DNS
  • рд╕реЗрд╡рд╛ рдЦрд╛рддреА, рдЙрдкрдпреЛрдЬрди, рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдВрд╕рд╣ рдПрдХреАрдХрд░рдг рдЖрдгрд┐ рдХреБрдмрд░рдиреЗрдЯреЗрд╕ рдЖрдгрд▓реЗрд▓реНрдпрд╛ рдЗрддрд░ рдмрд╣реБрддреЗрдХ рд╡рд╕реНрддреВрдВрд╕рд╛рдареА рдирд┐рдпрдВрддреНрд░рдХ

рдордЧ рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рдп рдорд┐рд│рд╛рд▓реЗ? Kubernetes API, рд╕реНрд╡рддрдГ рдЪрд╛рд▓рдд рдЖрд╣реЗ, рд╣реЗ рдЦрд░реЛрдЦрд░ рдлрдХреНрдд рдПрдХ рд╡реНрдпрд╛рд╕рдкреАрда рдЖрд╣реЗ рдХрдВрдЯреЗрдирд░ рдСрдЯреЛрдореЗрд╢рди. рд╣реЗ рдлрд╛рд░ рдХрд╛рд╣реА рдХрд░рдд рдирд╛рд╣реА - рд╣реЗ API рд╡рд╛рдкрд░рдгрд╛рд░реЗ рд╡рд┐рд╡рд┐рдз рдирд┐рдпрдВрддреНрд░рдХ рдЖрдгрд┐ рдСрдкрд░реЗрдЯрд░рд╕рд╛рдареА рдХрд╛рдо рдЖрд╣реЗ - рдкрд░рдВрддреБ рддреЗ рдСрдЯреЛрдореЗрд╢рдирд╕рд╛рдареА рд╕реБрд╕рдВрдЧрдд рд╡рд╛рддрд╛рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рд╡рд┐рдирд╛рдореВрд▓реНрдп рд╡реЗрдмрд┐рдирд╛рд░рдордзреНрдпреЗ рдХреЛрд░реНрд╕рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдЬрд╛рдгреВрди рдШреНрдпрд╛.

рдкреБрдвреЗ рд╡рд╛рдЪрд╛:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛