{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/113523117","pull_request_review_id":34919020,"id":113523117,"diff_hunk":"@@ -0,0 +1,548 @@\n+// A configuration field should go in KubeletFlags instead of KubeletConfiguration if any of these are true:\n+// - its value will never, or cannot safely be changed during the lifetime of a node\n+// - its value cannot be safely shared between nodes at the same time (e.g. a hostname)\n+//   KubeletConfiguration is intended to be shared between nodes\n+// In general, please try to avoid adding flags or configuration fields,\n+// we already have a confusingly large amount of them.\n+type KubeletConfiguration struct {\n+  metav1.TypeMeta `json:\",inline\"`\n+  // TODO(kc-refactor): Recompose this from the structures below.\n+}\n+\n+// These are marked deprecated and shoud be left as flags-only,\n+// and eventually removed per the deprecation policy: https://kubernetes.io/docs/home/deprecation-policy/.\n+type MarkedDeprecated struct {\n+  // The node has babysitter process monitoring docker and kubelet.\n+  BabysitDaemons bool `json:\"babysitDaemons\"`\n+  // minimumGCAge is the minimum age for a finished container before it is\n+  // garbage collected.\n+  MinimumGCAge metav1.Duration `json:\"minimumGCAge\"`\n+  // maxPerPodContainerCount is the maximum number of old instances to\n+  // retain per container. Each container takes up some disk space.\n+  MaxPerPodContainerCount int32 `json:\"maxPerPodContainerCount\"`\n+  // maxContainerCount is the maximum number of old instances of containers\n+  // to retain globally. Each container takes up some disk space.\n+  MaxContainerCount *int32 `json:\"maxContainerCount\"`\n+  // lowDiskSpaceThresholdMB is the absolute free disk space, in MB, to\n+  // maintain. When disk space falls below this threshold, new pods would\n+  // be rejected.\n+  LowDiskSpaceThresholdMB int32 `json:\"lowDiskSpaceThresholdMB\"`\n+  // rktStage1Image is the image to use as stage1. Local paths and\n+  // http/https URLs are supported.\n+  RktStage1Image string `json:\"rktStage1Image\"`\n+  // dockerExecHandlerName is the handler to use when executing a command\n+  // in a container. Valid values are 'native' and 'nsenter'. Defaults to\n+  // 'native'.\n+  DockerExecHandlerName string `json:\"dockerExecHandlerName\"`\n+  // registerSchedulable tells the kubelet to register the node as\n+  // schedulable. Won't have any effect if register-node is false.\n+  // DEPRECATED: use registerWithTaints instead\n+  RegisterSchedulable *bool `json:\"registerSchedulable\"`\n+  // outOfDiskTransitionFrequency is duration for which the kubelet has to\n+  // wait before transitioning out of out-of-disk node condition status.\n+  OutOfDiskTransitionFrequency metav1.Duration `json:\"outOfDiskTransitionFrequency\"`\n+  // Enable Container Runtime Interface (CRI) integration.\n+  // +optional\n+  EnableCRI *bool `json:\"enableCRI,omitempty\"`\n+  // masterServiceNamespace is The namespace from which the kubernetes\n+  // master services should be injected into pods.\n+  MasterServiceNamespace string `json:\"masterServiceNamespace\"` // This isn't marked deprecated yet, but it probably should be. See #44250\n+}\n+\n+// I'm being conservative with elevating flags into the objects that will be available\n+// to dynamic config. We can always eleveate these later if we need to.\n+type ShouldProbablyJustBeFlags struct {\n+  /* Static pod stuff should all just be flags */\n+  // podManifestPath is the path to the directory containing pod manifests to\n+  // run, or the path to a single manifest file\n+  PodManifestPath string `json:\"podManifestPath\"`\n+  // fileCheckFrequency is the duration between checking config files for\n+  // new data\n+  FileCheckFrequency metav1.Duration `json:\"fileCheckFrequency\"`\n+  // httpCheckFrequency is the duration between checking http for new data\n+  HTTPCheckFrequency metav1.Duration `json:\"httpCheckFrequency\"`\n+  // manifestURL is the URL for accessing the container manifest\n+  ManifestURL string `json:\"manifestURL\"`\n+  // manifestURLHeader is the HTTP header to use when accessing the manifest\n+  // URL, with the key separated from the value with a ':', as in 'key:value'\n+  ManifestURLHeader string `json:\"manifestURLHeader\"`\n+\n+  // maxOpenFiles is Number of files that can be opened by Kubelet process.\n+  MaxOpenFiles int64 `json:\"maxOpenFiles\"`\n+\n+  // experimentalMounterPath is the path to mounter binary. If not set, kubelet will attempt to use mount\n+  // binary that is available via $PATH,\n+  ExperimentalMounterPath string `json:\"experimentalMounterPath,omitempty\"`\n+\n+  // containerized should be set to true if kubelet is running in a container.\n+  Containerized *bool `json:\"containerized\"`\n+  // lockFilePath is the path that kubelet will use to as a lock file.\n+  // It uses this file as a lock to synchronize with other kubelet processes\n+  // that may be running.\n+  LockFilePath *string `json:\"lockFilePath\"`\n+  // ExitOnLockContention is a flag that signifies to the kubelet that it is running\n+  // in \"bootstrap\" mode. This requires that 'LockFilePath' has been set.\n+  // This will cause the kubelet to listen to inotify events on the lock file,\n+  // releasing it and exiting when another process tries to open that file.\n+  ExitOnLockContention bool `json:\"exitOnLockContention\"`\n+\n+  // rootDirectory is the directory path to place kubelet files (volume\n+  // mounts,etc).\n+  RootDirectory string `json:\"rootDirectory\"`\n+\n+  // containerRuntime is the container runtime to use.\n+  ContainerRuntime string `json:\"containerRuntime\"`\n+  // remoteRuntimeEndpoint is the endpoint of remote runtime service\n+  RemoteRuntimeEndpoint string `json:\"remoteRuntimeEndpoint\"`\n+  // remoteImageEndpoint is the endpoint of remote image service\n+  RemoteImageEndpoint string `json:\"remoteImageEndpoint\"`\n+  // runtimeRequestTimeout is the timeout for all runtime requests except long running\n+  // requests - pull, logs, exec and attach.\n+  RuntimeRequestTimeout metav1.Duration `json:\"runtimeRequestTimeout\"`\n+}\n+\n+/* BEGIN RUNTIME REMOVAL */\n+\n+// I believe the plan is to remove ALL of these from the Kubelet/Node configuration\n+// e.g. they become flags-only for now and are immediately marked deprecated, for later removal.\n+\n+// Note: The WIP PR for making these flags-only is #44061\n+\n+type RuntimeOptions struct {\n+  // networkPluginName is the name of the network plugin to be invoked for\n+  // various events in kubelet/pod lifecycle\n+  NetworkPluginName string `json:\"networkPluginName\"`\n+  // networkPluginDir is the full path of the directory in which to search\n+  // for network plugins (and, for backwards-compat, CNI config files)\n+  NetworkPluginDir string `json:\"networkPluginDir\"`\n+  // networkPluginMTU is the MTU to be passed to the network plugin,\n+  // and overrides the default MTU for cases where it cannot be automatically\n+  // computed (such as IPSEC).\n+  NetworkPluginMTU int32 `json:\"networkPluginMTU\"`\n+  // CNIConfDir is the full path of the directory in which to seardch for\n+  // CNI config files\n+  CNIConfDir string `json:\"cniConfDir\"`\n+  // CNIBinDir is the full path of the directory in which to search for\n+  // CNI plugin binaries\n+  CNIBinDir string `json:\"cniBinDir\"`\n+  // podInfraContainerImage is the image whose network/ipc namespaces\n+  // containers in each pod will use.\n+  PodInfraContainerImage string `json:\"podInfraContainerImage\"`\n+}\n+\n+type DockerOptions struct {\n+  // dockerEndpoint is the path to the docker endpoint to communicate with.\n+  DockerEndpoint string `json:\"dockerEndpoint\"`\n+  // enable gathering custom metrics.\n+  EnableCustomMetrics bool `json:\"enableCustomMetrics\"` // for Docker\n+}\n+\n+type RktOptions struct {\n+  // rktPath is the  path of rkt binary. Leave empty to use the first rkt in\n+  // $PATH.\n+  RktPath string `json:\"rktPath\"`\n+  // rktApiEndpoint is the endpoint of the rkt API service to communicate with.\n+  RktAPIEndpoint string `json:\"rktAPIEndpoint\"`\n+}\n+\n+/* END RUNTIME REMOVAL */\n+\n+type NodeRegistrationConfig struct {\n+    // registerNode enables automatic registration with the apiserver.\n+  RegisterNode *bool `json:\"registerNode\"`\n+  // registerWithTaints are an array of taints to add to a node object when\n+  // the kubelet registers itself. This only takes effect when registerNode\n+  // is true and upon the initial registration of the node.\n+  RegisterWithTaints []v1.Taint `json:\"registerWithTaints\"`\n+  // nodeLabels to add when registering the node in the cluster.\n+  NodeLabels map[string]string `json:\"nodeLabels\"`\n+\n+}\n+\n+type NodeStatusConfig struct {\n+  // nodeStatusUpdateFrequency is the frequency that kubelet posts node\n+  // status to master. Note: be cautious when changing the constant, it\n+  // must work with nodeMonitorGracePeriod in nodecontroller.\n+  NodeStatusUpdateFrequency metav1.Duration `json:\"nodeStatusUpdateFrequency\"`\n+}\n+\n+type ClusterDNSConfig struct {\n+  // clusterDNS is a list of IP address for the cluster DNS server.  If set,\n+  // kubelet will configure all containers to use this for DNS resolution\n+  // instead of the host's DNS servers\n+  ClusterDNS []string `json:\"clusterDNS\"`\n+  // clusterDomain is the DNS domain for this cluster. If set, kubelet will\n+  // configure all containers to search this domain in addition to the\n+  // host's search domains.\n+  ClusterDomain string `json:\"clusterDomain\"`\n+}\n+\n+type KubeAPIConfig struct {\n+  /* requests to API server */\n+  // contentType is contentType of requests sent to apiserver.\n+  ContentType string `json:\"contentType\"`\n+  // kubeAPIQPS is the QPS to use while talking with kubernetes apiserver\n+  KubeAPIQPS *int32 `json:\"kubeAPIQPS\"`\n+  // kubeAPIBurst is the burst to allow while talking with kubernetes\n+  // apiserver\n+  KubeAPIBurst int32 `json:\"kubeAPIBurst\"`\n+  // syncFrequency is the max period between synchronizing running\n+  // containers and config\n+  SyncFrequency metav1.Duration `json:\"syncFrequency\"` // TODO(kc-refactor): This feels right here but take another look later.\n+}\n+\n+type FeatureGates struct {\n+  // featureGates is a string of comma-separated key=value pairs that describe feature\n+  // gates for alpha/experimental features.\n+  FeatureGates string `json:\"featureGates,omitempty\"`\n+}\n+\n+// Management of Node resources\n+type NodeResourcesConfig struct {\n+  // oomScoreAdj is The oom-score-adj value for kubelet process. Values\n+  // must be within the range [-1000, 1000].\n+  OOMScoreAdj *int32 `json:\"oomScoreAdj\"`\n+  // A set of ResourceName=Percentage (e.g. memory=50%) pairs that describe\n+  // how pod resource requests are reserved at the QoS level.\n+  // Currently only memory is supported. [default=none]\"\n+  ExperimentalQOSReserved map[string]string `json:\"experimentalQOSReserved\"`\n+  // maxPods is the number of pods that can run on this Kubelet.\n+  MaxPods int32 `json:\"maxPods\"`\n+  // Maximum number of pods per core. Cannot exceed MaxPods\n+  PodsPerCore int32 `json:\"podsPerCore\"`\n+  // cpuCFSQuota is Enable CPU CFS quota enforcement for containers that\n+  // specify CPU limits\n+  CPUCFSQuota *bool `json:\"cpuCFSQuota\"`\n+}\n+\n+type CgroupsConfig struct {\n+  // kubeletCgroups is the absolute name of cgroups to isolate the kubelet in.\n+  KubeletCgroups string `json:\"kubeletCgroups\"`\n+  // systemCgroups is absolute name of cgroups in which to place\n+  // all non-kernel processes that are not already in a container. Empty\n+  // for no container. Rolling back the flag requires a reboot.\n+  SystemCgroups string `json:\"systemCgroups\"`\n+  // runtimeCgroups are cgroups that container runtime is expected to be isolated in.\n+  RuntimeCgroups string `json:\"runtimeCgroups\"` // TODO(kc-refactor): Does this become part of CRI now?\n+  // cgroupRoot is the root cgroup to use for pods. This is handled by the\n+  // container runtime on a best effort basis.\n+  CgroupRoot string `json:\"cgroupRoot\"`\n+  // Enable QoS based Cgroup hierarchy: top level cgroups for QoS Classes\n+  // And all Burstable and BestEffort pods are brought up under their\n+  // specific top level QoS cgroup.\n+  // +optional\n+  CgroupsPerQOS *bool `json:\"cgroupsPerQOS,omitempty\"`\n+  // driver that the kubelet uses to manipulate cgroups on the host (cgroupfs or systemd)\n+  // +optional\n+  CgroupDriver string `json:\"cgroupDriver,omitempty\"`\n+}\n+\n+type NodeAllocatableConfig struct {\n+  // A set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=150G) pairs\n+  // that describe resources reserved for non-kubernetes components.\n+  // Currently only cpu and memory are supported. [default=none]\n+  // See http://kubernetes.io/docs/user-guide/compute-resources for more detail.\n+  SystemReserved map[string]string `json:\"systemReserved\"`\n+  // A set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=150G) pairs\n+  // that describe resources reserved for kubernetes system components.\n+  // Currently only cpu and memory are supported. [default=none]\n+  // See http://kubernetes.io/docs/user-guide/compute-resources for more detail.\n+  KubeReserved map[string]string `json:\"kubeReserved\"`\n+  // This flag helps kubelet identify absolute name of top level cgroup used to enforce `SystemReserved` compute resource reservation for OS system daemons.\n+  // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information.\n+  SystemReservedCgroup string `json:\"systemReservedCgroup,omitempty\"`\n+  // This flag helps kubelet identify absolute name of top level cgroup used to enforce `KubeReserved` compute resource reservation for Kubernetes node system daemons.\n+  // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information.\n+  KubeReservedCgroup string `json:\"kubeReservedCgroup,omitempty\"`\n+  // This flag specifies the various Node Allocatable enforcements that Kubelet needs to perform.\n+  // This flag accepts a list of options. Acceptible options are `pods`, `system-reserved` & `kube-reserved`.\n+  // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information.\n+  EnforceNodeAllocatable []string `json:\"enforceNodeAllocatable,omitempty\"`\n+  // This flag, if set, will avoid including `EvictionHard` limits while computing Node Allocatable.\n+  // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information.\n+  ExperimentalNodeAllocatableIgnoreEvictionThreshold bool `json:\"experimentalNodeAllocatableIgnoreEvictionThreshold,omitempty\"`\n+}\n+\n+type KubeletServerConfig struct {\n+  // TODO(kc-refactor): It would probably be a bad idea to turn this off dynamically - the\n+  // operator-intervention endpoints for dynamic config are planned to be on the kubelet's server\n+  // OTOH if it was turned off in provisioning by accident it wouldn't be fatal,\n+  // you would still use dynamic config, you may have problems down the road...\n+  // enableServer enables the Kubelet's server\n+  EnableServer *bool `json:\"enableServer\"`\n+  // address is the IP address for the Kubelet to serve on (set to 0.0.0.0\n+  // for all interfaces)\n+  Address string `json:\"address\"`\n+  // port is the port for the Kubelet to serve on.\n+  Port int32 `json:\"port\"`\n+  // readOnlyPort is the read-only port for the Kubelet to serve on with\n+  // no authentication/authorization (set to 0 to disable)\n+  ReadOnlyPort int32 `json:\"readOnlyPort\"`\n+  // streamingConnectionIdleTimeout is the maximum time a streaming connection\n+  // can be idle before the connection is automatically closed.\n+  StreamingConnectionIdleTimeout metav1.Duration `json:\"streamingConnectionIdleTimeout\"` // TODO(kc-refactor): This is for serving remote commands (attach, exec, etc.). Is this subsumed by CRI?\n+}\n+\n+type HealthzServerConfig struct {\n+  // healthzBindAddress is the IP address for the healthz server to serve on.\n+  HealthzBindAddress string `json:\"healthzBindAddress\"`\n+  // healthzPort is the port of the localhost healthz endpoint\n+  HealthzPort int32 `json:\"healthzPort\"`\n+}\n+\n+type CAdvisorServerConfig struct {\n+  // cAdvisorPort is the port of the localhost cAdvisor endpoint\n+  CAdvisorPort int32 `json:\"cAdvisorPort\"`\n+}\n+\n+type PodNetworkConfig struct {\n+  // The CIDR to use for pod IP addresses, only used in standalone mode.\n+  // In cluster mode, this is obtained from the master.\n+  PodCIDR string `json:\"podCIDR\"`\n+  // How should the kubelet configure the container bridge for hairpin packets.\n+  // Setting this flag allows endpoints in a Service to loadbalance back to\n+  // themselves if they should try to access their own Service. Values:\n+  //   \"promiscuous-bridge\": make the container bridge promiscuous.\n+  //   \"hairpin-veth\":       set the hairpin flag on container veth interfaces.\n+  //   \"none\":               do nothing.\n+  // Generally, one must set --hairpin-mode=veth-flag to achieve hairpin NAT,\n+  // because promiscous-bridge assumes the existence of a container bridge named cbr0.\n+  HairpinMode string `json:\"hairpinMode\"`\n+}\n+\n+type NodeNetworkConfig struct {\n+  // ResolverConfig is the resolver configuration file used as the basis\n+  // for the container DNS resolution configuration.\"), []\n+  ResolverConfig string `json:\"resolvConf\"`\n+  // nonMasqueradeCIDR configures masquerading: traffic to IPs outside this range will use IP masquerade.\n+  NonMasqueradeCIDR string `json:\"nonMasqueradeCIDR\"`\n+  // If true, Kubelet ensures a set of iptables rules are present on host.\n+  // These rules will serve as utility rules for various components, e.g. KubeProxy.\n+  // The rules will be created based on IPTablesMasqueradeBit and IPTablesDropBit.\n+  MakeIPTablesUtilChains *bool `json:\"makeIPTablesUtilChains\"`\n+  // iptablesMasqueradeBit is the bit of the iptables fwmark space to mark for SNAT\n+  // Values must be within the range [0, 31]. Must be different from other mark bits.\n+  // Warning: Please match the value of corresponding parameter in kube-proxy\n+  // TODO: clean up IPTablesMasqueradeBit in kube-proxy\n+  IPTablesMasqueradeBit *int32 `json:\"iptablesMasqueradeBit\"`\n+  // iptablesDropBit is the bit of the iptables fwmark space to mark for dropping packets.\n+  // Values must be within the range [0, 31]. Must be different from other mark bits.\n+  IPTablesDropBit *int32 `json:\"iptablesDropBit\"`\n+}\n+\n+type KubeletTLSConfig struct {\n+  // tlsCertFile is the file containing x509 Certificate for HTTPS.  (CA cert,\n+  // if any, concatenated after server cert). If tlsCertFile and\n+  // tlsPrivateKeyFile are not provided, a self-signed certificate\n+  // and key are generated for the public address and saved to the directory\n+  // passed to certDir.\n+  TLSCertFile string `json:\"tlsCertFile\"`\n+  // tlsPrivateKeyFile is the ile containing x509 private key matching\n+  // tlsCertFile.\n+  TLSPrivateKeyFile string `json:\"tlsPrivateKeyFile\"`\n+  // certDirectory is the directory where the TLS certs are located (by\n+  // default /var/run/kubernetes). If tlsCertFile and tlsPrivateKeyFile\n+  // are provided, this flag will be ignored.\n+  CertDirectory string `json:\"certDirectory\"`\n+}\n+\n+type KubeletAuthConfig struct {\n+    // authentication specifies how requests to the Kubelet's server are authenticated\n+  Authentication KubeletAuthentication `json:\"authentication\"`\n+  // authorization specifies how requests to the Kubelet's server are authorized\n+  Authorization KubeletAuthorization `json:\"authorization\"`\n+}\n+\n+type PodSecurityConfig struct {\n+  // seccompProfileRoot is the directory path for seccomp profiles.\n+  SeccompProfileRoot string `json:\"seccompProfileRoot\"`\n+  // allowPrivileged enables containers to request privileged mode.\n+  // Defaults to false.\n+  AllowPrivileged *bool `json:\"allowPrivileged\"`\n+  // Whitelist of unsafe sysctls or sysctl patterns (ending in *). Use these at your own risk.\n+  // Resource isolation might be lacking and pod might influence each other on the same node.\n+  // +optional\n+  AllowedUnsafeSysctls []string `json:\"allowedUnsafeSysctls,omitempty\"`\n+  // hostPIDSources is a comma-separated list of sources from which the\n+  // Kubelet allows pods to use the host pid namespace. Defaults to \"*\".\n+  HostPIDSources []string `json:\"hostPIDSources\"`\n+  // hostIPCSources is a comma-separated list of sources from which the\n+  // Kubelet allows pods to use the host ipc namespace. Defaults to \"*\".\n+  HostIPCSources []string `json:\"hostIPCSources\"`\n+  // hostNetworkSources is a comma-separated list of sources from which the\n+  // Kubelet allows pods to use of host network. Defaults to \"*\". Valid\n+  // options are \"file\", \"http\", \"api\", and \"*\" (all sources).\n+  HostNetworkSources []string `json:\"hostNetworkSources\"`\n+}\n+\n+// Image pulling config\n+type ImagePullConfig struct {\n+  // serializeImagePulls when enabled, tells the Kubelet to pull images one\n+  // at a time. We recommend *not* changing the default value on nodes that\n+  // run docker daemon with version  < 1.9 or an Aufs storage backend.\n+  // Issue #10959 has more details.\n+  SerializeImagePulls *bool `json:\"serializeImagePulls\"`\n+  // registryPullQPS is the limit of registry pulls per second. If 0,\n+  // unlimited. Set to 0 for no limit. Defaults to 5.0.\n+  RegistryPullQPS *int32 `json:\"registryPullQPS\"`\n+  // registryBurst is the maximum size of a bursty pulls, temporarily allows\n+  // pulls to burst to this number, while still not exceeding registryQps.\n+  // Only used if registryQPS > 0.\n+  RegistryBurst int32 `json:\"registryBurst\"`\n+  // If no pulling progress is made before the deadline imagePullProgressDeadline,\n+  // the image pulling will be cancelled. Defaults to 1m0s.\n+  ImagePullProgressDeadline metav1.Duration `json:\"imagePullProgressDeadline,omitempty\"`\n+}\n+\n+// Garbage collection of container images\n+type ImageGarbageCollectionConfig struct {\n+  // imageMinimumGCAge is the minimum age for an unused image before it is\n+  // garbage collected.\n+  ImageMinimumGCAge metav1.Duration `json:\"imageMinimumGCAge\"`\n+  // imageGCHighThresholdPercent is the percent of disk usage after which\n+  // image garbage collection is always run. The percent is calculated as\n+  // this field value out of 100.\n+  ImageGCHighThresholdPercent *int32 `json:\"imageGCHighThresholdPercent\"`\n+  // imageGCLowThresholdPercent is the percent of disk usage before which\n+  // image garbage collection is never run. Lowest disk usage to garbage\n+  // collect to. The percent is calculated as this field value out of 100.\n+  ImageGCLowThresholdPercent *int32 `json:\"imageGCLowThresholdPercent\"`\n+}\n+\n+// Pod eviction behaviors\n+type PodEvictionConfig struct {\n+  // Comma-delimited list of hard eviction expressions.  For example, 'memory.available<300Mi'.\n+  EvictionHard *string `json:\"evictionHard\"`\n+  // Comma-delimited list of soft eviction expressions.  For example, 'memory.available<300Mi'.\n+  EvictionSoft string `json:\"evictionSoft\"`\n+  // Comma-delimeted list of grace periods for each soft eviction signal.  For example, 'memory.available=30s'.\n+  EvictionSoftGracePeriod string `json:\"evictionSoftGracePeriod\"`\n+  // Duration for which the kubelet has to wait before transitioning out of an eviction pressure condition.\n+  EvictionPressureTransitionPeriod metav1.Duration `json:\"evictionPressureTransitionPeriod\"`\n+  // Maximum allowed grace period (in seconds) to use when terminating pods in response to a soft eviction threshold being met.\n+  EvictionMaxPodGracePeriod int32 `json:\"evictionMaxPodGracePeriod\"`\n+  // Comma-delimited list of minimum reclaims (e.g. imagefs.available=2Gi) that describes the minimum amount of resource the kubelet will reclaim when performing a pod eviction if that resource is under pressure.\n+  EvictionMinimumReclaim string `json:\"evictionMinimumReclaim\"`\n+  // If enabled, the kubelet will integrate with the kernel memcg notification to determine if memory eviction thresholds are crossed rather than polling.\n+  ExperimentalKernelMemcgNotification *bool `json:\"experimentalKernelMemcgNotification\"`\n+}\n+\n+// Volume management\n+type VolumeConfig struct {\n+  // How frequently to calculate and cache volume disk usage for all pods\n+  VolumeStatsAggPeriod metav1.Duration `json:\"volumeStatsAggPeriod\"`\n+  // volumePluginDir is the full path of the directory in which to search\n+  // for additional third party volume plugins\n+  VolumePluginDir string `json:\"volumePluginDir\"`\n+  // enableControllerAttachDetach enables the Attach/Detach controller to\n+  // manage attachment/detachment of volumes scheduled to this node, and\n+  // disables kubelet from executing any attach/detach operations\n+  EnableControllerAttachDetach *bool `json:\"enableControllerAttachDetach\"`\n+}\n+\n+// Node validation and setup\n+type NodeConformanceConfig struct {\n+  // TODO(#34726:1.8.0): Remove the opt-in for failing when swap is enabled.\n+  // Tells the Kubelet to fail to start if swap is enabled on the node.\n+  ExperimentalFailSwapOn bool `json:\"experimentalFailSwapOn,omitempty\"`\n+  // This flag, if set, enables a check prior to mount operations to verify that the required components\n+  // (binaries, etc.) to mount the volume are available on the underlying node. If the check is enabled\n+  // and fails the mount operation fails.\n+  ExperimentalCheckNodeCapabilitiesBeforeMount bool `json:\"experimentalCheckNodeCapabilitiesBeforeMount,omitempty\"`\n+  // Default behaviour for kernel tuning\n+  ProtectKernelDefaults bool `json:\"protectKernelDefaults\"` // If true, Kubelet will error if kernel parameters aren't what it expects. If false, Kubelet will try to set kernel parameters to what it wants.\n+}\n+\n+// Events\n+type EventConfig struct {\n+  // eventRecordQPS is the maximum event creations per second. If 0, there\n+  // is no limit enforced.\n+  EventRecordQPS *int32 `json:\"eventRecordQPS\"`\n+  // eventBurst is the maximum size of a bursty event records, temporarily\n+  // allows event records to burst to this number, while still not exceeding\n+  // event-qps. Only used if eventQps > 0\n+  EventBurst int32 `json:\"eventBurst\"`\n+}\n+\n+// Cloud provider configuration\n+type CloudConfig struct {\n+ // cloudProvider is the provider for cloud services.\n+  CloudProvider string `json:\"cloudProvider\"`\n+  // cloudConfigFile is the path to the cloud provider configuration file.\n+  CloudConfigFile string `json:\"cloudConfigFile\"`\n+}\n+\n+// Debug settings\n+type KubeletDebugConfig struct {\n+  // enableDebuggingHandlers enables server endpoints for log collection\n+  // and local running of containers and commands\n+  EnableDebuggingHandlers *bool `json:\"enableDebuggingHandlers\"`","path":"pkg/apis/componentconfig/v1alpha1/temp_v1a1_refactor.gogo","position":479,"original_position":479,"commit_id":"3423259cb00f70ae5290808e620e877bb14cdf8f","original_commit_id":"3423259cb00f70ae5290808e620e877bb14cdf8f","user":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars2.githubusercontent.com/u/903617?v=3","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"body":"This would also be a good opportunity for us to change the name (and split debug from exec, attach, etc.), since this config API is still alpha.","created_at":"2017-04-26T18:05:16Z","updated_at":"2017-04-26T18:05:16Z","html_url":"https://github.com/kubernetes/kubernetes/pull/44252#discussion_r113523117","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/113523117"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/44252#discussion_r113523117"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252","id":114987424,"html_url":"https://github.com/kubernetes/kubernetes/pull/44252","diff_url":"https://github.com/kubernetes/kubernetes/pull/44252.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/44252.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/44252","number":44252,"state":"open","locked":false,"title":"WIP Group the KubeletConfiguration parameters into substructures","user":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars2.githubusercontent.com/u/903617?v=3","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"body":"I've finished my initial pass at grouping the KubeletConfiguration types into substructures and I'm looking for feedback.\r\n\r\nThe proposed groupings are in a temporary file for now (`pkg/apis/componentconfig/v1alpha1/temp_v1a1_refactor.gogo`), to make it easy to see the original type side-by-side (`pkg/apis/componentconfig/v1alpha1/types.go`) and to make it easier to grep just the stuff from `KubeletConfiguration`. The `.gogo` extension on the temp file is just so tools don't get confused by a malformed go file.\r\n\r\nThere are a few `TODO(kc-refactor)` comments noting questions I have or things I still have to think about.\r\n\r\n@yujuhong Please let me know if I effectively covered the set of flags-only-eventually-remove parameters related to container runtimes, or if I went too far.\r\n\r\n@timstclair Please take a look at the `PodSecurityConfig` struct and let me know if you like grouping things this way.\r\n\r\n@bgrant0607 @thockin @dchen1107 @vishh @dashpole @lavalamp @Random-Liu @derekwaynecarr @justinsb @smarterclayton @ncdc @mikedanese ","created_at":"2017-04-09T14:09:57Z","updated_at":"2017-04-26T18:05:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"87d9f3ea1b7e969dbbb694668bcd9b4c5d70b5e4","assignee":{"login":"justinsb","id":100893,"avatar_url":"https://avatars1.githubusercontent.com/u/100893?v=3","gravatar_id":"","url":"https://api.github.com/users/justinsb","html_url":"https://github.com/justinsb","followers_url":"https://api.github.com/users/justinsb/followers","following_url":"https://api.github.com/users/justinsb/following{/other_user}","gists_url":"https://api.github.com/users/justinsb/gists{/gist_id}","starred_url":"https://api.github.com/users/justinsb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinsb/subscriptions","organizations_url":"https://api.github.com/users/justinsb/orgs","repos_url":"https://api.github.com/users/justinsb/repos","events_url":"https://api.github.com/users/justinsb/events{/privacy}","received_events_url":"https://api.github.com/users/justinsb/received_events","type":"User","site_admin":false},"assignees":[{"login":"justinsb","id":100893,"avatar_url":"https://avatars1.githubusercontent.com/u/100893?v=3","gravatar_id":"","url":"https://api.github.com/users/justinsb","html_url":"https://github.com/justinsb","followers_url":"https://api.github.com/users/justinsb/followers","following_url":"https://api.github.com/users/justinsb/following{/other_user}","gists_url":"https://api.github.com/users/justinsb/gists{/gist_id}","starred_url":"https://api.github.com/users/justinsb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinsb/subscriptions","organizations_url":"https://api.github.com/users/justinsb/orgs","repos_url":"https://api.github.com/users/justinsb/repos","events_url":"https://api.github.com/users/justinsb/events{/privacy}","received_events_url":"https://api.github.com/users/justinsb/received_events","type":"User","site_admin":false},{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars3.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},{"login":"thockin","id":5595220,"avatar_url":"https://avatars3.githubusercontent.com/u/5595220?v=3","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},{"login":"derekwaynecarr","id":6233452,"avatar_url":"https://avatars0.githubusercontent.com/u/6233452?v=3","gravatar_id":"","url":"https://api.github.com/users/derekwaynecarr","html_url":"https://github.com/derekwaynecarr","followers_url":"https://api.github.com/users/derekwaynecarr/followers","following_url":"https://api.github.com/users/derekwaynecarr/following{/other_user}","gists_url":"https://api.github.com/users/derekwaynecarr/gists{/gist_id}","starred_url":"https://api.github.com/users/derekwaynecarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/derekwaynecarr/subscriptions","organizations_url":"https://api.github.com/users/derekwaynecarr/orgs","repos_url":"https://api.github.com/users/derekwaynecarr/repos","events_url":"https://api.github.com/users/derekwaynecarr/events{/privacy}","received_events_url":"https://api.github.com/users/derekwaynecarr/received_events","type":"User","site_admin":false},{"login":"vishh","id":7063592,"avatar_url":"https://avatars1.githubusercontent.com/u/7063592?v=3","gravatar_id":"","url":"https://api.github.com/users/vishh","html_url":"https://github.com/vishh","followers_url":"https://api.github.com/users/vishh/followers","following_url":"https://api.github.com/users/vishh/following{/other_user}","gists_url":"https://api.github.com/users/vishh/gists{/gist_id}","starred_url":"https://api.github.com/users/vishh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vishh/subscriptions","organizations_url":"https://api.github.com/users/vishh/orgs","repos_url":"https://api.github.com/users/vishh/repos","events_url":"https://api.github.com/users/vishh/events{/privacy}","received_events_url":"https://api.github.com/users/vishh/received_events","type":"User","site_admin":false},{"login":"bgrant0607","id":7725777,"avatar_url":"https://avatars2.githubusercontent.com/u/7725777?v=3","gravatar_id":"","url":"https://api.github.com/users/bgrant0607","html_url":"https://github.com/bgrant0607","followers_url":"https://api.github.com/users/bgrant0607/followers","following_url":"https://api.github.com/users/bgrant0607/following{/other_user}","gists_url":"https://api.github.com/users/bgrant0607/gists{/gist_id}","starred_url":"https://api.github.com/users/bgrant0607/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgrant0607/subscriptions","organizations_url":"https://api.github.com/users/bgrant0607/orgs","repos_url":"https://api.github.com/users/bgrant0607/repos","events_url":"https://api.github.com/users/bgrant0607/events{/privacy}","received_events_url":"https://api.github.com/users/bgrant0607/received_events","type":"User","site_admin":false},{"login":"dchen1107","id":7740897,"avatar_url":"https://avatars1.githubusercontent.com/u/7740897?v=3","gravatar_id":"","url":"https://api.github.com/users/dchen1107","html_url":"https://github.com/dchen1107","followers_url":"https://api.github.com/users/dchen1107/followers","following_url":"https://api.github.com/users/dchen1107/following{/other_user}","gists_url":"https://api.github.com/users/dchen1107/gists{/gist_id}","starred_url":"https://api.github.com/users/dchen1107/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dchen1107/subscriptions","organizations_url":"https://api.github.com/users/dchen1107/orgs","repos_url":"https://api.github.com/users/dchen1107/repos","events_url":"https://api.github.com/users/dchen1107/events{/privacy}","received_events_url":"https://api.github.com/users/dchen1107/received_events","type":"User","site_admin":false},{"login":"yujuhong","id":10524058,"avatar_url":"https://avatars2.githubusercontent.com/u/10524058?v=3","gravatar_id":"","url":"https://api.github.com/users/yujuhong","html_url":"https://github.com/yujuhong","followers_url":"https://api.github.com/users/yujuhong/followers","following_url":"https://api.github.com/users/yujuhong/following{/other_user}","gists_url":"https://api.github.com/users/yujuhong/gists{/gist_id}","starred_url":"https://api.github.com/users/yujuhong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yujuhong/subscriptions","organizations_url":"https://api.github.com/users/yujuhong/orgs","repos_url":"https://api.github.com/users/yujuhong/repos","events_url":"https://api.github.com/users/yujuhong/events{/privacy}","received_events_url":"https://api.github.com/users/yujuhong/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/32","html_url":"https://github.com/kubernetes/kubernetes/milestone/32","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones/32/labels","id":2264750,"number":32,"title":"v1.7","description":"","creator":{"login":"pwittrock","id":7882754,"avatar_url":"https://avatars3.githubusercontent.com/u/7882754?v=3","gravatar_id":"","url":"https://api.github.com/users/pwittrock","html_url":"https://github.com/pwittrock","followers_url":"https://api.github.com/users/pwittrock/followers","following_url":"https://api.github.com/users/pwittrock/following{/other_user}","gists_url":"https://api.github.com/users/pwittrock/gists{/gist_id}","starred_url":"https://api.github.com/users/pwittrock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pwittrock/subscriptions","organizations_url":"https://api.github.com/users/pwittrock/orgs","repos_url":"https://api.github.com/users/pwittrock/repos","events_url":"https://api.github.com/users/pwittrock/events{/privacy}","received_events_url":"https://api.github.com/users/pwittrock/received_events","type":"User","site_admin":false},"open_issues":325,"closed_issues":162,"state":"open","created_at":"2017-01-19T17:41:27Z","updated_at":"2017-04-26T16:59:01Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/44252/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3423259cb00f70ae5290808e620e877bb14cdf8f","head":{"label":"mtaufen:kc-refactor","ref":"kc-refactor","sha":"3423259cb00f70ae5290808e620e877bb14cdf8f","user":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars2.githubusercontent.com/u/903617?v=3","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"repo":{"id":58391682,"name":"kubernetes","full_name":"mtaufen/kubernetes","owner":{"login":"mtaufen","id":903617,"avatar_url":"https://avatars2.githubusercontent.com/u/903617?v=3","gravatar_id":"","url":"https://api.github.com/users/mtaufen","html_url":"https://github.com/mtaufen","followers_url":"https://api.github.com/users/mtaufen/followers","following_url":"https://api.github.com/users/mtaufen/following{/other_user}","gists_url":"https://api.github.com/users/mtaufen/gists{/gist_id}","starred_url":"https://api.github.com/users/mtaufen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtaufen/subscriptions","organizations_url":"https://api.github.com/users/mtaufen/orgs","repos_url":"https://api.github.com/users/mtaufen/repos","events_url":"https://api.github.com/users/mtaufen/events{/privacy}","received_events_url":"https://api.github.com/users/mtaufen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mtaufen/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/mtaufen/kubernetes","forks_url":"https://api.github.com/repos/mtaufen/kubernetes/forks","keys_url":"https://api.github.com/repos/mtaufen/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mtaufen/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mtaufen/kubernetes/teams","hooks_url":"https://api.github.com/repos/mtaufen/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/mtaufen/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/mtaufen/kubernetes/events","assignees_url":"https://api.github.com/repos/mtaufen/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/mtaufen/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/mtaufen/kubernetes/tags","blobs_url":"https://api.github.com/repos/mtaufen/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mtaufen/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mtaufen/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/mtaufen/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mtaufen/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/mtaufen/kubernetes/languages","stargazers_url":"https://api.github.com/repos/mtaufen/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/mtaufen/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/mtaufen/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/mtaufen/kubernetes/subscription","commits_url":"https://api.github.com/repos/mtaufen/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/mtaufen/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/mtaufen/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/mtaufen/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/mtaufen/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/mtaufen/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mtaufen/kubernetes/merges","archive_url":"https://api.github.com/repos/mtaufen/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mtaufen/kubernetes/downloads","issues_url":"https://api.github.com/repos/mtaufen/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/mtaufen/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/mtaufen/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/mtaufen/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mtaufen/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/mtaufen/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/mtaufen/kubernetes/deployments","created_at":"2016-05-09T16:30:01Z","updated_at":"2016-05-09T16:30:16Z","pushed_at":"2017-04-25T22:59:56Z","git_url":"git://github.com/mtaufen/kubernetes.git","ssh_url":"git@github.com:mtaufen/kubernetes.git","clone_url":"https://github.com/mtaufen/kubernetes.git","svn_url":"https://github.com/mtaufen/kubernetes","homepage":"http://kubernetes.io","size":423870,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"6e3bd081d5c6d1f07bd25630a8323698a64d6c38","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars1.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars1.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/kubernetes","description":"Production-Grade Container Scheduling and Management","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/kubernetes/deployments","created_at":"2014-06-06T22:56:04Z","updated_at":"2017-04-26T16:05:42Z","pushed_at":"2017-04-26T17:19:05Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":628691,"stargazers_count":22680,"watchers_count":22680,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":7901,"mirror_url":null,"open_issues_count":5625,"forks":7901,"open_issues":5625,"watchers":22680,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/44252"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/44252"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/44252/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/44252/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3423259cb00f70ae5290808e620e877bb14cdf8f"}}}}
{"actor":{"display_login":"mtaufen"}}