Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

k8s settings: kube-reserved, eviction-hard, cpu-manager-policy, allow-unsafe-sysctls #1388

Merged
merged 5 commits into from
Apr 5, 2021

Conversation

gthao313
Copy link
Member

@gthao313 gthao313 commented Mar 12, 2021

My fork draft PR: gthao313#1

Description of changes:

  • Add new settings eviction-hard, kube-reserved, allowed-unsafe-sysctls to k8s. User can specify this setting in userdata.

  • Enable cpu-manager-policy to static

  • Add migration for eviction-hard, kube-reserved, allowed-unsafe-sysctls

example:

[settings.kubernetes.eviction-hard]
"memory.available" = "10Gi"
"nodefs.inodesFree" = “15%”
[settings.kubernetes.kube-reserved]
cpu = "70Mi"
memory = "1Gi"
ephemeral-storage = "1Gi"
[settings.kubernetes]
allowed-unsafe-sysctls = ["net.core.somaxconn", ...]

Testing done:

  • Build aws-eks-* images and launched instance.
  • Migration test: tested the migration via upgrade and downgrade testing
  • Unit tests for new model types EvictionHardKey, KubernetesThresholdValue, ReservedResourcesKey, KubernetesQuantityValue, and CpuManagerPolicy (all passes)

Eviction-hard test

Test step1:
Go to control container run apiclient -u /settings to check if expected setting is there.

Test step2:
ssh to admin contianer and look etc/kubernetes/kubelet/config to check if expected config is there.

evictionHard:
  memory.available: 15%

Test step3 - test effected/behavior:
set up eviction threshold to a high value for triggering eviction.

[evictionHard.memory]
"memory.available" = "99.99%" (high percentage to trigger eviction)

a) Go to EKS to check node condition

MemoryPressure True kubelet has insufficient memory available

b) In admin contianer, check kubelet log by journalctl -u kubelet

eviction_manager.go:335] eviction manager: attempting to reclaim memory
eviction_manager.go:346] eviction manager: must evict pod(s) to reclaim memory

kube-reservd test

Test step1:
Go to control container run apiclient -u /settings to check if expected setting is there.

Test step2:
NodeAllocatable = NodeCapacity - Kube-reserved - system-reserved - eviction-threshold
cpu
[settings.kubernetes.kube-reserved.cpu]
cpu = 1
Allocatable cpu = 2 - 1 = 1

EKS Resource allocation:
Name Capacity Allocatable
CPU		2		1

memory
[settings.kubernetes.kube-reserved.Memory]
memory = 1Gi

EKS Resource allocation:
Name    Capacity    Allocatable
Memory	7844780Ki	6693804Ki

ephemeral-storage
[settings.kubernetes.kube-reserved.ephemeral-storage]
ephemeral-storage = 1Gi

Capacity:
  attachable-volumes-aws-ebs:  25
  cpu:                         2
  ephemeral-storage:           20624592Ki
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      7930796Ki
  pods:                        29
Allocatable:
  attachable-volumes-aws-ebs:  25
  cpu:                         1
  ephemeral-storage:           19007623956
  hugepages-1Gi:               0
  hugepages-2Mi:               0
  memory:                      7828396Ki
  pods:                        29˜

cpu-manager-policy test

Test step1:
Go to host find cpu_manager_state

bash-5.0# cat /var/lib/kubelet/cpu_manager_state
{"policyName":"static","defaultCpuSet":"0-1","checksum":3945352861}bash-5.0#
journalctl -u kubelet
cpu_manager.go:173] [cpumanager] starting with static policy

allowed-unsafe-sysctls test

Test step1:
Go to control container run apiclient -u /settings to check if expected setting is there.

Test step2:
Go to kubelet-config to check if desired result is there.

cat eks/kubernetes/kubelet/config

allowed-unsafe-sysctls = ["net.core.somaxconn", ]

Terms of contribution:

By submitting this pull request, I agree that this contribution is dual-licensed under the terms of both the Apache License, version 2.0, and the MIT license.

@gthao313 gthao313 marked this pull request as draft March 12, 2021 19:09
@etungsten etungsten changed the title K8s settings k8s settings: kube-reserved, eviction-hard, cpu-manager-policy, allow-unsafe-sysctls Mar 12, 2021
@gthao313
Copy link
Member Author

Oush above add new model types KubernetesThresholdValue and KubernetesQuantityValue, and those passed unit tests.

@gthao313
Copy link
Member Author

push above fix typo

sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/mod.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
@gthao313 gthao313 marked this pull request as ready for review March 13, 2021 01:07
@gthao313
Copy link
Member Author

Push above improve error mod and syntax.

sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/models/src/modeled_types/kubernetes.rs Outdated Show resolved Hide resolved
sources/api/pluto/src/main.rs Outdated Show resolved Hide resolved
sources/api/pluto/src/main.rs Outdated Show resolved Hide resolved
sources/api/pluto/src/main.rs Outdated Show resolved Hide resolved
sources/api/pluto/src/main.rs Outdated Show resolved Hide resolved
sources/models/src/aws-k8s-1.15/defaults.d/50-aws-k8s.toml Outdated Show resolved Hide resolved
sources/api/pluto/src/main.rs Outdated Show resolved Hide resolved
packages/kubernetes-1.15/kubelet-config Show resolved Hide resolved
Release.toml Outdated Show resolved Hide resolved
@gthao313 gthao313 force-pushed the k8s-settings branch 3 times, most recently from f7f6c59 to a3eb7d0 Compare March 18, 2021 01:18
@gthao313
Copy link
Member Author

Push above enable cpu-manager-policy to static, improve input validation for eviction-hard and kube-reserved, and add more unit test for get_resource_to_reserve_in_range get_cpu_millicores_to_reserve.

@gthao313
Copy link
Member Author

push above fix migration version.

@gthao313
Copy link
Member Author

push above improve KubernetesQuantity regex and improve cpu-manager-policy.

Copy link
Contributor

@bcressey bcressey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As an overall test, can you make sure that kubelet-config is still the same for 1.15 + 1.16, 1.17 + 1.18, with 1.19 as an outlier?

❯ sha1sum packages/kubernetes-1.1*/kubelet-config
...

❯ diff -u -p packages/kubernetes-1.1{6,7}/kubelet-config
--- packages/kubernetes-1.16/kubelet-config	2021-03-29 19:27:33.165289932 +0000
+++ packages/kubernetes-1.17/kubelet-config	2021-03-29 19:27:33.165289932 +0000
@@ -36,6 +36,7 @@ cgroupRoot: "/"
 runtimeRequestTimeout: 15m
 featureGates:
   RotateKubeletServerCertificate: true
+  CSIMigration: false
 serializeImagePulls: false
 serverTLSBootstrap: true
 configMapAndSecretChangeDetectionStrategy: Cache

❯ diff -u -p packages/kubernetes-1.1{8,9}/kubelet-config
--- packages/kubernetes-1.18/kubelet-config	2021-03-29 19:27:33.166289937 +0000
+++ packages/kubernetes-1.19/kubelet-config	2021-03-29 19:27:33.166289937 +0000
@@ -42,5 +42,6 @@ serverTLSBootstrap: true
 configMapAndSecretChangeDetectionStrategy: Cache
 tlsCipherSuites:
 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+volumePluginDir: "/var/lib/kubelet/plugins/volume/exec"
 maxPods: {{default 110 settings.kubernetes.max-pods}}
 staticPodPath: "/etc/kubernetes/static-pods/"

packages/kubernetes-1.15/kubelet-config Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/api/schnauzer/src/helpers.rs Outdated Show resolved Hide resolved
sources/models/src/lib.rs Outdated Show resolved Hide resolved
@gthao313
Copy link
Member Author

push above improve variable name and improve kube_reserve_cpu kube_reserve_memory in schnauzer.

@gthao313 gthao313 requested a review from bcressey March 31, 2021 19:33
README.md Outdated Show resolved Hide resolved
@gthao313
Copy link
Member Author

gthao313 commented Apr 1, 2021

Push above improve number conversion process in kube_reserve_memory and improve eviction-hard in README

Additional Test:
Launching two m5.xlarge instances(one Bottlerocket with my changes & one EKS AL2) and two c5.12xlarge instances(one Bottlerocket with your changes & one EKS AL2) to confirm that we calculate the same values across max pods, CPU reserve, and memory reserve.

Bottlerocket m5 xlarge
kubeReserved:
  cpu: "80m"
  memory: "893Mi"
  ephemeral-storage: "1Gi"

EKS AL2 m5 xlargs
"kubeReserved": {
    "cpu": "80m",
    "ephemeral-storage": "1Gi",
    "memory": "893Mi"
  }

Bottlerocket c5 12.xlarge
kubeReserved:
  cpu: "190m"
  memory: "2829Mi"
  ephemeral-storage: "1Gi"

EKS AL2 c5 12.xlarge
"kubeReserved": {
	"cpu": "190m",
	"ephemeral-storage": "1Gi",
	"memory": "2829Mi"
}

@gthao313 gthao313 requested a review from bcressey April 1, 2021 21:07
@gthao313 gthao313 requested review from etungsten and webern April 2, 2021 16:50
Copy link
Contributor

@zmrow zmrow left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🍄

@@ -29,6 +29,20 @@ authorization:
clusterDomain: {{settings.kubernetes.cluster-domain}}
clusterDNS:
- {{settings.kubernetes.cluster-dns-ip}}
{{~#if settings.kubernetes.eviction-hard}}
evictionHard:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is awesome - we've built an AMI with this patch and its working wonderfully. In a followup PR, we'd like to see the evictionSoft settings exposed, as well as the eviction-max-pod-grace-period setting. Overall though, this is great!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @diranged. We have opened a new issue about supporting eviction soft related settings. You can follow up here #1445. Thanks!

@gthao313 gthao313 merged commit d76f828 into bottlerocket-os:develop Apr 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants