ãã°ãå ±åããéã¯ãã®ãã³ãã¬ãŒãã䜿çšããã§ããã ãå€ãã®æ å ±ãæäŸããŠãã ããã ããããªããšããã°ãã¿ã€ã ãªãŒã«å¯ŸåŠãããªãå¯èœæ§ããããŸãã ããããšãïŒ åé¡ãã»ãã¥ãªãã£é¢é£ã®å Žåã¯ãhttpsïŒ//kubernetes.io/security/ãä»ããŠéå ¬éã§é瀺ããŠãã ãã
äœãèµ·ãã£ãã®ãïŒãã¹ã¿ãŒããŒãã®kube-controller-managerã®pod-eviction-timeout
èšå®ãå€æŽããŸããïŒããŒãã«é害ãçºçããå Žåã«k8sãããããåäœæãããŸã§ã®æéãççž®ããããïŒã ããã©ã«ãå€ã¯5åã§ã30ç§ãæ§æããŸããã sudo docker ps --no-trunc | grep "kube-controller-manager"
ã³ãã³ãã䜿çšããŠãå€æŽãæ£åžžã«é©çšãããããšã確èªããŸããã
kubeadmin<strong i="10">@nodetest21</strong>:~$ sudo docker ps --no-trunc | grep "kube-controller-manager"
387261c61ee9cebce50de2540e90b89e2bc710b4126a0c066ef41f0a1fb7cf38 sha256:0482f640093306a4de7073fde478cf3ca877b6fcc2c4957624dddb2d304daef5 "kube-controller-manager --address=127.0.0.1 --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --use-service-account-credentials=true --pod-eviction-timeout=30s"
2ã€ã®ã¬ããªã«ã䜿çšããŠåºæ¬çãªå±éãé©çšããŸããã
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
æåã®ã¯ãŒã«ãŒããŒãã§äœæãããæåã®ãããã2çªç®ã®ã¯ãŒã«ãŒããŒãã§äœæããã2çªç®ã®ãããïŒ
NAME STATUS ROLES AGE VERSION
nodetest21 Ready master 34m v1.13.3
nodetest22 Ready <none> 31m v1.13.3
nodetest23 Ready <none> 30m v1.13.3
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default busybox-74b487c57b-5s6g7 1/1 Running 0 13s 10.44.0.2 nodetest22 <none> <none>
default busybox-74b487c57b-6zdvv 1/1 Running 0 13s 10.36.0.1 nodetest23 <none> <none>
kube-system coredns-86c58d9df4-gmcjd 1/1 Running 0 34m 10.32.0.2 nodetest21 <none> <none>
kube-system coredns-86c58d9df4-wpffr 1/1 Running 0 34m 10.32.0.3 nodetest21 <none> <none>
kube-system etcd-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-apiserver-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-controller-manager-nodetest21 1/1 Running 0 20m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-proxy-6mcn8 1/1 Running 1 31m 10.0.1.5 nodetest22 <none> <none>
kube-system kube-proxy-dhdqj 1/1 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
kube-system kube-proxy-vqjg8 1/1 Running 0 34m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-scheduler-nodetest21 1/1 Running 1 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-9qls7 2/2 Running 3 31m 10.0.1.5 nodetest22 <none> <none>
kube-system weave-net-h2cb6 2/2 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-vkb62 2/2 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
æ£ãããããã®åé€ããã¹ãããããã«ãæåã®ã¯ãŒã«ãŒããŒããã·ã£ããããŠã³ããŸããã çŽ1ååŸãæåã®ã¯ãŒã«ãŒããŒãã®ã¹ããŒã¿ã¹ããNotReadyãã«å€ããããã®åŸ
ãªãã«ãããããŒãã®ããããä»ã®ããŒãã«åäœæããããŸã§ã+ 5åïŒããã©ã«ãã®ããããšãã¯ã·ã§ã³ã¿ã€ã ã¢ãŠãïŒåŸ
ã€å¿
èŠããããŸããã
ããªããèµ·ãããšæåŸ
ããããšïŒ
ããŒãã¹ããŒã¿ã¹ããNotReadyããå ±åããåŸãããã©ã«ãã®5åã§ã¯ãªãã30ç§åŸã«ä»ã®ããŒãã§ããããåäœæããå¿
èŠããããŸãã
ãããåçŸããæ¹æ³ïŒå¯èœãªéãæå°éãã€æ£ç¢ºã«ïŒ ïŒ
3ã€ã®ããŒããäœæããŸãã æåã®ããŒãïŒ sudo kubeadm init
ïŒã§Kubernetesãåæåãããããã¯ãŒã¯ãã©ã°ã€ã³ïŒ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
ïŒãé©çšããŠãããä»ã®2ã€ã®ããŒãïŒ kubeadm join 10.0.1.4:6443 --token xdx9y1.z7jc0j7c8g8lpjog --discovery-token-ca-cert-hash sha256:04ae8388f607755c14eed702a23fd47802d5512e092b08add57040a2ae0736ac
ïŒã«åå ããŸãã
pod-eviction-timeoutãã©ã¡ãŒã¿ãŒããã¹ã¿ãŒããŒãã®KubeController Managerã«è¿œå ããŸãïŒ sudo vi /etc/kubernetes/manifests/kube-controller-manager.yaml
ïŒ
apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: null
labels:
component: kube-controller-manager
tier: control-plane
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- command:
- kube-controller-manager
- --address=127.0.0.1
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --use-service-account-credentials=true
- --pod-eviction-timeout=30s
ïŒyamlã¯åãæšãŠãããé¢é£ããæåã®éšåã®ã¿ãããã«è¡šç€ºãããŸãïŒã
èšå®ãé©çšãããŠããããšã確èªããŸãã
sudo docker ps --no-trunc | grep "kube-controller-manager"
2ã€ã®ã¬ããªã«ã䜿çšããŠãããã€ã¡ã³ããé©çšãã1ã€ã®ããããæåã®ã¯ãŒã«ãŒããŒãã«äœæããã2çªç®ã®ãããã2çªç®ã®ã¯ãŒã«ãŒããŒãã«äœæãããããšã確èªããŸãã
ããŒãã®1ã€ãã·ã£ããããŠã³ããããŒãããNotReadyããå ±åããŠããããããåäœæããããšãã«ãã€ãã³ãéã®çµéæéã確èªããŸãã
ä»ã«ç¥ã£ãŠããã¹ãããšã¯ãããŸããïŒ ïŒ
ãã«ããã¹ã¿ãŒç°å¢ã§ãåãåé¡ãçºçããŸãã
ç°å¢ïŒ
kubectl version
ïŒïŒv1.13.3cat /etc/os-release
ïŒïŒNAME = "Ubuntu" VERSION = "16.04.5 LTSïŒXenial XerusïŒ"uname -a
ïŒïŒLinux nodetest21 4.15.0-1037-azureïŒ39ã16.04.1-Ubuntu SMP Tue Jan 15 17:20:47 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux@ kubernetes / sig-ããŒã-ãã°
@ kubernetes / sig-apps-bugs
@danielloczi ïŒéç¥ãããªã¬ãŒããããã«èšåãç¹°ãè¿ããŸãïŒ
@ kubernetes / sig-node-bugsã@ kubernetes / sig-apps-bugs
察å¿ããŠããã®ïŒ
@ kubernetes / sig-node-bugs
@ kubernetes / sig-apps-bugs
PRã³ã¡ã³ãã䜿çšããŠç§ãšããåãããããã®æé ã¯ããã¡ãããå
¥æã§ãkubernetes / test-infraãªããžããªã«å¯ŸããŠåé¡ã
ãŸãããšãã¯ã·ã§ã³ã¿ã€ã ã¢ãŠããäœãèšå®ããŠãã¹ãããŠãããšãã«ããã®åé¡ãçºçããŸããã ãã°ããããã調ã¹ãåŸãåå ã¯æ°ããTaintBasedEvictionsã§ããããšãããããŸããã
ããŒãžã§ã³1.13ã§ã¯ãTaintBasedEvictionsæ©èœãããŒã¿çã«ããã¢ãŒããããããã©ã«ãã§æå¹ã«ãªã£ãŠãããããæ±æã¯NodeControllerïŒãŸãã¯kubeletïŒã«ãã£ãŠèªåçã«è¿œå ãããReadyNodeConditionã«åºã¥ããŠããŒãããããããåé€ããããã®éåžžã®ããžãã¯ã¯ç¡å¹ã«ãªããŸãã
ããã®æ©èœãã©ã°ãfalseã«èšå®ãããšãããããäºæ³ã©ããã«åé€ãããŸãã æ±æããŒã¹ã®ãšãã¯ã·ã§ã³ã³ãŒããæ€çŽ¢ããã®ã«æéãããããŸããã§ãããããã®ãšãã¯ã·ã§ã³ã¿ã€ã ã¢ãŠããã©ã°ã䜿çšããŠããªããšæããŸãã
ããããã£ãšèª¿ã¹ãŸãã TaintBasedEvictionsãtrueã«èšå®ãããšã蚱容ç¯å²å
ã®ä»æ§å
ã§ãããã®ãšãã¯ã·ã§ã³æéãèšå®ã§ããŸãã
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint -based-evictions
ãããã®ããã©ã«ãå€ã¯ãã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã«ãã£ãŠèšå®ãããŠããŸãïŒ //github.com/kubernetes/kubernetes/blob/master/plugin/pkg/admission/defaulttolerationseconds/admission.go#L34
ãããã®2ã€ã®ãã©ã°ã¯ãkube-apiserverãä»ããŠèšå®ã§ããåãå¹æãå®çŸããã¯ãã§ãã
// Controller will not proactively sync node health, but will monitor node
// health signal updated from kubelet. There are 2 kinds of node healthiness
// signals: NodeStatus and NodeLease. NodeLease signal is generated only when
// NodeLease feature is enabled. If it doesn't receive update for this amount
// of time, it will start posting "NodeReady==ConditionUnknown". The amount of
// time before which Controller start evicting pods is controlled via flag
// 'pod-eviction-timeout'.
// Note: be cautious when changing the constant, it must work with
// nodeStatusUpdateFrequency in kubelet and renewInterval in NodeLease
// controller. The node health signal update frequency is the minimal of the
// two.
// There are several constraints:
// 1. nodeMonitorGracePeriod must be N times more than the node health signal
// update frequency, where N means number of retries allowed for kubelet to
// post node status/lease. It is pointless to make nodeMonitorGracePeriod
// be less than the node health signal update frequency, since there will
// only be fresh values from Kubelet at an interval of node health signal
// update frequency. The constant must be less than podEvictionTimeout.
// 2. nodeMonitorGracePeriod can't be too large for user experience - larger
// value takes longer for user to see up-to-date node health.
ãã£ãŒãããã¯ãããããšãChiefAlexanderïŒ
ãããç¶æ³ã ãšããªãã¯æžããã ãããããã§ãã¯ãã蚱容ç¯å²ã®ãããã«å²ãåœãŠãããããã©ã«ãå€ãããããšã確èªããŸããã
kubectl describe pod busybox-74b487c57b-95b6n | grep -i toleration -A 2
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
ãããã£ãŠããããã€ã¡ã³ãã«ç¬èªã®å€ãè¿œå ããã ãã§ãã
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
ããŒãé害ã®å Žåã«ãããã€ã¡ã³ããé©çšããåŸãããŒãã®ã¹ããŒã¿ã¹ã¯ãNotReadyãã«å€ããã2ç§åŸã«ããããåäœæãããŸãã
ãããã£ãŠãpod-eviction-timeoutãåŠçããå¿ èŠã¯ãªããªããã¿ã€ã ã¢ãŠãã¯ãããããŒã¹ã§èšå®ã§ããŸãã 涌ããïŒ
ãããããé¡ãããŸãïŒ
@daniellocziããã«ã¡ã¯daniellocziããã®åé¡ãã©ã®ããã«ä¿®æ£ããŸããïŒ ç§ããã®åé¡ã«äŒããŸã
323929 @ç§ã¯@daniellocziã¯æ°ã«ããªããšæããŸãpod-eviction-timeout
ãã©ã¡ãŒã¿KUBE-ã³ã³ãããŒã©ã»ãããŒãžã£ãŒã§ã¯ãªãã䜿çšããŠè§£ãããããTaint based Evictions
ãç§ããã¹ãããTaint based Evictions
ããããåããŠããŸãç§ã®ããã«ã
ããã§ãïŒç§ã¯åã«Taint based Eviction
ã䜿ãå§ããŸããã
ã°ããŒãã«ã«ããããšã¯å¯èœã§ããïŒ ãããæ§æããšã«ãããæå¹ã«ããããããŸãããç¹ã«ããã«ã ããæºåããããã®ããããã䜿çšããŸãã
ã¯ã©ã¹ã¿ãŒå šäœããšã«æ§æã§ããå¯èœæ§ãããå Žåã¯+1ã ãããããšãŸãã¯ãããã€ã¡ã³ãããšã®èª¿æŽã圹ç«ã€ããšã¯ãã£ãã«ãããŸãããã»ãšãã©ã®å Žåãæ£åžžãªã°ããŒãã«å€ã®æ¹ã䟿å©ã§ãããçŸåšã®ããã©ã«ãã®5mã¯å€ãã®å Žåé·ããã®ã§ãã
ãã®å·ãå床éããŠãã ããã
ç§ã¯ãããšåãåé¡ã«çŽé¢ããŠããŸããæ±æããŒã¹ã®ãšãã¯ã·ã§ã³ãç¡å¹ã«ããæ¹æ³ã¯ãããŸããïŒããããšãã¯ã·ã§ã³ã¿ã€ã ã¢ãŠãã¯ã°ããŒãã«ã¢ãŒãã§æ©èœããŸããïŒ
ç§ã¯ãããšåãåé¡ã«çŽé¢ããŠããŸããæ±æããŒã¹ã®ãšãã¯ã·ã§ã³ãç¡å¹ã«ããæ¹æ³ã¯ãããŸããïŒããããšãã¯ã·ã§ã³ã¿ã€ã ã¢ãŠãã¯ã°ããŒãã«ã¢ãŒãã§æ©èœããŸããïŒ
apiserverãä»ããŠã°ããŒãã«ããããšãã¯ã·ã§ã³ãæ§æã§ãããšæããŸãïŒ https ïŒ//kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
ç§ã¯ãããè©ŠããŸããã§ããããã芧ã®ãšããã-default-not-ready-toleration-secondsãš--default-unreachable-toleration-secondsã®ãªãã·ã§ã³ããããŸãã
ãã®ãã°ãã¯ããŒãºãšããŠããŒã¯ãããã®ã¯ãªãã§ããïŒ å
ã®åé¡ã¯è§£æ±ºãããŠããªãããã«èŠããŸãããåé¿çã®ã¿ã§ãã
pod-eviction-timeoutãã©ã°ãæ©èœããªãçç±ã¯ç§ã«ã¯ããããŸãã
åãåé¡
æãåèã«ãªãã³ã¡ã³ã
ãã£ãŒãããã¯ãããããšãChiefAlexanderïŒ
ãããç¶æ³ã ãšããªãã¯æžããã ãããããã§ãã¯ãã蚱容ç¯å²ã®ãããã«å²ãåœãŠãããããã©ã«ãå€ãããããšã確èªããŸããã
ãããã£ãŠããããã€ã¡ã³ãã«ç¬èªã®å€ãè¿œå ããã ãã§ãã
ããŒãé害ã®å Žåã«ãããã€ã¡ã³ããé©çšããåŸãããŒãã®ã¹ããŒã¿ã¹ã¯ãNotReadyãã«å€ããã2ç§åŸã«ããããåäœæãããŸãã
ãããã£ãŠãpod-eviction-timeoutãåŠçããå¿ èŠã¯ãªããªããã¿ã€ã ã¢ãŠãã¯ãããããŒã¹ã§èšå®ã§ããŸãã 涌ããïŒ
ãããããé¡ãããŸãïŒ