Go(Un)Conference(Goあんこ)LT大会 6kg で発表した資料です https://gounconference.connpass.com/event/129090/
Kubernetes ͷιʔείʔυͱͷ͖߹͍ํ19/05/27 Go(Un)ConferenceʢGo͋Μ͜ʣLTେձ 6kg @ponde_m
View Slide
ࠓ͢͜ͱ• Kubernetes ͷΞʔΩςΫνϟʹ͍ͭͯ• Kubernetes ͷιʔείʔυΛಡΉࡍʹ ʹཱͭGo ͷษڧձ͚ͩͲ Kubernetes ͱͳΜͧ Έ͍ͨͳ͕݁ߏ͋Γ·͢ (Gopher ͘Μ͍ͬͺ͍ग़·͢)
Kubernetes ͱ
Kubernetes ͱ• ίϯςφΛಈ͔ͨ͢ΊͷϓϥοτϑΥʔϜ• ίϯςφΛ͍͍ײ͡ʹӡ༻͢ΔͨΊͷػೳΛ͍ͬͺ͍͍࣋ͬͯΔ• σϓϩΠ, εέʔϦϯά, ࣗݾम෮ etc…k8s ͬͯॻ͔ΕͨΓ͢Δͷ Kubernetes ͕ (k + 8 จࣈ + s) ͔ͩΒ
Kubernetes ͷ ΞʔΩςΫνϟ
• ΞʔΩςΫνϟʹ͍ͭͯཧղ͢Δͱ, ࣗͷಡΈ͍ͨ෦ͷίʔυ͕ Ͳͷίϯϙʔωϯτʹ͋Δͷ͔Θ͔Δ• ͦΕͧΕͷίϯϙʔωϯτͱ ͦͷʹ͍ͭͯཧղ͠Α͏Kubernetes ͷΞʔΩςΫνϟ࣍ͷϖʔδ͔Βͬ͘͟Γͱ ਤΛ༻͍ͯઆ໌͠·͢
Kubernetes ͷΞʔΩςΫνϟMasterNodeNodeAPIAPI
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcd
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcdAPI ServerKubernetes ͷ ϦιʔεΛཧ͢Δ API ServerશͯͷϦιʔεૢ࡞ API Server Λܦ༝ͯ͠ߦ͏
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcdContoroller ManagerAPI Server ͰϦιʔεใͷ CRUD ͙Β͍͔͠ߦͳ͓ͬͯΒͣɺϦιʔεʹର͢Δ࣮ࡍͷॲཧͷத ControllerͱݺΕΔίϯϙʔωϯτ͕ඇಉظͰߦͳ͍ͬͯΔController (goroutine)Controller (goroutine)Controller (goroutine)ىಈ
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcdSchedulerPod (ίϯςφ) ΛϊʔυׂΓͯΔ
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcdϦιʔεͷӬଓԽʹΘΕΔࢄ KVSetcd
Kubernetes ͷΞʔΩςΫνϟAPI Serverkube-proxyPodPodPodInternetkubelet
Kubernetes ͷΞʔΩςΫνϟAPI Serverkubelet kube-proxyPodPodPodInternetkubelet֤ϊʔυͰಈ࡞͢ΔPod Λىಈ, ཧ͢ΔΤʔδΣϯτkubelet
Kubernetes ͷΞʔΩςΫνϟAPI Serverkube-proxyPodPodPodInternetkube-proxykubelet֤ϊʔυͰಈ࡞͢ΔService ͷఆٛΛݩʹϧʔςΟϯάͯ͘͠ΕΔωοτϫʔΫϓϩΩγkube-proxy
Kubernetes ͷΞʔΩςΫνϟAPI Serverkube-proxyPodPodPodInternetPodPodPodkubeletContainer RuntimeDocker Ҏ֎ಈ͘PodPodPod
Kubernetes ͷιʔείʔυʹ͍ͭͯ
Kubernetes ͷιʔείʔυʹ͍ͭͯ• github.com/kubernetes/kubernetes• Go Modules ରԠͯ͠ΔͷͰ go mod ίϚϯυΛ࣮ߦ͢ΔͱϏϧυͰ͖ΔΑ͏ʹͳΔ• ಡΉ࣌ IDE ͰίʔυδϟϯϓΛ͓͏4݄͙Β͍ʹ Go Modules ରԠͨ͠ https://github.com/kubernetes/kubernetes/pull/74877
Kubernetes ͷιʔείʔυʹ͍ͭͯ• ϒϥβ͔Β͏࣌ SourceGraph Λ ೖΕΔͱศར• ϒϥβ͔Β Code Jump Ͱ͖Δ• https://about.sourcegraph.com/
Kubernetes ͷιʔείʔυʹ͍ͭͯ• Kubernetes ͷίϯϙʔωϯτͷ࣮Ͱ github.com/spf13/cobra ͕ΘΕ͍ͯΔ• Server ͱͯ͠ৼΔ͏ͷ cobra Ͱ࣮͞Ε͍ͯΔ• ࣮ߦ࣌ͷ Option ͰύϥϝʔλΛͨ͠ΓͰ͖Δ
main package Ͳ͜ʹ͋Δͷ͔
main package Ͳ͜ʹ͋Δͷ͔• cmd package ͷதΛݟΔͱ֤ίϯϙʔωϯτ͝ͱʹ͞Βʹ package ͕͔Ε͍ͯΔ
github.com/kubernetes/kubernetes/cmd/͖ͬ͞ݟͨΑ͏ͳ໊લ͕ͪΒ΄Β
• main package ͦͷԼʹ͋Δmain package Ͳ͜ʹ͋Δͷ͔
Controller ʹ͍ͭͯ
Kubernetes ͷΞʔΩςΫνϟAPI ServerContoroller ManagerScheduleretcdContoroller ManagerAPI Server ͰϦιʔεใͷ CRUD ͙Β͍͔͠ߦͳ͓ͬͯΒͣɺϦιʔεʹର͢Δ࣮ࡍͷॲཧͷத ControllerͱݺΕΔίϯϙʔωϯτ͕ඇಉظͰߦͳ͍ͬͯΔController (goroutine)Controller (goroutine)Controller (goroutine)ىಈ͓͞Β͍
• Ϧιʔεʹର͢Δ࣮ࡍͷॲཧͷத Controller ͱݺΕΔίϯϙʔωϯτ͕ඇಉظͰߦͳ͍ͬͯΔ• ྫ͑ Deployment ͷಈ͖ͷ࣮͕ݟ͍ͨʂ ͬͯͳͬͨ࣌ʹ API Server ͷίʔυΛಡΈʹߦͬͯ Կॻ͍ͯͳ͍• Controller Λಡ͏Controller ʹ͍ͭͯ͜ͷ͜ͱΛΒͣʹ࠷ॳ API Server ͷίʔυಡΜͰ·ͨ͠
Controller ʹ͍ͭͯContoroller ManagerController (goroutine)Controller (goroutine)Controller (goroutine)ىಈ• ࣮ࡍʹͲΜͳײ͡ͳͷ͔ίʔυͰݟͯΈΔ
͜Μͳײ͡ͷ map Ͱఆٛ͞Ε͍ͯΔhttps://github.com/kubernetes/kubernetes/blob/v1.14.2/cmd/kube-controller-manager/app/controllermanager.go#L341-L384
Controller ͷ໊લͱController Λ࣮ߦ͢ΔͨΊͷؔ
func StartControllers() Ͱ Controller ΛൃՐ(ΊͬͪΌίʔυͬͯΔ)https://github.com/kubernetes/kubernetes/blob/v1.14.2/cmd/kube-controller-manager/app/controllermanager.go#L461-L501
͖ͬ͞ͷ map Λ for Ͱճͯ͜͜͠Ͱ Controller ͷ࣮ߦؔΛݺΜͰΔ
ྫͱͯ͠ Deployment ͷ Controller ͷ࣮ߦؔhttps://github.com/kubernetes/kubernetes/blob/v1.14.2/cmd/kube-controller-manager/app/apps.go#L82-L97
ίϯετϥΫλͰ Controller Λ࡞ͬͯgoroutine Ͱ Controller Λ࣮ߦ
·ͱΊ• Kubernetes ͷΞʔΩςΫνϟ ͓֮͑ͯ͘ͱʹཱͭ• Kubernetes ͷιʔείʔυҙ֎ʹಡΊΔ• Go ಡΈ͍͢ΈΜͳಡ͏
͓·͚
ʹཱͭϦϯΫͱ͔• github.com/jamiehannaford/what-happens-when-k8s• Kubernetes ͕ىಈ͔ͯ͠ΒͲΜͳ͜ͱΛ͍ͯ͠Δ͔ ιʔείʔυϨϕϧͰղઆͯ͘͠ΕΔ• ͳΜͱຊޠ ver ͋Δ• ιʔείʔυͷϦϯΫ͕ݹ͔ͬͨΓ, ϦϯΫΕͩͬͨΓ͢ΔͷͰ PR Λग़ͦ͏! (ग़ͯ͠Δ)
ʹཱͭϦϯΫͱ͔• https://gopherize.me/• Զ͚ͩͷ࠷ߴʹ͔Θ͍͍ Gopher ܅Λ࡞ΕΔαΠτ
͓͠·͍