Share
Embed
Podとコンテナランタイムのアーキテクチャ
Hosting Casual Talk #5 @さくらインターネット福岡オフィス
2019/03/22
さくらインターネット株式会社
さくらインターネット研究所
松本亮介 / まつもとりー / @matsumotory
MATSUMOTO Ryosuke PRO
March 22, 2019
Transcript
22 slides
-
͘͞ΒΠϯλʔωοτגࣜձࣾ (C) Copyright 1996-2019 SAKURA Internet Inc ͘͞ΒΠϯλʔωοτݚڀॴ PodͱίϯςφϥϯλΠϜͷΞʔΩςΫνϟ 2019/03/25
্ڃݚڀһ দຊ ྄հ Hosting Casual Talk #5 @͘͞ΒΠϯλʔωοτԬΦϑΟε -
2 ɾ͘͞ΒΠϯλʔωοτݚڀॴ ্ڃݚڀһ ɾגࣜձࣾGrooves Forkewll ٕज़ސ ɾϖύϘݚڀॴ ٬һݚڀһ ݚڀސ ɾηΩϡϦςΟɾΩϟϯϓߨࢣ
ɾใॲཧֶձ Πϯλʔωοτͱӡ༻ٕज़ݚڀձ ֤छҕһ ɾژେֶത࢜ʢใֶʣ দຊ྄հ / ·ͭͱΓʔ / @matsumotory -
5 ίϯςφϥϯλΠϜͷϨΠϠʔϞσϧԽ CRI ίϯςφϥϯλΠϜ ϥϯλΠϜ ্هͷΑ͏ʹఆٛ͞ΕΔ͜ͱ͕ଟ͍͕ɺ ίϯςφϥϯλΠϜͷதʹruncͳͲͷ ϥϯλΠϜ͕͋Δͱ͍͏ͷগ͠Θ͔ Γʹ͍͘ɻ CRI
CRIϥϯλΠϜ OCI OCIϥϯλΠϜ ίϯςφϥϯλΠϜ ΛϥϯλΠϜͷׂ ͰϨΠϠʔϞσϧԽ CRIϥϯλΠϜͱOCIϥϯλΠϜͱఆٛ※1ɻ͜ͷ2ͭ ͷϥϯλΠϜΛ·ͱΊͯίϯςφϥϯλΠϜͱ͢Δɻ CRI : Container Runtime Interface OCI: Open Container Initiative Runtime/Image Format Specification ※1 Google CloudͷIan LewisࢯCRIϥϯλΠϜΛHigh-Level RuntimeɺOCIϥϯλΠϜΛLow-Level Runtimesͱఆٛ https://www.ianlewis.org/en/container-runtimes-part-1-introduction-container-r -
6 ίϯςφपลͷجຊϨΠϠʔϞσϧ ΦʔέετϨʔγϣϯ CRI CRIϥϯλΠϜ OCI OCIϥϯλΠϜ Podͱίϯςφ܈ ίϯςφͷߏใΠϝʔδͳͲ͔Β ίϯςφͷϦιʔεׂݖݶΛߦͬ
ͯίϯςφΛىಈͤ͞ΔOCIϥϯλΠϜ ʢrunCɺrunscɺrunncɺrunVɺkata- runtimeɺcc-runtimeͳͲʣ CRIܦ༝ͰΦʔέετϨʔγϣϯʹجͮ ͖ίϯςφߏใΛड͚औͬͨΓɼ PodίϯςφΠϝʔδΛཧ͢ΔCRI ϥϯλΠϜʢcri-oɺcontainerdͳͲʣ -
7 ྫɿίϯςφपลͷجຊϨΠϠʔϞσϧ kubelet CRI containerd OCI runC Podͱίϯςφ܈ ίϯςφͷߏใΠϝʔδͳͲ͔Β ίϯςφͷϦιʔεׂݖݶΛߦͬ
ͯίϯςφΛىಈͤ͞ΔOCIϥϯλΠϜ ʢrunCɺrunscɺrunncɺrunVɺkata- runtimeɺcc-runtimeͳͲʣ CRIͱOCIʹ४ڌ͍ͯ͠Εɺ ΦʔέετϨʔγϣϯ kubernetesΛ͍ͭͭɺ͖ʹ CRIϥϯλΠϜOCIϥϯλΠϜ Λஔ͖͑Մೳ CRIܦ༝ͰΦʔέετϨʔγϣϯʹجͮ ͖ίϯςφߏใΛड͚औͬͨΓɼ PodίϯςφΠϝʔδΛཧ͢ΔCRI ϥϯλΠϜʢcri-oɺcontainerdͳͲʣ -
9 Podͱίϯςφ • kubernetesΦʔέετϨʔγϣϯπʔϧͱͯ͠CNCFʹΑΔඪ४Խ͕ਐΉ • ૬ޓʹଓੑͷ͋ΔෳͷίϯςφΛแׅ͢ΔPod • cgroup()unshare()ͰαϯυϘοΫεͰ͋ΔPodΛ࡞Δ • ίʔυ্PodSandboxͱ໋໊͞Ε͍ͯΔ͜ͱ͕΄ͱΜͲ
• PodʹٻΊΒΕΔཁ݅ • ηΩϡϦςΟɾੑೳɾαʔόͷऩ༰ޮɾӡ༻ٕज़ͳͲ • Podͷॏཁੑ͕ඇৗʹߴ͘ͳ͖͍ͬͯͯΔ -
10 PodͷॏཁੑͱPodͷ͕ߴ·Δ • Pod࣍ୈͰηΩϡϦςΟੑೳɼऩ༰ޮɼӡ༻ٕज़͕େ͖͘ӨڹΛड͚Δ • ֤ࣾPodʹؔ࿈͢Δ༷ʑͳιϑτΣΞΛ࣮ɾެ։࢝͠Ί͍ͯΔ • GoogleͷgVisor (ϢʔβϥϯυͰͷΞΫηε੍ޚͰίϯςφΛִ) •
Nable-Containers (ϢʔβϥϯυͷϢχΧʔωϧͰίϯςφΛִ) • AWSͷFirecracker (MicroVMͰίϯςφΛִ) • Kata-Containers (VMͰίϯςφΛִ) -
11 PodͱCRI / OCIϥϯλΠϜͷجຊ • PodجຊతʹCRIϥϯλΠϜʹΑͬͯ࡞ΒΕΔ • Podʹؔ͢ΔAPIͷ༷CRI༷ʹॻ͔Ε͍ͯΔ • https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/
apis/cri/runtime/v1alpha2/api.proto • CRIϥϯλΠϜ͕ `crictl runp` ͳͲʹΑͬͯPodΛ࡞ • CRI SpeccontainerdͷGoͷίʔυతʹ `RunPodSandbox()` • Pod࡞ޙʹPodྖҬͰOCIϥϯλΠϜ (runc) ͰίϯςφΛىಈ -
12 PodͱOCIϥϯλΠϜ • ͦͦOCI SpecʹPodͷݴٴແ͍ • https://www.opencontainers.org/release-notices/v1-0-0 • OCI SpecίϯςφىಈʹඞཁͳύϥϝʔλhandlerͷఆٛͳͲ
• runtime-specͱimage-spec • Podͱίϯςφີʹ͕ؔ͋Δ • PodͷৼΔ͍Λม͍͑ͨͱ͖ʹCRIϥϯλΠϜʹՃ࣮͖͢ʁ -
13 containerdͷRunPodSandboxΛݟΔ • CRIϥϯλΠϜͷදతͳ࣮Ͱ͋Δcontainerd • RunPodSandbox()ͷதͰgetSandboxRuntime()ʹΑͬͯݸผ࣮Λݺͼग़͢ • ݸผ࣮Ͱ͋ΔRuntime HandlerOCIϥϯλΠϜ͔Βݺͼग़͍ͯ͠Δ •
`ociRuntime, err := c.getSandboxRuntime(config, r.GetRuntimeHandler())` -
14 containerdͷRunPodSandboxΛݟΔ • getSandboxRuntime()ͷதͰworkloadΛνΣοΫͯ͠ϥϯλΠϜΛݺͼग़͢ if untrustedWorkload(config) { if runtimeHandler !=
"" && runtimeHandler != criconfig.RuntimeUntrusted { return criconfig.Runtime{}, errors.New("untrusted workload with explicit runtime handler is not allowed") } if hostAccessingSandbox(config) { return criconfig.Runtime{}, errors.New("untrusted workload with host access is not allowed") } if c.config.ContainerdConfig.UntrustedWorkloadRuntime.Type != "" { return c.config.ContainerdConfig.UntrustedWorkloadRuntime, nil } runtimeHandler = criconfig.RuntimeUntrusted } -
15 OCIϥϯλΠϜʹPodΛόΠόε͢Δఆٛ༗Γ • PodͷॲཧΛόΠόε͢ΔͨΊͷ `untrusted-workload` ઃఆ • CRIϥϯλΠϜʹPod࣮Λ࠶࣮͢ΔͷͰͳ͘OCIͷ࣮Λ͏ • `untrusted-workload`
ʹΑͬͯPodͷॲཧΛOCIϥϯλΠϜόΠύε • dockerOCIϥϯλΠϜ୯ମͰ͏ͱ͖sandboxػೳΛఏڙͰ͖ΔΑ͏ʹ apiVersion: v1 kind: Pod metadata: name: container-untrusted annotations: io.kubernetes.cri.untrusted-workload: "true" -
16 OCIϥϯλΠϜଆͰPodͷॲཧΛ࣮͢Δ • ྫ͑gVisorϢʔβʔϥϯυΧʔωϧΛPodͱͯ͠࡞͢Δ • `crictl runp --runtime=runsc pod-config.json` •
gVisorͷOCIϥϯλΠϜͰ͋ΔrunscʹPodͷॲཧΛόΠύε • gvisor-containerd-shimΛͬͯcontainerdͷruntime handlerʹϑοΫ • runscଆͰPodͷॲཧΛड͚ͯPod૬ͷsandboxΛ࡞͢Δ • `createSandboxProcess()` in `gvisor/runsc/sandbox/sandbox.go` -
17 containerdͷόʔδϣϯͰ֦ுํ๏ͷ͕ࠩ͋Δ 1. containerd v1.1Ҏ߱ͷUntrusted Workload CRI extentiondeprecated 2. containerd
v1.2Ҏ্ͰCRI Runtime handlerͰOCIʹόΠύε • https://github.com/google/gvisor-containerd-shim/blob/master/docs/runtime-handler-quickstart.md 3. containerd v1.2Ҏ্Ͱshim v2ΛͬͨCRI Runtime handlerͰόΠύε • https://github.com/google/gvisor-containerd-shim/blob/master/docs/runtime-handler-shim-v2-quickstart.md • Runtime v2 • https://github.com/containerd/containerd/tree/master/runtime/v2 • containerd-shim-runsc-v1Λͬͯઃఆγϯϓϧʹ -
18 Kata-Containersͷ߹ಉ༷ • Pod (ίʔυ্CreateSandbox())ͷཧΛCRIϥϯλΠϜ͔ΒόΠύε • CRIϥϯλΠϜͷcri-o͔Βkata-runtimeͰPodͷཧड͚औΔ • CRI →
RunPodSandbox() → cri-o →create αϒίϚϯυ → kata-runtime → CreateSandbox() → virtcontainers → VM৭ʑઃఆ → hypervisor → proxyىಈ → shim-podىಈ → VMagentىಈ → kata-runtime → Podىಈ ྃ → cri-oʹྃ௨ • https://github.com/kata-containers/runtime/blob/master/cli/create.go#L89 -
19 Docker͔Βͷίϯςφىಈͷ߹ • DockerίϚϯυͰ࣮ߦ͢Δ߹VMΛىಈ͔ͤͯ͞ΒίϯςφΛىಈ • OCIϥϯλΠϜʹ͓͚Δ `Create` ίϚϯυͰVMͱίϯςφΛ྆ํىಈ • CreateSandbox()
͔ͯ͠ΒίϯςφΛىಈ • OCI Specʹ͋Δcontainerىಈ࣌ͷ֤छϑοΫͰॲཧΛ͞ΜͰVMىಈ • ۩ମతʹ `pre-start` ϑοΫͰVMͷىಈʹඞཁͳॲཧΛߦ͏ -
22 PodͱίϯςφϥϯλΠϜͷΞʔΩςΫνϟ • k8s͓ΑͼcontainerdͷCRIϥϯλΠϜ͕PodΛίϯτϩʔϧ • untrustedͳworkloadʹ͓͍ͯPodͷཧΛOCIϥϯλΠϜʹόΠύε • `crictl runp`ΛOCIϥϯλΠϜʹόΠύεͯ͠OCIϥϯλΠϜ্ͷ `CreateSandbox()`
`StartSandbox()` ͳͲͰPodΛ࡞ɾىಈ • Podͷ༷OCI Specʹࡌ͍ͬͯͳ͍͕Ͳͷ࣮OCIϥϯλΠϜͰ࣮ݱ • gVisorɼKata-ContainersɼFirecrackerɼNable-ContainersͳͲ • Pod͚ͩͰͳ͘sandboxͱͯ͠ͷػೳΛOCI୯ମͰఏڙ͢ΔͨΊͱஅ