hollow_kubelet.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. Copyright 2015 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package kubemark
  14. import (
  15. "time"
  16. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  17. clientset "k8s.io/client-go/kubernetes"
  18. kubeletapp "k8s.io/kubernetes/cmd/kubelet/app"
  19. "k8s.io/kubernetes/cmd/kubelet/app/options"
  20. "k8s.io/kubernetes/pkg/kubelet"
  21. kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
  22. "k8s.io/kubernetes/pkg/kubelet/cadvisor"
  23. "k8s.io/kubernetes/pkg/kubelet/cm"
  24. containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
  25. "k8s.io/kubernetes/pkg/kubelet/dockershim"
  26. kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
  27. "k8s.io/kubernetes/pkg/util/mount"
  28. "k8s.io/kubernetes/pkg/util/oom"
  29. "k8s.io/kubernetes/pkg/volume/emptydir"
  30. "k8s.io/kubernetes/pkg/volume/projected"
  31. "k8s.io/kubernetes/pkg/volume/secret"
  32. "k8s.io/kubernetes/pkg/volume/util/subpath"
  33. "k8s.io/kubernetes/test/utils"
  34. "k8s.io/klog"
  35. )
  36. type HollowKubelet struct {
  37. KubeletFlags *options.KubeletFlags
  38. KubeletConfiguration *kubeletconfig.KubeletConfiguration
  39. KubeletDeps *kubelet.Dependencies
  40. }
  41. func NewHollowKubelet(
  42. nodeName string,
  43. client *clientset.Clientset,
  44. cadvisorInterface cadvisor.Interface,
  45. dockerClientConfig *dockershim.ClientConfig,
  46. kubeletPort, kubeletReadOnlyPort int,
  47. containerManager cm.ContainerManager,
  48. maxPods int, podsPerCore int,
  49. ) *HollowKubelet {
  50. // -----------------
  51. // Static config
  52. // -----------------
  53. f, c := GetHollowKubeletConfig(nodeName, kubeletPort, kubeletReadOnlyPort, maxPods, podsPerCore)
  54. // -----------------
  55. // Injected objects
  56. // -----------------
  57. volumePlugins := emptydir.ProbeVolumePlugins()
  58. volumePlugins = append(volumePlugins, secret.ProbeVolumePlugins()...)
  59. volumePlugins = append(volumePlugins, projected.ProbeVolumePlugins()...)
  60. d := &kubelet.Dependencies{
  61. KubeClient: client,
  62. HeartbeatClient: client,
  63. DockerClientConfig: dockerClientConfig,
  64. CAdvisorInterface: cadvisorInterface,
  65. Cloud: nil,
  66. OSInterface: &containertest.FakeOS{},
  67. ContainerManager: containerManager,
  68. VolumePlugins: volumePlugins,
  69. TLSOptions: nil,
  70. OOMAdjuster: oom.NewFakeOOMAdjuster(),
  71. Mounter: mount.New("" /* default mount path */),
  72. Subpather: &subpath.FakeSubpath{},
  73. }
  74. return &HollowKubelet{
  75. KubeletFlags: f,
  76. KubeletConfiguration: c,
  77. KubeletDeps: d,
  78. }
  79. }
  80. // Starts this HollowKubelet and blocks.
  81. func (hk *HollowKubelet) Run() {
  82. if err := kubeletapp.RunKubelet(&options.KubeletServer{
  83. KubeletFlags: *hk.KubeletFlags,
  84. KubeletConfiguration: *hk.KubeletConfiguration,
  85. }, hk.KubeletDeps, false); err != nil {
  86. klog.Fatalf("Failed to run HollowKubelet: %v. Exiting.", err)
  87. }
  88. select {}
  89. }
  90. // Builds a KubeletConfiguration for the HollowKubelet, ensuring that the
  91. // usual defaults are applied for fields we do not override.
  92. func GetHollowKubeletConfig(
  93. nodeName string,
  94. kubeletPort int,
  95. kubeletReadOnlyPort int,
  96. maxPods int,
  97. podsPerCore int) (*options.KubeletFlags, *kubeletconfig.KubeletConfiguration) {
  98. testRootDir := utils.MakeTempDirOrDie("hollow-kubelet.", "")
  99. podFilePath := utils.MakeTempDirOrDie("static-pods", testRootDir)
  100. klog.Infof("Using %s as root dir for hollow-kubelet", testRootDir)
  101. // Flags struct
  102. f := options.NewKubeletFlags()
  103. f.EnableServer = true
  104. f.RootDirectory = testRootDir
  105. f.HostnameOverride = nodeName
  106. f.MinimumGCAge = metav1.Duration{Duration: 1 * time.Minute}
  107. f.MaxContainerCount = 100
  108. f.MaxPerPodContainerCount = 2
  109. f.RegisterNode = true
  110. f.RegisterSchedulable = true
  111. // Config struct
  112. c, err := options.NewKubeletConfiguration()
  113. if err != nil {
  114. panic(err)
  115. }
  116. c.StaticPodURL = ""
  117. c.Address = "0.0.0.0" /* bind address */
  118. c.Port = int32(kubeletPort)
  119. c.ReadOnlyPort = int32(kubeletReadOnlyPort)
  120. c.StaticPodPath = podFilePath
  121. c.FileCheckFrequency.Duration = 20 * time.Second
  122. c.HTTPCheckFrequency.Duration = 20 * time.Second
  123. c.NodeStatusUpdateFrequency.Duration = 10 * time.Second
  124. c.SyncFrequency.Duration = 10 * time.Second
  125. c.EvictionPressureTransitionPeriod.Duration = 5 * time.Minute
  126. c.MaxPods = int32(maxPods)
  127. c.PodsPerCore = int32(podsPerCore)
  128. c.ClusterDNS = []string{}
  129. c.ImageGCHighThresholdPercent = 90
  130. c.ImageGCLowThresholdPercent = 80
  131. c.VolumeStatsAggPeriod.Duration = time.Minute
  132. c.CgroupRoot = ""
  133. c.CPUCFSQuota = true
  134. c.EnableControllerAttachDetach = false
  135. c.EnableDebuggingHandlers = true
  136. c.CgroupsPerQOS = false
  137. // hairpin-veth is used to allow hairpin packets. Note that this deviates from
  138. // what the "real" kubelet currently does, because there's no way to
  139. // set promiscuous mode on docker0.
  140. c.HairpinMode = kubeletconfig.HairpinVeth
  141. c.MaxOpenFiles = 1024
  142. c.RegistryBurst = 10
  143. c.RegistryPullQPS = 5.0
  144. c.ResolverConfig = kubetypes.ResolvConfDefault
  145. c.KubeletCgroups = "/kubelet"
  146. c.SerializeImagePulls = true
  147. c.SystemCgroups = ""
  148. c.ProtectKernelDefaults = false
  149. return f, c
  150. }