рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕ред : рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ - рдПрд░рдХрд╛рди рдПрд░реЛрд▓, рдПрд╕рдПрдкреА рдХреЗ рдПрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ - kubectl exec
рдЯреАрдо рдХреЗ рдХрд╛рдордХрд╛рдЬ рддрдВрддреНрд░ рдХреЗ рдЕрдкрдиреЗ рдЕрдзреНрдпрдпрди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рд╡рд╣ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реНрд░реЛрдд рдХреЛрдб (рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ) рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рде рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╖рдп рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЧрд╣рд░рд╛ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рд╢реБрдХреНрд░рд╡рд╛рд░, рдПрдХ рд╕рд╣рдХрд░реНрдореА рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдФрд░ рдкреВрдЫрд╛ рдХрд┐
рдХреНрд▓рд╛рдЗрдВрдЯ-рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЙрдб рдореЗрдВ рдХрдорд╛рдВрдб рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдореИрдВ рдЙрд╕реЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд╕рдХрд╛ рдФрд░ рдЕрдЪрд╛рдирдХ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ
kubectl exec
рдХреЗ рдХрд╛рдо рдХреЗ рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рд╣рд╛рдВ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдереЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдмреНрд▓реЙрдЧ, рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реА рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦреАрдВ, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреА рдЦреЛрдЬреЛрдВ рдФрд░ рд╕рдордЭ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ
рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рдореИрдХрдмреБрдХ рдкрд░ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
ecomm-рдПрдХреАрдХрд░рдг-рдмреИрд▓реЗрд░реАрдирд╛ / рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ ред рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреНрдпреВрдмрд▓реЗрдЯ рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлреЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдиреЗ
kubectl exec
рдХреЛ
kubectl exec
рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдереАред рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
- рдХреЛрдИ рднреА рдХрд╛рд░ = рдореЗрд░реА рдореИрдХрдмреБрдХ
- рдорд╛рд╕реНрдЯрд░ рдЖрдИрдкреА = 192.168.205.10
- рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдЬрдмрд╛рди рдЖрдИрдкреА = 192.168.205.11
- рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ = 6443
рдШрдЯрдХреЛрдВ

- kubectl рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ : рдЬрдм рд╣рдо "kubectl рдирд┐рд╖реНрдкрд╛рджрд┐рдд ..." рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЖрдк K8s API рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдорд╢реАрди рдкрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕ред: рдЖрдЧреЗ рдХрдВрд╕реЛрд▓ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ, рд▓реЗрдЦрдХ рдЯрд┐рдкреНрдкрдгреА "рдХрд┐рд╕реА рднреА рдорд╢реАрди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╛рдж рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдРрд╕реА рдХрд┐рд╕реА рднреА рдорд╢реАрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ : рдорд╛рд╕реНрдЯрд░ рдкрд░ рдПрдХ рдШрдЯрдХ рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдорд╛рди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдкрдЯрд▓ рд╣реИред
- рдХреНрдпреВрдмрд▓реЗрдЯ : рдПрдХ рдПрдЬреЗрдВрдЯ рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рдлрд▓реА рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо ( рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо ): рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ред рдЙрджрд╛рд╣рд░рдг: рдбреЙрдХрд░, CRI-O, рдХрдВрдЯреЗрдирдб ...
- рдХрд░реНрдиреЗрд▓ : рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛рдо рдиреЛрдб рдкрд░; рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред
- рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ : рдПрдХ рдХрдВрдЯреЗрдирд░ рдЬреЛ рдПрдХ рдлрд▓реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХрд╛рдо рдиреЛрдб рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЦреЛрдЬрд╛
1. рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдЧрддрд┐рд╡рд┐рдзрд┐
default
рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдкреЙрдб рдмрдирд╛рдПрдВ:
// any machine $ kubectl run exec-test-nginx --image=nginx
рдлрд┐рд░ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 5000 рд╕реЗрдХрдВрдб рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ:
// any machine $ kubectl exec -it exec-test-nginx-6558988d5-fgxgg -- sh
рдХреБрдмреНрдЬреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ pid = 8507 рдХреЗ рд╕рд╛рде):
// any machine $ ps -ef |grep kubectl 501 8507 8409 0 7:19PM ttys000 0:00.13 kubectl exec -it exec-test-nginx-6558988d5-fgxgg -- sh
рдпрджрд┐ рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдиреЗрдЯрд╡рд░реНрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдкреА-рд╕рд░реНрд╡рд░ (192.168.205.10.6443) рдХреЗ рдХрдиреЗрдХреНрд╢рди рд╣реИрдВ:
// any machine $ netstat -atnv |grep 8507 tcp4 0 0 192.168.205.1.51673 192.168.205.10.6443 ESTABLISHED 131072 131768 8507 0 0x0102 0x00000020 tcp4 0 0 192.168.205.1.51672 192.168.205.10.6443 ESTABLISHED 131072 131768 8507 0 0x0102 0x00000028
рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред Kubectl рдирд┐рд╖реНрдкрд╛рджрдХ рд╕рдм-рд╕реЛрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ POST рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ REST рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ:
req := restClient.Post(). Resource("pods"). Name(pod.Name). Namespace(pod.Namespace). SubResource("exec") req.VersionedParams(&corev1.PodExecOptions{ Container: containerName, Command: p.Command, Stdin: p.Stdin, Stdout: p.Out != nil, Stderr: p.ErrOut != nil, TTY: t.Raw, }, scheme.ParameterCodec) return p.Executor.Execute("POST", req.URL(), p.Config, p.In, p.Out, p.ErrOut, t.Raw, sizeQueue)
( kubectl / pkg / cmd / рдирд┐рд╖реНрдкрд╛рджрд┐рдд / рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ )
2. рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рдХреЗ рдХрд┐рдирд╛рд░реЗ рдЧрддрд┐рд╡рд┐рдзрд┐
рд╣рдо рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рднреА рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
handler.go:143] kube-apiserver: POST "/api/v1/namespaces/default/pods/exec-test-nginx-6558988d5-fgxgg/exec" satisfied by gorestful with webservice /api/v1 upgradeaware.go:261] Connecting to backend proxy (intercepting redirects) https://192.168.205.11:10250/exec/default/exec-test-nginx-6558988d5-fgxgg/exec-test-nginx?command=sh&input=1&output=1&tty=1 Headers: map[Connection:[Upgrade] Content-Length:[0] Upgrade:[SPDY/3.1] User-Agent:[kubectl/v1.12.10 (darwin/amd64) kubernetes/e3c1340] X-Forwarded-For:[192.168.205.1] X-Stream-Protocol-Version:[v4.channel.k8s.io v3.channel.k8s.io v2.channel.k8s.io channel.k8s.io]]
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреБрд░реЛрдз рд╢рд╛рдорд┐рд▓ рд╣реИред SPDY рдЖрдкрдХреЛ рдПрдХрд▓ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрдЯрдб / stdout / stderr / spdy-error рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредAPI рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
PodExecOptions
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:
( pkg / рдПрдкрд┐рд╕ / рдХреЛрд░ / type.go )рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рдХреЛ рдпрд╣ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕ рдкреЙрдб рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╣реИ:
( pkg / рд░рдЬрд┐рд╕реНрдЯреНрд░реА / рдХреЛрд░ / рдкреЙрдб / strategy.go )рдмреЗрд╢рдХ, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдбреЗрдЯрд╛ рд╣реЛрд╕реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
nodeName := types.NodeName(pod.Spec.NodeName) if len(nodeName) == 0 {
( pkg / рд░рдЬрд┐рд╕реНрдЯреНрд░реА / рдХреЛрд░ / рдкреЙрдб / strategy.go )рд╣реБрд░реНрд░реЗ! рдЕрдм рдХреНрдпреВрдмрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдкреЛрд░реНрдЯ (
node.Status.DaemonEndpoints.KubeletEndpoint.Port
) рд╣реИ, рдЬрд┐рд╕рд╕реЗ API рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
( pkg / kubelet / рдЧреНрд░рд╛рд╣рдХ / kubelet_client.go )рдорд╛рд╕реНрдЯрд░-рдиреЛрдб рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ > рдорд╛рд╕реНрдЯрд░ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░> рдПрдкреНрд╕реЗрд╡рд░ рд╕реЗ рдХреНрдпреВрдмрд▓реЗрдЯ :
рдпреЗ рдХрдиреЗрдХреНрд╢рди рдХреНрдпреВрдмрд▓реЗрдЯ рдХреЗ HTTPS рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░ рдмрдВрдж рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдкрд┐рд╕реНрд╡рд░, рдХреНрдпреВрдмрд▓реЗрдЯ рдХреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдХреЛ "рдордзреНрдпрд╕реНрде рд╣рдорд▓реЛрдВ" (MITMs) рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ / рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
рдЕрдм API рд╕рд░реНрд╡рд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ:
( pkg / рд░рдЬрд┐рд╕реНрдЯреНрд░реА / рдХреЛрд░ / рдкреЙрдб / рд░реЗрд╕реНрдЯ / рд╕рдм-рд╕реЛрд░реНрд╕.go )рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдиреЛрдб рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ 192.168.205.11 рд╣реИ:
// any machine $ kubectl get nodes k8s-node-1 -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-node-1 Ready <none> 9h v1.15.3 192.168.205.11 <none> Ubuntu 16.04.6 LTS 4.4.0-159-generic docker://17.3.3
рдлрд┐рд░ рдХреНрдпреВрдмрд▓реЗрдЯ рдкреЛрд░реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 10250):
// any machine $ kubectl get nodes k8s-node-1 -o jsonpath='{.status.daemonEndpoints.kubeletEndpoint}' map[Port:10250]
рдЕрдм рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдиреЛрдб (192.168.205.11) рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рд╣реИ? рдпрд╣ рд╡рд╣рд╛рдБ рд╣реИ! рдпрджрд┐ рдЖрдк
exec
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
// master node $ netstat -atn |grep 192.168.205.11 tcp 0 0 192.168.205.10:37870 192.168.205.11:10250 ESTABLISHED тАж

Kubectl рдФрд░ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрдпреВрдмрд▓реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╣реИред
3. рдХрд╛рд░реНрдп рдиреЛрдб рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐
рдЕрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рднреА рд╕реНрдерд╛рдкрд┐рдд рд╣реИ (рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐); 192.168.205.10 рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рдХрд╛ рдЖрдИрдкреА рд╣реИ:
// worker node $ netstat -atn |grep 10250 tcp6 0 0 :::10250 :::* LISTEN tcp6 0 0 192.168.205.11:10250 192.168.205.10:37870 ESTABLISHED
рд╣рдорд╛рд░реА
sleep
рдЯреАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╣реБрд░реНрд░реЗ, рд╡рд╣ рднреА рдореМрдЬреВрдж рд╣реИ!
// worker node $ ps -afx ... 31463 ? Sl 0:00 \_ docker-containerd-shim 7d974065bbb3107074ce31c51f5ef40aea8dcd535ae11a7b8f2dd180b8ed583a /var/run/docker/libcontainerd/7d974065bbb3107074ce31c51 31478 pts/0 Ss 0:00 \_ sh 31485 pts/0 S+ 0:00 \_ sleep 5000 тАж
рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП: рдХреНрдпреВрдмрд▓реЗрдЯ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреНрд░реИрдВрдХ рдХрд┐рдпрд╛? рдХреНрдпреВрдмрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдбреЗрдореЙрди рд╣реИ рдЬреЛ рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
( pkg / kubelet / рд╕рд░реНрд╡рд░ / рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ / server.go )Kubelet рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:
func (s *server) GetExec(req *runtimeapi.ExecRequest) (*runtimeapi.ExecResponse, error) { if err := validateExecRequest(req); err != nil { return nil, err } token, err := s.cache.Insert(req) if err != nil { return nil, err } return &runtimeapi.ExecResponse{ Url: s.buildURL("exec", token), }, nil }
( pkg / kubelet / рд╕рд░реНрд╡рд░ / рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ / server.go )рднреНрд░рдорд┐рдд рдордд рдХрд░реЛред рдпрд╣ рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ:
type ExecResponse struct {
( cri-api / pkg / apis / runtime / v1alpha2 / api.pb.go )рдХреНрдпреВрдмрд▓реЗрдЯ
RuntimeServiceClient
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ
(рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджред) :
Cri-api рд╕реЗ kubernetes / kubernetes рддрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдпрд╣ рд╕рд┐рд░реНрдл рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
type runtimeServiceClient struct { cc *grpc.ClientConn }
( cri-api / pkg / apis / runtime / v1alpha2 / api.pb.go ) func (c *runtimeServiceClient) Exec(ctx context.Context, in *ExecRequest, opts ...grpc.CallOption) (*ExecResponse, error) { out := new(ExecResponse) err := c.cc.Invoke(ctx, "/runtime.v1alpha2.RuntimeService/Exec", in, out, opts...) if err != nil { return nil, err } return out, nil }
( cri-api / pkg / apis / runtime / v1alpha2 / api.pb.go )рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо
RuntimeServiceServer
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
Cri-api рд╕реЗ kubernetes / kubernetes рддрдХ рд▓рдВрдмреА рд╕реВрдЪреА 
рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╣рдореЗрдВ рдХреНрдпреВрдмрд▓реЗрдЯ рдФрд░ рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред
рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдПрдЧреНрдЬреАрдХреНрдпреВрдЯ рдХрдорд╛рдВрдб рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЕрдВрддрд░ рджреЗрдЦреЗрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрдВрддрд░ рд╣реИ:
// worker node $ ss -a -p |grep kubelet ... u_str ESTAB 0 0 * 157937 * 157387 users:(("kubelet",pid=5714,fd=33)) ...
рд╣рдореНрдо ... рдХреНрдпреВрдмрд▓реЗрдЯ (рдкреАрдЖрдИрдбреА тАЛтАЛ= 5714) рдФрд░ рдХреБрдЫ рдЕрдЬреНрдЮрд╛рдд рдХреЗ рдмреАрдЪ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рдиред рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ, рдпрд╣ рдбреЙрдХрд░ (рдкреГрд╖реНрда 1186) рд╣реИ!
// worker node $ ss -a -p |grep 157387 ... u_str ESTAB 0 0 * 157937 * 157387 users:(("kubelet",pid=5714,fd=33)) u_str ESTAB 0 0 /var/run/docker.sock 157387 * 157937 users:(("dockerd",pid=1186,fd=14)) ...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдпрд╣ рдПрдХ рдбреЙрдХ рдбреЗрдореЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ (pid = 1186) рдЬреЛ рд╣рдорд╛рд░реА рдЖрдЬреНрдЮрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИ:
// worker node $ ps -afx ... 1186 ? Ssl 0:55 /usr/bin/dockerd -H fd:// 17784 ? Sl 0:00 \_ docker-containerd-shim 53a0a08547b2f95986402d7f3b3e78702516244df049ba6c5aa012e81264aa3c /var/run/docker/libcontainerd/53a0a08547b2f95986402d7f3 17801 pts/2 Ss 0:00 \_ sh 17827 pts/2 S+ 0:00 \_ sleep 5000 ...
4. рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐
рдЖрдЗрдП CRI-O рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдбреЙрдХрд░ рдореЗрдВ, рддрд░реНрдХ рд╕рдорд╛рди рд╣реИред
RuntimeServiceServer
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ:
( cri-o / server / server.go )
( cri-o / erver / container_exec.go )рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░реНрдп рдиреЛрдб рдкрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ:
( cri-o / internal / oci / runtime_oci.go )
рдЕрдВрдд рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЕрдиреБрд╕реНрдорд╛рд░рдХ
- рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рднреА рдХреНрдпреВрдмрд▓реЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдирд┐рд╖реНрдкрд╛рджрди рд╕рддреНрд░ рдХреЗ рдЕрдВрдд рддрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдП рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ:
- kubectl рдФрд░ api-server рдХреЗ рдмреАрдЪ;
- рдПрдкрд┐-рд╕рд░реНрд╡рд░ рдФрд░ рдХреБрдмреЗрдЯреЗрд▓ рдХреЗ рдмреАрдЪ;
- рдХреНрдпреВрдмрд▓реЗрдЯ рдФрд░ рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪред
- Kubectl рдпрд╛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдЙрддреНрдкрд╛рджрди рдиреЛрдбреНрд╕ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпреВрдмрд▓реЗрдЯ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдВрдЯреЗрдирд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рднреА рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рдзрди
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреА.рдПрд╕.
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рднреА рдкрдврд╝реЗрдВ: