æ¬çªã¯ã©ã¹ã¿ãŒã1.17.2ã«ã¢ããã°ã¬ãŒãããŸããã
åææ¥ã®æŽæ°ä»¥éããã®å¥åŠãªåæ¢ãçºçããŸãããKubeletã¯ãNICãã³ãã倱æããåŸïŒããã«å埩ããŸãïŒããã¹ãŠã®æ¥ç¶ãåæãããæåã§åèµ·åããªãéããæ¥ç¶ã®å確ç«ãåè©Šè¡ããŸããã
ãããæåŸã«çºçããã¿ã€ã ã©ã€ã³ã§ãã
01:31:16ïŒã«ãŒãã«ã¯ãã³ãã€ã³ã¿ãŒãã§ãŒã¹ã®é害ãèªèããŸãã ããã¯ãã°ããã®éè¡ããŸãã æçµçã«ã¯å埩ããŸãã
Jan 28 01:31:16 baremetal044 kernel: bond-mngmt: link status definitely down for interface eno1, disabling it
...
Jan 28 01:31:37 baremetal044 systemd-networkd[1702]: bond-mngmt: Lost carrier
Jan 28 01:31:37 baremetal044 systemd-networkd[1702]: bond-mngmt: Gained carrier
Jan 28 01:31:37 baremetal044 systemd-networkd[1702]: bond-mngmt: Configured
äºæ³éãããã¹ãŠã®æèšãéãŸã£ãŠããŸãã ã¡ãã»ãŒãžã¯ããããã¹ãŠã«ãšã£ãŠåãã§ãïŒ
...
Jan 28 01:31:44 baremetal044 kubelet-wrapper[2039]: W0128 04:31:44.352736 2039 reflector.go:326] object-"namespace"/"default-token-fjzcz": watch of *v1.Secret ended with: very short watch: object-"namespace"/"default-token-fjzcz": Unexpected watch close - watch lasted less than a second and no items received
...
ãããã£ãŠããããã®ã¡ãã»ãŒãžãå§ãŸããŸãã
`Jan 28 01:31:44 baremetal44 kubelet-wrapper[2039]: E0128 04:31:44.361582 2039 desired_state_of_world_populator.go:320] Error processing volume "disco-arquivo" for pod "pod-bb8854ddb-xkwm9_namespace(8151bfdc-ec91-48d4-9170-383f5070933f)": error processing PVC namespace/disco-arquivo: failed to fetch PVC from API server: Get https://apiserver:443/api/v1/namespaces/namespace/persistentvolumeclaims/disco-arquivo: write tcp baremetal44.ip:42518->10.79.32.131:443: use of closed network connection`
ç§ãæšæž¬ããŠããããšã¯ããã°ããã®éåé¡ã«ã¯ãªããªãã¯ãã§ãã ããããããã¯æ±ºããŠå埩ããŸããã ç§ãã¡ã®ã€ãã³ãã¯åå1æ31åã«çºçããæ£èŠåããããã«9æéé ã«æåã§Kubeletãåèµ·åããå¿ èŠããããŸããã
# journalctl --since '2020-01-28 01:31' | fgrep 'use of closed' | cut -f3 -d' ' | cut -f1 -d1 -d':' | sort | uniq -dc
9757 01
20663 02
20622 03
20651 04
20664 05
20666 06
20664 07
20661 08
16655 09
3 10
Apiserverã¯çšŒåããŠãããä»ã®ãã¹ãŠã®ããŒãã¯çšŒåããŠããããã®ä»ã¯ãã¹ãŠåé¡ãªãå®è¡ãããŠããŸããã ãã®åé¡ã®åœ±é¿ãåããã®ã¯ããã ãã§ããïŒä»æ¥ïŒã
ãã®çš®ã®ã€ãã³ãã軜æžããæ¹æ³ã¯ãããŸããïŒ
ããã¯ãã°ã§ããããïŒ
/ sigããŒã
/ sig api-machinery
ã³ãŒãã調ã¹ããšãããã§ãšã©ãŒãçºçã
ã³ãŒãã®èª¬æã¯ãããããEOFïŒIsProbableEOFïŒãæ³å®ããŠãããããã®å Žåã¯ããã§ã¯ãªãããã ãšããããšã§ãã
/ assign @caesarxuchao
@rikatz貌ãä»ããã³ãŒããã©ã®ããã«è¿œè·¡ãããã詳ãã説æããŠããã ããŸããïŒ
ç§ã®èãã§ã¯ããªãã¬ã¯ã¿ãŒã¯ãšã©ãŒïŒã³ãŒãïŒãã©ã®ããã«åŠçããŠãæèšãåèµ·åããã®ã§ãå埩ã®å€±æã説æããŠããŸããã
ãŸãã«@caesarxuchaoãªã®ã§ããããç§ãã¡ã®è³ªåã§ãã
ç§ã¯åºæ¬çã«ã³ãŒããä»ããŠãšã©ãŒã远跡ãããã®éšåã«å ¥ãããã«kubeletããã®æã«è¡ã£ãŠããããšïŒç§å¯ãç£èŠïŒãšäº€å·®ããããšã远跡ããŸããã
é«åºŠãªæ¹æ³ã§ã¯ãããŸãããããããšã©ãŒã³ãŒãã®æ£ç¢ºãªãã€ã³ãã®ããã§ãã
åé¡ã¯ãæ¥ç¶ãéããŠãããããããããšã©ãŒã§ããããšãç解ããã®ã§ã¯ãªããããããŠã©ããEOFã§ããããšã瀺ããã©ã°ãã©ããã«ãããã©ããã§ãã
åãæ¹æ³ã§å¥ã®ããŒãã«é害ãçºçããçºçåæ°ãéå»4æ¥éãã4æ¥éã«å¢å ããããšãé€ããŠãè¿œå ããã®ã«è³¢ãæ¹æ³ã¯ä»ã«ãããŸããã
ãã³ããä»ã®ããŒãã§ã€ãã³ããåæããkubeletãå埩ããŠããå Žåãããããè©Šã¿ãŸã-100ïŒ ã®ã€ãã³ãã§ã¯ãªããäžéšã®å埩ã§ã¯éãæªãå¯èœæ§ããããŸãã
ç§ãã¡ããããèŠãŠãããšæããŸãããç§ãã¡ã¯çµãæã£ãŠããŸãããCalico cali*
ã€ã³ã¿ãŒãã§ãŒã¹ã®ãããã®ãããã¯ãŒã¯åãããããã£ãªã¢ãã¹ããã¡ãã»ãŒãžã ããèŠããããããã¯ããŒã«ã«vethããã€ã¹ã§ãã
ç§ãããã«ééããŸããããçµã¯ãããŸããã§ããã ããŒããåèµ·åãããšåé¡ã¯è§£æ±ºããŸãããKubeletãµãŒãã¹ãåèµ·åããã ãã§ã¯åé¡ã¯è§£æ±ºããŸããïŒãã¹ãŠã®APIåŒã³åºãããUnauthorizedãã§å€±æããŸãïŒã
ç§ãããã«ééããŸããããçµã¯ãããŸããã§ããã ããŒããåèµ·åãããšåé¡ã¯è§£æ±ºããŸãããKubeletãµãŒãã¹ãåèµ·åããã ãã§ã¯åé¡ã¯è§£æ±ºããŸããïŒãã¹ãŠã®APIåŒã³åºãããUnauthorizedãã§å€±æããŸãïŒã
æŽæ°ïŒååãªæéïŒ1æéïŒïŒãçµéããåŸãKubeletãåèµ·åãããšåé¡ãä¿®æ£ãããŸããã
ç§ã¯ãããšåãæ¯ãèããèŠãŠããŸãã Ubuntu 18.04.3LTSã¯ãªãŒã³ã€ã³ã¹ããŒã«ã ã©ã³ãã£ãŒ2.3.4ã§æ§ç¯ãããã¯ã©ã¹ã¿ãŒã æè¿ããããå®æçã«çºçããã®ãç®ã«ããŸããããkubeletãåèµ·åããã ãã§ä¿®æ£ãããåŸåããããŸãã æšå€ã3ã€ã®ã¯ãŒã«ãŒããŒããã¹ãŠããããšåãåäœã瀺ããŸããã ã¯ã©ã¹ã¿ãŒãèµ·åããããã«2ãä¿®æ£ããŸããã æãäžããŠããéã3çªç®ã¯ãŸã ãã®ç¶æ ã§ãã
CentOS 7ãã©ã³ãã£ãŒïŒ1.17.2ïŒã§æ°ããæ§ç¯ãããã¯ã©ã¹ã¿ãŒã§ãåãåé¡ãçºçããŠããŸãã ç¹ãã䜿çšããŠããŸãã 3ã€ã®ã¯ãŒã«ãŒããŒããã¹ãŠããã®åé¡ã瀺ããŠããŸãã kubeletãåèµ·åããŠããããŒãå šäœãåèµ·åããå¿ èŠããããŸãã
/ sigããŒã
/ sig api-machineryã³ãŒãã調ã¹ããšãããã§ãšã©ãŒãçºçã
ã³ãŒãã®èª¬æã¯ãããããEOFïŒIsProbableEOFïŒãæ³å®ããŠãããããã®å Žåã¯ããã§ã¯ãªãããã ãšããããšã§ãã
åãåé¡ãçºçããŠããŸãã ãã°ãããåé¡ãçºçããåŸããåŸç¶ã®ãã¹ãŠã®èŠæ±ãåãæ¥ç¶ã§éä¿¡ãããŠããããšãããããŸããã ã¯ã©ã€ã¢ã³ãã¯ãªã¯ãšã¹ããapiserverã«åéä¿¡ããŸãããã¢ã³ããŒã¬ã€http2ã©ã€ãã©ãªã¯å€ãæ¥ç¶ãç¶æããŠãããããåŸç¶ã®ãã¹ãŠã®ãªã¯ãšã¹ãã¯ãã®æ¥ç¶ã§éä¿¡ãããåããšã©ãŒuse of closed connection
ãåãåããŸãã
ããã§åé¡ã¯ããªãhttp2ããã§ã«éããããæ¥ç¶ãç¶æããŠããã®ããšããããšã§ãã å€åãããç¶æããæ¥ç¶ã¯ç¢ºãã«çããŠããŸãããããã€ãã®äžéæ¥ç¶ã¯äºæããéããããŸããïŒ
k8s1.17.3ã䜿çšããRaspberryPiã¯ã©ã¹ã¿ãŒã§ãåãåé¡ãé »ç¹ã«çºçããŸãã ããã€ãã®å€ãåé¡ã«åºã¥ããŠãkubeAPIãµãŒããŒã®httpæ¥ç¶å¶éã1000 "--- http2-max-streams-per-connection = 1000"ã«èšå®ããŸããããã®åŸã2é±é以äžåé¡ãªããåã³èµ·åããŸããã
kube-apiserverãåæ§ç¯ããããšã¯å¯èœã§ããhttps://github.com/kubernetes/apiserver/blob/b214a49983bcd70ced138bd2717f78c0cff351b2/pkg/server/secure_serving.go#L50
ããã©ã«ãã§s.DisableHTTP2
ãtrue
ã«èšå®ããŸããïŒ
å
¬åŒç»åïŒ k8s.gcr.io/kube-apiserver:v1.17.3
ïŒã®dockerfileã¯ãããŸããïŒ
ããã§ãåãã§ããïŒubuntu18.04ãkubernetes 1.17.3ïŒ
ãŸãã2ã€ã®ã¯ã©ã¹ã¿ãŒã§ããã芳å¯ããŸããã æ ¹æ¬çãªåå ã«ã€ããŠã¯å®å
šã«ã¯ããããŸããããå°ãªããšãããŠã©ããæ°ãéåžžã«å€ãã¯ã©ã¹ã¿ãŒã§ãããçºçããŠããããšãããããŸããã ãã ããkubeletããšã«å€æ°ã®ãŠã©ããã匷å¶ããããšã«ãã£ãŠåçŸããããšã¯ã§ããŸããã§ããïŒãããããšã«300ã·ãŒã¯ã¬ããã§ããããéå§ãããããPrometheusã¡ããªãã¯ã§ã¯ãããããšã«300ãŠã©ããã«ãªããŸããïŒã ãŸããéåžžã«äœãhttp2-max-streams-per-connection
å€ãèšå®ããŠãåé¡ã¯çºçããŸããã§ããããå°ãªããšããäºæããªãã¹ã±ãžã¥ãŒã©ãŒãšã³ã³ãããŒã©ãŒãããŒãžã£ãŒã®åäœã芳å¯ã§ããŸããïŒç¡éã®åç£èŠã«ãŒããªã©ã®åŸã§éè² è·ã«ãªã£ãå¯èœæ§ããããŸããããã©ïŒã
åé¿çãšããŠããã¹ãŠã®ããŒããããŒã«ã«cronãžã§ããä»ããŠæ¯æ©kubletãåèµ·åããŸãã 10æ¥åã®ä»ãç§ã¯ãããç§ã®ããã«åããŠãããšèšãããšãã§ããŸããç§ã¯ç§ã®ããŒãã§ãããéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çšããããŠããŸããã
@sbiermann
ãããæçš¿ããŠããã ãããããšãããããŸãã cronjobã«äœ¿çšããæéééã¯ã©ããããã§ããïŒ
24æé
ãã®åé¡ã確èªã§ããŸãããŸã 1.17.3ã䜿çšããŠããããçŸåšUbuntu19.10ãå®è¡ããŠããŸãã
Linux <STRIPPED>-kube-node02 5.3.0-29-generic #31-Ubuntu SMP Fri Jan 17 17:27:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
STRIPPED-kube-node02 Ready <none> 43d v1.16.6 10.6.0.12 <none> Ubuntu 19.10 5.3.0-29-generic docker://19.3.3
ããã¯ãRancherOS1.5.5ããŒãã®Rancher2.3.5ãä»ããŠãããã€ãããKubernetes1.17.4ã§ã確èªã§ããŸãã kubeletãåèµ·åãããšããŸãããããã§ãããããŒãå šäœãåèµ·åããå¿ èŠã¯ãããŸããã
ç§ã®æ ¹æ¬çãªåå ã¯ãRAMãäžè¶³ã«è¿ã¥ããkswapd0ãæ倧100ïŒ ã®CPU䜿çšçã«ãªã£ãŠããããšã§ããããã¯ãKubernetesããŒãã®swappinessã0ã«èšå®ããã®ãå¿ããããã§ãã swappinessã0ã«èšå®ãããã·ã³ã«RAMãè¿œå ããåŸããã®åé¡ã¯ãŸã çºçããŠããŸããã
æ ¹æ¬çãªåé¡ããæ¥ç¶åãã䜿çšããhttp2ãã§ãã£ãå Žåã¯ãkubeletãåèµ·åãããšåé¡ã解決ããã¯ãã§ãã https://github.com/kubernetes/kubernetes/pull/48670ã¯ãTCP_USER_TIMEOUTãæžããããšã§åé¡ã軜æžã§ããããšã瀺åããŠããŸãã https://github.com/golang/net/pull/55ãéããŠãã¯ã©ã€ã¢ã³ãåŽã®æ¥ç¶ãã«ã¹ãã§ãã¯ãhttp2ã©ã€ãã©ãªã«è¿œå ããŸããããçéžãããŸã§ã«ããã«æéãããããŸãã
kubeletãåèµ·åããŠãåé¡ã解決ããªãå Žåã¯ãããããå¥ã®æ ¹æ¬çãªåå ã§ãã
ãããã¯ãŒã¯ãåèµ·åãããšv1.17.2ã§ãåãåé¡ãçºçããŸããããã®åé¡ãçºçããã®ã¯1ã€ã®ããŒãã®ã¿ã§ãïŒã¯ã©ã¹ã¿ãŒã«ã¯5ã€ã®ããŒãããããŸãïŒãåçŸã§ããŸããã kubeletãåèµ·åãããšããã®åé¡ã¯è§£æ±ºããŸããã
ãã®åé¡ãåé¿ããã«ã¯ã©ãããã°ããã§ããïŒ ææ°ããŒãžã§ã³ãã¢ããã°ã¬ãŒãããŸããããããšãä»ã®æ¹æ³ã§ä¿®æ£ããŸããïŒ
ãã®bashã¹ã¯ãªããã5åããšã«å®è¡ããŠä¿®æ£ããŸããã
#!/bin/bash
output=$(journalctl -u kubelet -n 1 | grep "use of closed network connection")
if [[ $? != 0 ]]; then
echo "Error not found in logs"
elif [[ $output ]]; then
echo "Restart kubelet"
systemctl restart kubelet
fi
kubeletãåèµ·åããã«ããããäœæããŸããããåé¡ã¯è§£æ±ºããããã§ãã
ç· ãåãããã
diff --git a/staging/src/k8s.io/client-go/transport/cache.go b/staging/src/k8s.io/client-go/transport/cache.go
index 7c40848c79f..bd61b39551a 100644
--- a/staging/src/k8s.io/client-go/transport/cache.go
+++ b/staging/src/k8s.io/client-go/transport/cache.go
@@ -38,6 +38,8 @@ const idleConnsPerHost = 25
var tlsCache = &tlsTransportCache{transports: make(map[tlsCacheKey]*http.Transport)}
+type dialFunc func(network, addr string) (net.Conn, error)
+
type tlsCacheKey struct {
insecure bool
caData string
@@ -92,7 +94,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) {
TLSHandshakeTimeout: 10 * time.Second,
TLSClientConfig: tlsConfig,
MaxIdleConnsPerHost: idleConnsPerHost,
- Dial: dial,
+ Dial: setReadDeadlineAfterDial(dial, 30*time.Second),
})
return c.transports[key], nil
}
@@ -111,3 +113,18 @@ func tlsConfigKey(c *Config) (tlsCacheKey, error) {
serverName: c.TLS.ServerName,
}, nil
}
+
+func setReadDeadlineAfterDial(dialer dialFunc, timeout time.Duration) dialFunc {
+ return func(network, addr string) (net.Conn, error) {
+ c, err := dialer(network, addr)
+ if err != nil {
+ return nil, err
+ }
+
+ if err := c.SetReadDeadline(time.Now().Add(timeout)); err != nil {
+ return nil, err
+ }
+
+ return c, nil
+ }
+}
@mYmNeoã¯ã©ã€ã¢ã³ããåæ§ç¯ããæ¹æ³ã説æããŠããã ããŸããïŒ
@mYmNeoã¯ã©ã€ã¢ã³ããåæ§ç¯ããæ¹æ³ã説æããŠããã ããŸããïŒ
@ ik9999ãã®ããããé©çšããŠãããkubeletãåæ§ç¯ãããã€ããªã眮ãæããŸã
@mYmNeoãã®åé¡ãåçŸããŠãã¹ãããã«ã¯ã©ãããã°ããã§ããïŒ
ãã®bashã¹ã¯ãªããã5åããšã«å®è¡ããŠä¿®æ£ããŸãã
@ ik9999ããããšããããã¯åäœããŸãã
cc @liggitt
SetReadDeadlineãèšå®ãããšããã¹ãŠã®æèšã30ç§ããšã«éããŸããïŒ
SetReadDeadlineãèšå®ãããšããã¹ãŠã®æèšã30ç§ããšã«éããŸããïŒ
ã¯ãã ããã¯ããã®åé¡ã解決ããããã®éãæ¹æ³ã§ãïŒæ¥ç¶ã匷å¶çã«éããŸãïŒã
ã¡ããã©å¥ã®ã±ãŒã¹ïŒ
ããã¯ãKube1.16.8ã¯ã©ã¹ã¿ãŒã§ãèŠãããŸãã VMãåèµ·åãããšãããŒããè¯å¥œãªç¶æ ã«æ»ãããšãã§ããŸãïŒkubeletã®åèµ·åãæ©èœãããšæããŸãïŒã
ã»ããã¢ããkubeletã¯ãããŒã«ã«ãã¹ããä»ããŠããŒã«ã«ã®haproxyã€ã³ã¹ã¿ã³ã¹ãšéä¿¡ããŸããããã¯ãè€æ°ã®ããã¯ãšã³ããã¹ã¿ãŒã€ã³ã¹ã¿ã³ã¹ãžã®tcpããŒããã©ã³ãµãŒãšããŠæ©èœããŸãã è¿œå ãããã©ããã調æ»ããŸã
option clitcpka # enables keep-alive only on client side
option srvtcpka # enables keep-alive only on server side
ããŒããã©ã³ãµãŒã€ã³ã¹ã¿ã³ã¹ã¯ãæ瀺çãªåèµ·åã®å¿ èŠæ§ã軜æžããå®å šãªå埩ã«ã€ãªããå¯èœæ§ããããŸãã ç¹°ãè¿ããããã°ã®äŸ
Apr 8 00:04:25 kube-bnkjtdvd03sqjar31uhg-cgliksp01-cgliksp-00001442 kubelet.service[6175]: E0408 00:04:25.472682 6175 reflector.go:123] object-"ibm-observe"/"sysdig-agent": Failed to list *v1.ConfigMap: Get https://172.20.0.1:2040/api/v1/namespaces/ibm-observe/configmaps?fieldSelector=metadata.name%3Dsysdig-agent&limit=500&resourceVersion=0: write tcp 172.20.0.1:22501->172.20.0.1:2040: use of closed network connection
Apr 8 00:04:25 kube-bnkjtdvd03sqjar31uhg-cgliksp01-cgliksp-00001442 kubelet.service[6175]: E0408 00:04:25.472886 6175 reflector.go:123] object-"default"/"default-token-gvbk5": Failed to list *v1.Secret: Get https://172.20.0.1:2040/api/v1/namespaces/default/secrets?fieldSelector=metadata.name%3Ddefault-token-gvbk5&limit=500&resourceVersion=0: write tcp 172.20.0.1:22501->172.20.0.1:2040: use of closed network connection
æ«å®çã«èª°ããå©ããå Žåã«åããŠããããç§ãã¡ã®ç¹å®ã®åé¡ã解決ããå Žåã¯ãæŽæ°ãæçš¿ããŸãã
ç·åçæéã®çµ¶å¯Ÿäžéãèšå®ããæ§æãã©ã¡ãŒã¿ãŒããããã©ããç¥ãããã§ããïŒ --streaming-idle-connection-timeoutãèŠã€ãããŸããããæèšã«åºæã®ãã®ã¯ãããŸããã
ãetcdfailedïŒreason withheldããåå ã§APIãµãŒããŒãç°åžžã«ãªã£ãåŸãkube1.17.4ã§ãããçºçããŠããŸãã
ããã«ã¡ã¯ãã¿ããªã kubernetesãã€ããªãgolang1.14ã§åã³ã³ãã€ã«ããŸããã åé¡ãæ¶ããããã§ã
@mYmNeo golang 1.14 + kubernetes v1.17ïŒ
@mYmNeo golang 1.14 + kubernetes v1.17ïŒ
@pytimerã³ãŒããå€æŽããã«ãåã³ã³ãã€ã«ããã ãã§
ããïŒ ããã§åãåé¡ãçºçããŸãããk8s1.17.4ã§åé¡ã解決ããå Žåãgo 1.14ã§1.17.5ãåã³ã³ãã€ã«ã§ãããšæããŸããïŒ
æ®å¿µãªãããgo1.14ã«æŽæ°ããã«ã¯ãããã€ãã®äž»èŠã³ã³ããŒãã³ããæŽæ°ããå¿ èŠããããããKube1.17ã«æ»ãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã https://github.com/kubernetes/kubernetes/pull/88638ã§åé¡ãšé²è¡ç¶æ³ã远跡ã§ã
ç¥ã£ãŠãããšãããthx
@calliclesã¯ãgo 1.14ã§åã³ã³ãã€ã«ãããšåé¡ã解決ããããšã確èªãããŠããŸããïŒ
1.16.8ã§ãåãåé¡ãçºçããŠããŸããKubeletãããŒãã¹ããŒã¿ã¹ã®æçš¿ãåæ¢ããçç±ãšãéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çšãã«ãããããŒããNotReadyã«ãªãããšããããããŸãïŒå Žåã«ãã£ãŠã¯æ°æ¥ããšãå Žåã«ãã£ãŠã¯æ°é±éããšïŒããã°ãåãã
goã¯h2ã¢ããã°ã¬ãŒãã®åŠçã«åé¡ãããå¯èœæ§ããããŸãã
golang.org/x/net/http2/transport.go
upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper {
addr := authorityAddr("https", authority)
if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil {
go c.Close()
return erringRoundTripper{err} <--- "use of closed network connection" rised
}
ããã«ã¡ã¯ãã¿ããªã kubernetesãã€ããªãgolang1.14ã§åã³ã³ãã€ã«ããŸããã åé¡ãæ¶ããããã§ã
@mYmNeo go 1.14ã§åã³ã³ãã€ã«ããåŸãåé¡ãåçŸããããšããããŸãã
ããã«ã¡ã¯ãã¿ããªã kubernetesãã€ããªãgolang1.14ã§åã³ã³ãã€ã«ããŸããã åé¡ãæ¶ããããã§ã
@mYmNeo go 1.14ã§åã³ã³ãã€ã«ããåŸãåé¡ãåçŸããããšããããŸãã
AFAINãåé¡ã¯ããååšããŸããã
æ®å¿µãªãããgo1.14ã«æŽæ°ããã«ã¯ãããã€ãã®äž»èŠã³ã³ããŒãã³ããæŽæ°ããå¿ èŠããããããKube1.17ã«æ»ãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã ïŒ88638ã§åé¡ãšé²æç¶æ³ã远跡ã§ããŸã
go1.14ã1.18ã«ããã¯ããŒãããããã©ããã¯ãã§ã«ç¥ã£ãŠããŸããïŒ
go1.14ã1.18ã«ããã¯ããŒãããããã©ããã¯ãã§ã«ç¥ã£ãŠããŸããïŒ
ç§ã¯ããã¯æããªãã§ãããã etcdãšbboltãžã®å€æŽã¯ãgo1.14ããµããŒãããããã«å¿ èŠã§ããããã§ããããã¯ããªãªãŒã¹ãã©ã³ãã§éåžžè¡ãããããã倧ããªå€æŽã§ãã
@liggittããããŸããthxã ãã®éãïŒå°ãªããšãã¯ã©ã¹ã¿ãŒã«ã€ããŠã¯ïŒç·©åæŠç¥ãå¿ èŠãªããã§ã:)
ãã®åé¡ã¯NICã®é害åŸã«ã®ã¿çºçããŸããïŒ v1.16.8ã¯ã©ã¹ã¿ãŒã§ãåããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãããé¢é£ããNICé害ã¯ãããŸããã
SANãžã®æ¥ç¶æã«åºç€ãšãªãVMã§SCSIãšã©ãŒãçºçããã€ã³ã¹ã¿ã³ã¹ãå°ãªããšã1ã€ãããŸããã SCSIã®åé¡ã¯èªç¶ã«è§£æ±ºããŸãããã kubelet
ã¯å埩ããŸããã§ããã
--goaway-chance
ãªãã·ã§ã³ã¯1.18ïŒïŒ88567ïŒã§è¿œå ãããŸããã ãã®ãªãã·ã§ã³ã¯ãã®åé¡ã軜æžããŸããïŒ
ããããããã¯ãkubeletãå®éã«APIãµãŒããŒã«å°éããŠå¿çãè¿ãããšãã§ããå Žåã«ã®ã¿å¹æããããŸãã
NICãã³ãã倱æãããšïŒããã«å埩ããŸãïŒããã¹ãŠã®æ¥ç¶ãåæãããæåã§åèµ·åããªãéããæ¥ç¶ã®å確ç«ã¯åè©Šè¡ãããŸããã
䜿çšããŠãããã³ãã¢ãŒããæããŠãã ããã ã¢ã¯ãã£ãããã¯ã¢ãããã³ãã䜿çšããŠãã¯ã©ã¹ã¿ãŒã§ãããåçŸã§ããŸããã
Kubernetes 1.16ã«ã¢ããã°ã¬ãŒãããåŸã use of closed network connection
ãšã©ãŒãçºçãå§ããkubeletãapiserverã«åæ¥ç¶ãããããŒããNotReadyã®ãŸãŸã«ãªããŸããã NICãåæ¢ããïŒãªã³ã¯ãäžäžã«èšå®ããïŒããšã§åé¡ãåçŸããããšã¯ã§ããŸããã§ãããããã®åäœã¯ãããè² è·ã®é«ãã¯ã©ã¹ã¿ãŒã§ã®ã¿çºçããããšã«æ°ä»ããŸããã
ããã«æãäžããŠã¿ããšãgolangã®ãµãŒããŒåŽã®ã¯ã©ã€ã¢ã³ãåŽã®ããã©ã«ãã¯1000ã§ããããšãããããŸããããããã£ãŠãkubeletãapiserverããhttp2ã¹ããªãŒã ã®å¶éã«éãããšãããšã©ãŒãåãåã£ãå Žåãåæ¥ç¶ãè©Šã¿ãããšã¯ãããŸããã --http2-max-streams-per-connection=1000
ãèšå®ããåŸããã¹ãäžã«æåã«èŠã€ãã£ãã»ã©ãããŒããNotReadyã§ã¹ã¿ãã¯ãããšããåé¡ã¯èŠãããŸããã§ããã ããã¯ãkubeletãåæ¥ç¶ããªããšããåé¡ã解決ããŸããã§ããããçºçããŠããåé¡ã軜æžããã®ã«åœ¹ç«ã¡ãŸããã
Kubernetes 1.16ã«ã¢ããã°ã¬ãŒãããåŸã
use of closed network connection
ãšã©ãŒãçºçãå§ããkubeletãapiserverã«åæ¥ç¶ãããããŒããNotReadyã®ãŸãŸã«ãªããŸããã NICãåæ¢ããïŒãªã³ã¯ãäžäžã«èšå®ããïŒããšã§åé¡ãåçŸããããšã¯ã§ããŸããã§ãããããã®åäœã¯ãããè² è·ã®é«ãã¯ã©ã¹ã¿ãŒã§ã®ã¿çºçããããšã«æ°ä»ããŸãããããã«æãäžããŠã¿ããšãgolangã®ãµãŒããŒåŽã®ã¯ã©ã€ã¢ã³ãåŽã®ããã©ã«ãã¯1000ã§ããããšãããããŸããããããã£ãŠãkubeletãapiserverããhttp2ã¹ããªãŒã ã®å¶éã«éãããšãããšã©ãŒãåãåã£ãå Žåãåæ¥ç¶ãè©Šã¿ãããšã¯ãããŸããã
--http2-max-streams-per-connection=1000
ãèšå®ããåŸããã¹ãäžã«æåã«èŠã€ãã£ãã»ã©ãããŒããNotReadyã§ã¹ã¿ãã¯ãããšããåé¡ã¯èŠãããŸããã§ããã ããã¯ãkubeletãåæ¥ç¶ããªããšããåé¡ã解決ããŸããã§ããããçºçããŠããåé¡ã軜æžããã®ã«åœ¹ç«ã¡ãŸããã
ããã«ã¡ã¯ãããã©ã«ãã®ãµãŒããŒåŽhttpsã¹ããªãŒã ã¯kube-apiserverã§1000ã§ããããã¯ãã¯ã©ã€ã¢ã³ãã®å€ãšåãã§ãã
https://github.com/kubernetes/kubernetes/blob/ae1103726f9aea1f9bbad1b215edfa47e0747dce/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go#L62
@warmchangããã¯apiextensionsapiserversãšãµã³ãã«apiserverã«åœãŠã¯ãŸããšæããŸãã
https://github.com/kubernetes/kubernetes/blob/ae1103726f9aea1f9bbad1b215edfa47e0747dce/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go#L62
--http2-max-streams-per-connection
ãèšå®ããã«curlãã¹ãã䜿çšãããã¹ãã§ã¯ãapiserverãã°ã«æ¬¡ã®ããã«èšé²ãããŸãïŒv1.16ã䜿çšïŒã
I0603 10:18:08.038531 1 flags.go:33] FLAG: --http2-max-streams-per-connection="0"
ãããŠãcurlãªã¯ãšã¹ãã¯å¿çã§ããã瀺ããŸãïŒ
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
--http2-max-streams-per-connection=1000
ã䜿çšãããšãcurlãªã¯ãšã¹ãã衚瀺ãããŸã* Connection state changed (MAX_CONCURRENT_STREAMS == 1000)!
@jmcmeek @treytabner ããã®éãã§ãã ã³ãŒããèªã¿ééããŸããã ïŒ+1ïŒ
ããã§ã¯kubernetes1.17.6ãšåããã®ã䜿çšããŸãã kubeletããããhttp2æ¥ç¶ã䜿çšããŠããããã§ãã
kube-apiserverãškubeletã®éã§ããã©ã«ãå€MAX_CONCURRENT_STREAMS
äžè²«æ§ããªãããšã«æ°ã¥ããŸããã
ãµãŒããŒåŽã®å€ã1000ã«èšå®ããã ãã§ããåŸã§å ±åããŸãã
ã©ã³ãã£ãŒ/ RKE
ã¯ã©ã¹ã¿ãŒå®çŸ©ã«è¿œå ïŒ
kube-api:
extra_args:
http2-max-streams-per-connection: '1000'
ãã¹ã¿ãŒããŒãã確èªããŸãã
docker exec -it kubelet bash
apt update && apt-get install -y nghttp2
nghttp -nsv https://127.0.0.1:6443
#Look for SETTINGS_MAX_CONCURRENT_STREAMS
APIserverã§MAX_CONCURRENT_STREAMS
ã1000
ã«èšå®ããŠãããã®åé¡ã«ã¯åœ±é¿ããŸããã
ããã¯golang http2 Transport
æ¬ é¥ãåå ã ãšæããŸããã äžèšãåç
§
ä»å€ããã®åé¡ãçºçããŸããã
'MAX_CONCURRENT_STREAMS'ãèšå®ããŠã圹ã«ç«ããªãã£ãããã§ãâ¹ïž
ããã«ã¡ã¯ãã¿ããªã ç§ã¯ã€ãã«ãã®åé¡ãçªãæ¢ãããšæããŸãã æšå€ãåãåé¡ãçºçããŸããã ããããä¿®æ£ãããkubeletã§æ£åžžã«å埩ããŸããã
ããã¯Kubernetesã®ãã°ã§ã¯ãªãã client-go
ã䜿çšããŠããgolangã®æšæºã®net/http
ããã±ãŒãžã«é¢ãããã®ã§ãã
golang.org/x/net/http2/transport.go
æ¬ é¥ããããšæããŸã
ãã§ã«ããã¯golangã®å
¬åŒã«å ±åãããŠããŸãã ããã€ãã®è°è«ãåŸ
ã£ãŠããŸãã
https://github.com/golang/go/issues/39750
ä»ã®ãšããã httpsïŒ//github.com/golang/net/commit/0ba52f642ac2f9371a88bfdde41f4b4e195a37c0ã«ãã£ãŠå°å
¥ãããhttp2: perform connection health check
ãããã©ã«ãã§æå¹ã«ãªãããã«ã³ãŒããå€æŽããŸããã
ããã¯ããã®åé¡ã®å©ãã«ãªãããšãããããŸãã ããããå°ãåå¿ãé
ãã
kubelet v1.17.6ãã°ïŒèªå·±ä¿®æ£ããã
golang.org/x/net
ããã±ãŒãžã«æºæ ïŒ
æ¥ç¶åãã®åé¡ã®æžã蟌ã¿ããã¯å埩ããŸããããäºæ³ãããå°ãæéãããããŸããã
performing http2 healthCheck
ã¯ã healthCheck
funcãreadIdleTimer
ã«ãã£ãŠåŒã³åºãããŠããããšã蚌æããããã«ãããã«æ®ããŠããã€ããã ã£ããã°ã¡ãã»ãŒãžã§ããããšã«æ³šæããŠãã ããã
Jun 23 03:14:45 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ45.912484 22255 kubelet_node_status.goïŒ402]ããŒãã¹ããŒã¿ã¹ã®æŽæ°äžã«ãšã©ãŒãçºçããŸãããåè©Šè¡ããŸãïŒããŒããvm10.company.comãã®ååŸäžã«ãšã©ãŒãçºçããŸããïŒGet ãhttps://vm10.company.com:8443/api/v1/nodes/vm10.company.com?timeout=10sãïŒæžã蟌ã¿tcp 16.155.199.4ïŒ39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:45 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ45.912604 22255 kubelet_node_status.goïŒ402]ããŒãã¹ããŒã¿ã¹ã®æŽæ°äžã«ãšã©ãŒãçºçããŸãããåè©Šè¡ããŸãïŒããŒããvm10.company.comãã®ååŸäžã«ãšã©ãŒãçºçããŸããïŒGet ãhttps://vm10.company.com:8443/api/v1/nodes/vm10.company.com?timeout=10sãïŒæžã蟌ã¿tcp 16.155.199.4ïŒ39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:45 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ45.912741 22255 kubelet_node_status.goïŒ402]ããŒãã¹ããŒã¿ã¹ã®æŽæ°äžã«ãšã©ãŒãçºçããŸãããåè©Šè¡ããŸãïŒããŒããvm10.company.comãã®ååŸäžã«ãšã©ãŒãçºçããŸããïŒGet ãhttps://vm10.company.com:8443/api/v1/nodes/vm10.company.com?timeout=10sãïŒæžã蟌ã¿tcp 16.155.199.4ïŒ39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:46 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ46.367046 22255 controller.goïŒ135]ããŒããªãŒã¹ãååšããããšã確èªã§ããŸããã§ããã400msåŸã«åè©Šè¡ããŸãããšã©ãŒïŒGet "httpsïŒ// vm10.company.com:8443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/vm10.company.com?timeout=10s "ïŒtcp 16.155.199.4:39668->16.155ãæžã蟌ã¿ãŸãã 199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:48 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ47.737579 22255 controller.goïŒ135]ããŒããªãŒã¹ãååšããããšã確èªã§ããŸããã§ããã800msã§åè©Šè¡ããŸãããšã©ãŒïŒGet "httpsïŒ// vm10.company.com:8443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/vm10.company.com?timeout=10s "ïŒtcp 16.155.199.4:39668->16.155ãæžã蟌ã¿ãŸãã 199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.113920 22255 Reflector.goïŒ153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458ïŒãªã¹ãã«å€±æããŸãã* v1.NodeïŒGet "https://vm10.company.com:8443/api/v1/nodes?fieldSelector=metadata.name%3Dvm10.company.com&limit=500&resourceVersion=0"ïŒwrite tcp 16.155.199.4:39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ48.744770 22255 Reflector.goïŒ153]ãªããžã§ã¯ã-"kube-system" / "flannel-token-zvfwn"ïŒãªã¹ãã«å€±æããŸãã* v1.SecretïŒãhttps://vm10.company.com:8443/api/v1/namespaces/kube-system/secrets?fieldSelector=metadata.name%3Dflannel-token-zvfwn&limit=500&resourceVersion=0ããååŸïŒtcp16.155ãæžã蟌ã¿ãŸã.199.4ïŒ39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.599631 22255 Reflector.goïŒ153]ãªããžã§ã¯ã-"kube-system" / "coredns"ïŒ* v1.ConfigMapã®äžèŠ§è¡šç€ºã«å€±æããŸããïŒ ãhttps://vm10.company.com:8443/api/v1/namespaces/kube-system/configmaps?fieldSelector=metadata.name%3Dcoredns&limit=500&resourceVersion=0ããååŸããŸããtcp16.155.199.4ïŒ39668-> 16.155ãæžã蟌ã¿ãŸãã 199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.599992 22255 controller.goïŒ135]ããŒããªãŒã¹ãååšããããšã確èªã§ããŸããã§ããã1.6ç§ã§åè©Šè¡ããŸãããšã©ãŒïŒGet "httpsïŒ/ /vm10.company.com:8443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/vm10.company.com?timeout=10s "ïŒwrite tcp 16.155.199.4:39668-> 16.155 .199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.600182 22255 Reflector.goïŒ153] k8s.io/kubernetes/pkg/kubelet/kubelet.go:449ïŒãªã¹ãã«å€±æããŸãã* v1.ServiceïŒGet "https://vm10.company.com:8443/api/v1/services?limit=500&resourceVersion=0"ïŒwrite tcp 16.155.199.4:39668->16.155.199.4:8443ïŒã¯ããŒãºããããã¯ãŒã¯ã®äœ¿çšç¹ãã Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.600323 22255 Reflector.goïŒ153]ãªããžã§ã¯ã-"kube-system" / "kube-flannel-cfg"ïŒãªã¹ãã«å€±æããŸãã* v1.ConfigMapïŒãhttps://vm10.company.com:8443/api/v1/namespaces/kube-system/configmaps?fieldSelector=metadata.name%3Dkube-flannel-cfg&limit=500&resourceVersion=0ããååŸïŒtcp16.155ãæžã蟌ã¿ãŸã.199.4ïŒ39668-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.600463 22255 Reflector.goïŒ153]ãªããžã§ã¯ã-"core" / "registrypullsecret"ïŒãªã¹ãã«å€±æããŸãã* v1.SecretïŒGet " https://vm10.company.com:8443/api/v1/namespaces/core/secrets?fieldSelector=metadata.name%3Dregistrypullsecret&limit=500&resourceVersion=0 "ïŒwrite tcp 16.155.199.4:39668->16.155.199.4:8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:14:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ14ïŒ49.369097 22255 Reflector.goïŒ153]ãªããžã§ã¯ã-"kube-system" / "registrypullsecret"ïŒ* v1.Secretã®äžèŠ§è¡šç€ºã«å€±æããŸããïŒ ãhttps://vm10.company.com:8443/api/v1/namespaces/kube-system/secrets?fieldSelector=metadata.name%3Dregistrypullsecret&limit=500&resourceVersion=0ããååŸããŸããtcp16.155.199.4ïŒ39668-> 16.155ãæžã蟌ã¿ãŸãã 199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:25:39 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ25ïŒ39.543880 22255desired_state_of_world_populator.goïŒ320]ããããfluentd-h76lr_coreïŒe95c9200-3a0cãã®ããªã¥ãŒã ãdeployment-log-dirãã®åŠçäžã«ãšã©ãŒãçºçããŸãã-4fea-bd7f-99ac1cc6ae7aïŒ "ïŒPVCã³ã¢/ itom-vol-claimã®åŠçäžã«ãšã©ãŒãçºçããŸããïŒAPIãµãŒããŒããPVCããã§ããã§ããŸããã§ããïŒ" https://vm10.company.com:8443/api/v1/namespaces/core/ persistentvolumeclaims / itom-vol-claim "ïŒtcp 16.155.199.4ïŒ41512-> 16.155.199.4ïŒ8443ãèªãïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:25:39 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ25ïŒ39.666303 22255 kubelet_node_status.goïŒ402]ããŒãã¹ããŒã¿ã¹ã®æŽæ°äžã«ãšã©ãŒãçºçããŸãããåè©Šè¡ããŸãïŒã¹ããŒã¿ã¹ "{\" status \ "ã®ãããã«å€±æããŸããïŒ {\ "$ setElementOrder / Conditions \"ïŒ[{\ "type \"ïŒ\ "MemoryPressure \"}ã{\ "type \"ïŒ\ "DiskPressure \"}ã{\ "type \"ïŒ\ "PIDPressure \ "}ã{\" type \ "ïŒ\" Ready \ "}]ã\" Conditions \ "ïŒ[{\" lastHeartbeatTime \ "ïŒ\" 2020-06-22T19ïŒ25ïŒ29Z \ "ã\" type \ "ïŒ\" MemoryPressure \ "}ã{\" lastHeartbeatTime \ "ïŒ\" 2020-06-22T19ïŒ25ïŒ29Z \ "ã\" type \ "ïŒ\" DiskPressure \ "}ã{\" lastHeartbeatTime \ "ïŒ \ "2020-06-22T19ïŒ25ïŒ29Z \"ã\ "type \"ïŒ\ "PIDPressure \"}ã{\ "lastHeartbeatTime \"ïŒ\ "2020-06-22T19ïŒ25ïŒ29Z \"ã\ "ããŒããvm10.company.comãã®type \ "ïŒ\" Ready \ "}]}}"ïŒããã "https://vm10.company.com:8443/api/v1/nodes/vm10.company.com/ statusïŒtimeout = 10s "ïŒread tcp 16.155.199.4ïŒ41512-> 16.155.199.4ïŒ8443ïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:25:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ25ïŒ49.553078 22255 kubelet_node_status.goïŒ402]ããŒãã¹ããŒã¿ã¹ã®æŽæ°äžã«ãšã©ãŒãçºçããŸãããåè©Šè¡ããŸãïŒããŒããvm10.company.comãã®ååŸäžã«ãšã©ãŒãçºçããŸããïŒGet ãhttps://vm10.company.com:8443/api/v1/nodes/vm10.company.com?timeout=10sãïŒtcp16.155.199.4:41718->16.155.199.4:8443ãèªãïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:25:49 vm10.company.com kubelet [22255]ïŒE0623 03ïŒ25ïŒ49.560723 22255desired_state_of_world_populator.goïŒ320]ããããfluentd-h76lr_coreïŒe95c9200-3a0c-4feaãã®ããªã¥ãŒã ãlog-locationãã®åŠçäžã«ãšã©ãŒãçºçããŸãã-bd7f-99ac1cc6ae7aïŒ "ïŒPVCã³ã¢/ itom-logging-volã®åŠçäžã«ãšã©ãŒãçºçããŸããïŒAPIãµãŒããŒããPVCããã§ããã§ããŸããã§ããïŒ" https://vm10.company.com:8443/api/v1/namespaces/core/persistentvolumeclaims/ itom-logging-vol "ïŒtcp 16.155.199.4ïŒ41718-> 16.155.199.4ïŒ8443ãèªã¿åããŸãïŒéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çš Jun 23 03:27:29 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ27ïŒ29.961600 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã Jun 23 03:31:32 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ31ïŒ31.829860 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã Jun 23 03:31:44 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ31ïŒ44.570224 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã Jun 23 03:32:13 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ32ïŒ12.961728 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã Jun 23 03:33:16 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ33ïŒ15.441808 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã Jun 23 03:33:28 vm10.company.com kubelet [22255]ïŒI0623 03ïŒ33ïŒ28.233121 22255 log.goïŒ181] http2healthCheckãå®è¡ããŠããŸã
use of closed network connection
å ±åãããªããªããkubeletã¯Readyç¶æ
ã«æ»ããŸã
ã¹ã¿ãã¯å
ã®åé¡ã«ã€ããŠãããã€ãã®æ°ããæœåšçãªæŽå¯ãåŸãŸããã ããçšåºŠã®èªä¿¡ãæã£ãŠãç¹å®ã®ç¶æ³ã§ã®æ¥ç¶çªå·ã«é¢ããé«è² è·ã®ããã«ããããã¯ãŒã¯/ã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ãã«ã§ãŸãã«æ¥ç¶ãäœäžãããšæ³å®ããŸãããããã£ãŠããã®å Žåããããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®å転ã§ã¯ãããŸããã§ããã ç¹ã«ãã¯ã©ã€ã¢ã³ãåŽã§http2ã«åãæ¿ãããããPrometheusãã§ãã¬ãŒã·ã§ã³ã§åé¡ãçºçããŸããã èšå®ããããšã«ãããHTTP2ãã«ã¹ã¢ãã¿ãæå¹ã«ããhttp2.Transport.ReadIdleTimeout
çšããŠå®è£
ãšããŠgolang/net#55
å®å
šã«ç§ãã¡ã®ããã«ãã§ãã¬ãŒã·ã§ã³ã®åé¡ã解決ããŸããã
apimachinery/pkg/util/net/http.go
http.Transport
ãã€ã³ã¹ã¿ã³ã¹åãããããå
éšçã«http2ã«ã¢ããã°ã¬ãŒããããããå€ã¯çŸåšå
¬éãããŠããŸãããããã¯ãgolang / netïŒ74ãããŒãžããããŸã§ãªãã·ã§ã³ãå
¬éããŸããã
kubelet restart cronãžã§ã以å€ã«ä»ã®åé¿çã¯ãããŸããïŒ cronãžã§ãã1é±éå®æœããŸããããåé¡ã®çºçãæ¢ããããšã¯ã§ããŸããã§ããã
v1.17.3ã§ãåãåé¡ãçºçããŸãã
ç§ãèŠã€ããã®ã¯ãç¹å®ã®golang.org/x/net
ããŒãžã§ã³ã䜿çšããk8sããŒãžã§ã³ã«åé¡ãããããã®ããã±ãŒãžã¯ä¿®æ£ãããŠããããã§ãã
https://go-review.googlesource.com/c/net/+/198040
ãã®åé¡ã®ããããŒãžã§ã³ïŒv1.16.5ãææ°ãªãªãŒã¹ïŒ
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9
ããŒãžã§ã³ã®ä¿®æ£ïŒãã¹ã¿ãŒãã©ã³ãïŒ
golang.org/x/net v0.0.0-20200707034311-ab3426394381
golang.org/x/net
ããã±ãŒãžãæŽæ°ãããšããã®åé¡ã¯ä¿®æ£ãããŸããïŒ
ãããä¿®æ£ããããã«ãç¶æãããŠããk8sããŒãžã§ã³ïŒv1,16ã1.17ãv1,18 ..ïŒã®ãªãªãŒã¹ãèšç»ãããŠããŸããïŒ
ç§ãèŠã€ããã®ã¯ãç¹å®ã®
golang.org/x/net
ããŒãžã§ã³ã䜿çšããk8sããŒãžã§ã³ã«åé¡ãããããã®ããã±ãŒãžã¯ä¿®æ£ãããŠããããã§ãã
https://go-review.googlesource.com/c/net/+/198040
äžèšã®å€æŽã¯ãHTTP2ãã«ã¹ã¢ãã¿ãŒãæå¹ã«ããå¯èœæ§ãæäŸããã ãã§ãããéçºè ãæå¹ã«ããå¿ èŠããããŸãïŒããã©ã«ãã¯ãªãã§ãïŒã ããã«ãå®éã«èšå®ãããéçºè ã«ãã«ã¹ã¢ãã¿ãŒãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããã«ãªã¯ãšã¹ãã
çŸåšãåé¡ã®è§£æ±ºã«åœ¹ç«ã€ããšãæåŸ ããŠãç¬èªã®Kubernetesãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ãã«ã¹ã¢ãã¿ãŒãæå¹ã«ãããªãã¬ã¯ã·ã§ã³ããŒã¹ã®ããããã£ãã¯ã¹ãçµ±åããŠããŸãã
-
ã€ã§ã³ã¹ãšã©ã\
@JensEratåçããããšãããããŸãã
ãã®å Žåããã®åé¡ã¯å€ãããŒãžã§ã³ã®k8sïŒ1.13ã1.15ã..ïŒã§ãçºçããå¯èœæ§ããããŸããïŒ
1ãæ以äžåã«ããŒããã£ã¹ããªãã¥ãŒã·ã§ã³ãRancherOSïŒã«ãŒãã«4.14.138ïŒããUbuntu 18.04ïŒã«ãŒãã«5.3.0ïŒã«å€æŽããŸãããããã以éãåé¡ã¯çºçããŠããŸããã
ç§ã®ã¯ã©ã¹ã¿ãŒã®1ã€ãRancherOSã«æ®ã£ãŠããããã®åé¡ã¯ãã§ã«3ååçŸãããŠããŸãã
100ïŒ shureã§ã¯ãããŸããããããããã«ãŒãã«ããŒãžã§ã³ãéèŠã§ãã
èšãã«ããã ç§ãã¡ã¯ééããªã1.16ãã1.18ã®åé¡ã芳å¯ããŸããã以åã¯ãŸããªå¥åŠãªãã¯ãã¬ããã¹ã¿ãã¯ã®çºçãããããŸããã ç§ãã¡ã¯å°ãªããšã1幎åãããã®ãããªåé¡ãæãäžããŸããããäœãçžé¢ãããããšã¯ã§ããŸããã§ããïŒæ°é±éãã¹ãŠã®åäžã®ã€ã³ã·ãã³ããããã³4æ¡ã®æ°ã®kubeletãå®è¡ãããŠããŸãïŒã 1.16ãã€ã³ã¹ããŒã«ããŠããããã«æªåããŸããããçŸåšãæ ¹æ¬çãªïŒéåžžã«ãŸãã§è¿œè·¡ãé£ãã...ïŒãããã¯ãŒã¯ã®åé¡ãããé »ç¹ã«çºçãããšæ³å®ããŠããŸãã ã«ãŒãã«5.3.0-46-genericã§Ubuntu19.10ãå®è¡ããŠããŸããã圱é¿ãåããŸãïŒå®éã«æ°ãããããã¬ãã«ãååŸããå¯èœæ§ããããŸãïŒã å®è¡ããŠããæ£ç¢ºãªã«ãŒãã«ããŒãžã§ã³/ãããã¬ãã«ã®ãã³ããæããŠãã ããã
-
ã€ã§ã³ã¹ãšã©ã\
5.3.0-59-generic
ã§ãã ããããã¯ãã¬ãã¯40åãããªãã®ã§ãããã§ãå¶ç¶ãããããŸããã
ç§ãäžã§èšã£ãããã«ã ãã®åé¡ã¯ãè² è·ã®é«ãã¯ã©ã¹ã¿ãŒã§ããé »ç¹ã«çºçããŸãã h2ãã©ã³ã¹ããŒãhealthCheckãæå¹ã«ããåã«ãã»ãŒæ¯æ©åãåé¡ãçºçããŸããã
golangã®å
¬åŒã«å ±åãã
åé¡ã¯ã«ãŒãã«ã«éåžžã«è¿ããããã¯ãŒã¯ãœã±ãããåå ã§ããããããããã¯ã«ã¯å°ãé ãã§ãã ã«ãŒãã«ãæŽæ°ããããšã¯åœ¹ç«ã€ãããããŸããããããã§ãªããããããŸããã ïŒè¿œèšïŒã«ãŒãã«3.10ã§centos 7ã䜿çšããŠããŸãããhealthCheckãæå¹ã«ããåã«ã»ãŒæ¯æ¥çºçããŸãïŒ
ç§ãèŠãéãã§ã¯ãnet / httpã®ãœãŒã¹ã³ãŒããèªãã§çŽ3æ¥éãè²»ãããh2ãã©ã³ã¹ããŒãhealthCheckãæå¹ã«ããŠããã®ãããªåé¡ããã®å埩ãæ¯æŽããŸãããããããããšã§ããã®å¥åŠãªç¶æ³ããæ¬åœã«éããŸããã
@JensErat healthCheckãæå¹ã«ããŠãã®åé¡ã解決ããã®ã«åœ¹ç«ã€å
·äœçãªèšŒæ ã¯ãããŸããïŒ
@JensErat healthCheckãæå¹ã«ããŠãã®åé¡ã解決ããã®ã«åœ¹ç«ã€å ·äœçãªèšŒæ ã¯ãããŸããïŒ
Kubernetesã¯ã©ã¹ã¿ãŒããšã«Prometheusãã§ãã¬ãŒã·ã§ã³ãå®è¡ããŠããŸãã Prometheus 2.19.0ã¯http2ãå°å ¥ããŸããïŒãã ããå€æŽãã°ã§ããã«ã€ããŠèšåããã®ãå¿ããŠãããã³ãããã¡ãã»ãŒãžã®æ¬æã«é ãããŠãããããgit bisectããããã€ããå®è¡ããšã«æ°æéåŸ ã€å¿ èŠããããŸãã...ïŒ 1æ¥ã«ãã§ãã¬ãŒã·ã§ã³ãã¹ã¿ãã¯ãã12件ã®ã€ã³ã·ãã³ãã ç§ã¯æåã«http2ãµããŒãã«å床ããããé©çšãïŒãããŠåé¡ã¯ãªããªããŸããïŒã次ã«èªã¿åãã¿ã€ã ã¢ãŠããgolang / net / x / http2ã§çŽæ¥èšå®ããŸããã ãã以æ¥ããã§ãã¬ãŒã·ã§ã³ããŠã³ã®ã€ã³ã·ãã³ãã¯1ã€ããããŸããã§ããã
çŸåšãããããé©çšããKubernetesãªãªãŒã¹ãäžéšã®ã¯ã©ã¹ã¿ãŒã§å±éããæºåãããŠãããããæ°æ¥ã§ããŒã¿ãååŸã§ããã¯ãã§ãã é©åãªããŒã¿ãåŸãã次第ãçµæã確å®ã«å ±æããŸãã
-
ã€ã§ã³ã¹ãšã©ã\
çŸåšãããããé©çšããKubernetesãªãªãŒã¹ãäžéšã®ã¯ã©ã¹ã¿ãŒã§å±éããæºåãããŠãããããæ°æ¥ã§ããŒã¿ãååŸã§ããã¯ãã§ãã é©åãªããŒã¿ãåŸãã次第ãçµæã確å®ã«å ±æããŸãã
ãæèŠãããã ãããããšãããããŸãã ããã¯ãšãŠã楜ããã¡ãã»ãŒãžã§ãã
æ ¹æ¬çãªåå ã¯ããŸãæ確ã§ã¯ãããŸããããå°ãªããšãç§ãã¡ã¯çœå®³ããå埩ããæ¹æ³ãèŠã€ããŠããŸãã ïŒNS
k8s v1.14.3ã§ãåãåé¡ãçºçããŠãããkubeletãåèµ·åãããšåé¡ã解決ã§ããŸãã
ããã¯ã°ãããŠããããšã¯ç¥ã£ãŠããŸãããäžæçãªåé¿çãšããŠæ©èœããå¿
èŠããããŸããyamlãå±éããŸã
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kubelet-face-slapper
namespace: kube-system
spec:
selector:
matchLabels:
app: kubelet-face-slapper
template:
metadata:
labels:
app: kubelet-face-slapper
spec:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/controlplane
operator: Equal
value: "true"
- effect: NoExecute
key: node-role.kubernetes.io/etcd
operator: Equal
value: "true"
containers:
- command:
- /bin/sh
- -c
- while true; do sleep 40; docker logs kubelet --since 1m 2>&1 | grep -q "use
of closed network connection" && (docker restart kubelet ; echo "kubelet
has been restarted due to connection error") || echo "kubelet connection
is ok" ;done
image: docker:stable
name: kubelet-face-slapper
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
volumes:
- hostPath:
path: /var/run/docker.sock
type: File
name: docker-sock
ïŒããã¯ç§å Žäž»åºæã§ãããç¹æš©ã³ã³ãããŒãšjournalctl / systemctlã䜿çšããããšã§ãä»ã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ç°¡åã«é©åãããããšãã§ããŸãïŒ
sleep
ãš--since
ã¯ãã¯ã©ã¹ã¿ãŒã®pod-eviction-timeout
ïŒããã©ã«ãã§ã¯5mïŒãããçãããå¿
èŠããããŸã
ãšããã§-ç§å Žäž»åŽåè
ããŒãã®docker pause nginx-proxy
ã¯ãkubeletã«åããšã©ãŒã¡ãã»ãŒãžãçæãããŸãã
VMWarevSphereã§K8Sãå®è¡ããŠãããŠãŒã¶ãŒã®äžæçãªåé¿ç-K8SVMã®DRSã
æ°ããgolanghttp2ãã«ã¹ãã§ãã¯æ©èœã䜿çšããåé¡ã®è»œæžã«é¢ããŠéåžžã«è¯ããã¥ãŒã¹ããããŸããåé¡ã¯ãããããŸããã ãããŸã§ã§ãPrometheusãKuberneteså
šäœãããã³ããã€ãã®å
éšã³ã³ããŒãã³ãã«ãä¿®æ£ãïŒãã³ããŒã®x/net
ã³ãŒãã®å€ã®ããŒãã³ãŒãèšå®ïŒãå®è£
ãã次ã®ããšã確èªããŸããã
ããã«ãåé¡ãåŒãèµ·ããæ¹æ³ã«ã€ããŠæ°ããæŽå¯ãåŸãããšãã§ããŸããã ã©ã€ããã€ã°ã¬ãŒã·ã§ã³ã«é¢ãã@ vi7ã®èŠ³å¯çµæã¯ãããçšåºŠã®èªä¿¡ãæã£ãŠç¢ºèªã§ããŸãïŒãã ãã远跡ããããšã¯ã§ããŸãïŒãå°ãªããšããå®è¡ããŠããNSXããŒãžã§ã³ã§ã¯ãããŒããã©ã³ãµãŒã®å€æŽã«ãã£ãŠãã®ãããªåé¡ãçºçããå¯èœæ§ããããŸãïŒVMwareãšã®ãã±ããããããŸããå°æ¥çã«ãªã»ãããã±ãããéä¿¡ããŠããããšã確èªããŠãã ããïŒã ãŸããæ¥ç¶ããŒãã«ã®ãªãŒããŒãããŒãªã©ãä»ã®å€ãã®çç±ã§æ¥ç¶ãéäžã§ãããããããå¯èœæ§ããããŸãã
ããã¯ãKubernetesã®äžéšã®ãŠãŒã¶ãŒã«ãšã£ãŠéåžžã«åä»ã§ãã倧èŠæš¡ãªåé¡ã§ãïŒIaaSã¬ã€ã€ãŒ/ãããã¯ãŒã¯ã®ããçš®ã®ãç Žæãã«äŸåããŠãããšæããŸãïŒã å€ãé©åã«èšå®ããããã«ã€ã³ã¿ãŒãã§ãŒã¹ãå ¬éããããšã«ã€ããŠã®golangã®è°è«ããããŸããããªãã¬ã¯ã·ã§ã³ãéããŠãããã®å€ãèšå®ããPRããŒãžã¢ããã¹ããªãŒã ãååŸããå¯èœæ§ã¯ãããšæããŸããïŒx / netããã©ãŒã¯ãããããä»ã®ããã«è¯ããšæããŸãïŒ ïŒ ã³ãŒãã®æäŸã¯åé¡ãããŸããïŒä¿®æ£ãæ€èšŒãããšãå®éã«åçŸããããšã¯ã§ããŸããããä¿®æ£ãæ©èœãããã©ããã確èªã§ããã»ã©é »ç¹ã«èŠ³å¯ããŸãïŒã
cc @liggitt
é·æçãªåé¡ïŒèªå·±ã¡ã¢ïŒ
@JensEratåçããããšãããããŸãã
ãã®å Žåããã®åé¡ã¯å€ãããŒãžã§ã³ã®k8sïŒ1.13ã1.15ã..ïŒã§ãçºçããå¯èœæ§ããããŸããïŒ
Kubernetesv1.16.13ã®åé¡ã確èªã§ããŸã
Kubernetesv1.15.9ã§ã¯åé¡ã¯çºçããŸããã§ãã
etcdã¹ãããã·ã§ããããã¯ã¢ããããkubenetesã¯ã©ã¹ã¿ãŒv1.16.14
ã埩å
ãããšã ãã®ãšã©ãŒã¯kubeletãã°ã«è¡šç€ºãããŸãã
@ ik9999ã«æè¬ããŸãã kubeletãåèµ·åãããšããšã©ãŒããªããªããŸã
[root@dev-k8s-master ~]# journalctl -u kubelet -n 1 | grep "use of closed network connection"
Aug 22 11:31:10 dev-k8s-master kubelet[95075]: E0822 11:31:10.565237 95075 reflector.go:123] k8s.io/client-go/informers/factory.go:134: Failed to list *v1beta1.CSIDriver: Get https://apiserver.cluster.local:6443/apis/storage.k8s.io/v1beta1/csidrivers?limit=500&resourceVersion=0: write tcp 192.168.160.243:58374->192.168.160.243:6443: use of closed network connection
[root@dev-k8s-master ~]# systemctl restart kubelet
[root@dev-k8s-master ssh]# journalctl -u kubelet -n 1 | grep "use of closed network connection"
1.17.3ã§åãåé¡ãçºçããŸããããkubeletãåèµ·åãããšè§£æ±ºããŸãã ããã«å¯Ÿããå®å®ããåé¿çã¯ãããŸããããŸãã¯ããããã€ä¿®æ£ãããã®ã§ããïŒ
v1.18.6åã
@ rxwang662001
ããã¯ãã¢ããã¹ããªãŒã ã®golangã®åé¡ãåå ã§ãã 確ããªããšã®1ã€ã¯ãããã¯go1.15ã§ã¯ä¿®æ£ãããªããšããããšã§ãã
äžæ¹ãKubernetesã³ãã¥ããã£ã¯ã1.14LOLãžã®ç§»è¡ã«ãŸã èŠåŽããŠããŸãã
éåžžãgoã¯6ãæããšã«ãªãªãŒã¹ããŸãã ãã¹ãŠãããŸãããã°ãæ¥å¹Žã«ã¯ã¢ããã¹ããªãŒã ã§ãã®åé¡ã解決ãããå¯èœæ§ããããkubernetesãä¿®æ£ãæ¡çšãããŸã§ã¯ãã1幎ããããããããŸããð¥ïŒ
ïŒåè«ã§ãããããä»ããã¹ã¿ãã¯ã§ä¿®æ£ãããå Žåã¯ãh2Transportãããã¯ããŠhealthCheckãæ©èœããŠããããšã蚌æãããŸããã
äžæ¹ãKubernetesã³ãã¥ããã£ã¯ã1.14LOLãžã®ç§»è¡ã«ãŸã èŠåŽããŠããŸãã
å®éãgo1.15ãã¬ãªãªãŒã¹ã§èªå®ããããã®sig-scalabilityãšsig-releaseã«ããåªããäœæ¥ã«ãããKubernetes1.19ã¯go1.15ã§ãªãªãŒã¹ãããã°ããã§ãã go1.16ã§http / 2ãªãã·ã§ã³ãå ¬éããäœæ¥ãé²è¡äžã®ããã§ãããå©çšå¯èœã«ãªã次第ããããå©çšããäºå®ã§ãã
å®éãgo1.15ãã¬ãªãªãŒã¹ã§èªå®ããããã®sig-scalabilityãšsig-releaseã«ããåªããäœæ¥ã«ãããKubernetes1.19ã¯go1.15ã§ãªãªãŒã¹ãããã°ããã§ãã
Oppsã åä»ãªåè«ã§ããããªããã v1.19ãªãªãŒã¹ã«ã¯ããŸã泚æãæã£ãŠããŸããã§ããã
K8Sã§go1.14ãå®å
šã«ã¹ãããããããã§ããïŒ ããã ããã¯å€§ããªé£èºã§ãð
@povsister
ãœãªã¥ãŒã·ã§ã³ãå ±æããŠããã ãããããšãããããŸãã ãããã©ã®ããã«æ©èœããããã«ã€ããŠãããå°ã詳ããæããŠãã ããã
ä»ã®ãšããã golang / net @ 0ba52f6ã«ãã£ãŠå°å ¥ããã
http2: perform connection health check
ãããã©ã«ãã§æå¹ã«ãªãããã«ã³ãŒããå€æŽããŸããã
ããã¯ããã®åé¡ã®å©ãã«ãªãããšãããããŸãã ããããå°ãåå¿ãé ãã
ã©ã®ãããªã³ãŒãå€æŽãå®æœããŸãããïŒ ãããŠãã©ãã§ãã©ã®ãã¡ã€ã«ã§ïŒ
@KarthikRangaraju
h2Transportãåæåãããšãã«healthCheckãæå¹ã«ããã«ã¯ããã®PRãåç
§ããŠãã ããã
ãŸãã¯ããªãã¬ã¯ã·ã§ã³/å®å
šã§ãªããªãã»ããããã¯ãå®è¡ããŠãå®è¡æã«ãšã¯ã¹ããŒããããŠããªããã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã
ãããŠããã®ãããªããšãããåã«ãgolang / x / netãæŽæ°ããããšãå¿ããªãã§ãã ããã
æã çŽé¢ããŸããããã®åé¡ãåçŸããããšã¯ã§ããŸããã§ããã
çç¶ã®æ ¹æ¬åå ãç¹å®ã§ããªããããåé¡ãªãçç¶ãä¿®æ£ããŠããŸãã
ç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³ïŒ
thinks
èªèº«ã®ããŒããNotReadyã§ãããã©ãããå°ããŸãã ã¯ãã®å Žåããã¡ã€ã«ã«å¯ŸããŠtouch
ã³ãã³ããå®è¡ããŠãkubeletã®åèµ·åãããªã¬ãŒããŸãwatched
ã§ãããããã«å¿ããŠkubeletãåèµ·åããŸãã#!/bin/bash
while true; do
node_status=$(KUBECONFIG=/etc/kubernetes/kubelet.conf kubectl get nodes | grep $HOSTNAME | awk '{print $2}')
date=$(date)
echo "${date} Node status for ${HOSTNAME}: ${node_status}"
if [ ${node_status} == "NotReady" ]; then
echo "${date} Triggering kubelet restart ..."
# Running touch command on /var/lib/kubelet/config.yaml. This will trigger a kubelet restart.
# /usr/lib/systemd/system/kubelet-watcher.path & /usr/lib/systemd/system/kubelet-watcher.service
# are responsible for watching changes in this file
# and will restart the kubelet process managed by systemd accordingly.
touch /var/lib/kubelet/config.yaml
fi
# Runs ever 1 hour
sleep 3600
done
# cat /usr/lib/systemd/system/kubelet-watcher.path
[Path]
PathModified=/var/lib/kubelet/config.yaml
[Install]
WantedBy=multi-user.target
# cat /usr/lib/systemd/system/kubelet-watcher.service
[Unit]
Description=kubelet restarter
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart kubelet.service
[Install]
WantedBy=multi-user.target[root@den-iac-opstest-kube-node02 karthik]#
Kubernetes 1.19.0ã§ãåé¡ã¯è§£æ±ºããŸããããã¡ãã»ãŒãžã¯å°ãç°ãªããŸãã
Sep 11 18:19:39 k8s-node3 kubelet[17382]: E0911 18:19:38.745482 17382 event.go:273] Unable to write event: 'Patch "https://192.168.1.150:6443/api/v1/namespaces/fhem/events/fhem-7c99f5f947-z48zk.1633c689ec861314": read tcp 192.168.1.153:34758->192.168.1.150:6443: use of closed network connection' (may retry after sleeping)
ãšã©ãŒã¡ãã»ãŒãžã«ãïŒã¹ãªãŒãåŸã«åè©Šè¡ã§ããŸãïŒããå«ãŸããããã«ãªããŸããã
ã¢ããã°ã¬ãŒãgolangãåŸ ããã«ãkubernetesã§ãããå®å šã«è»œæžããããšã¯å¯èœã§ããïŒ ããšãã°ããéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çšããªã©ã«ééããå Žåãclient-goã«ãã©ã³ã¹ããŒããã¹ã¯ããã¢ãŠããããããšã¯ã§ããŸããïŒ
ãããã¯ãHTTP 1.1ã䜿çšããŠããå Žåã§ããã®åé¡ã¯çºçããŸããããããšãçŽç²ã«HTTP 2ã«é¢é£ããŠããŸããïŒ HTTP 1.1ã¯ãå
ç«ã«ãªãã巚倧ãªãããŒããã¯ãæã£ãŠããªããããã ãã§èšå®ã«æ¬åœã®ç°¡åãªåé¿çã«ãªãã ããå Žåã¯GODEBUG=http2client=0
kubeletãKUBE-ãããã·ãããã³æ§ã
ãªã³ã³ãããŒã«ãã¬ãŒã³ããã»ã¹ããããã¯ã»ããã§GODEBUG=http2server=0
å€æŽããŠãããŒãµã«ã«ããããã®apiserverããã»ã¹ã®
ãããã¯å®éã«ãã®åé¡ã軜æžããHTTP2ãä»ããŠå€éåããªãå Žåã®æ¥ç¶æ°ã®å¢å ã«ããããã€ãã®ããã©ãŒãã³ã¹ã®åé¡ä»¥å€ã®ä»ã®å€§ããªèœãšãç©ŽãåŒãèµ·ãããªããšæããŸããïŒ
ãã©ã³ã¹ããŒãããéãããããã¯ãŒã¯æ¥ç¶ã®äœ¿çšããªã©ã«ééããå Žåãclient-goã«ãã©ã³ã¹ããŒããã¹ã¯ããã¢ãŠããããããšã¯ã§ããŸããïŒ
ããŸãå€ç§çã§ã¯ãããŸãã...æ°ããã¯ã©ã€ã¢ã³ããç¹°ãè¿ãæ§ç¯ããçºä¿¡è ã«çŽé¢ããŠäžæçãªããŒãã®æ¯æžãåé¿ããããã«ããã©ã³ã¹ããŒãã¯çŸåšå ±æãããŠããŸã
ãã®åé¡ã¯ãHTTP 1.1ã䜿çšããŠããå Žåã§ãçºçããŸããããããšãçŽç²ã«HTTP 2ã«é¢é£ããŠããŸããïŒ
ç§ã®ç¥ãéããã¢ã€ãã«ç¶æ ã®æ¥ç¶ã¯ããŒãã¢ã©ã€ãããŒã«ã«æ»ããããHTTP 1.1ã§ãåãåé¡ãçºçããå¯èœæ§ããããŸãïŒpingãã«ã¹ãã§ãã¯ã¡ã«ããºã ãå©çšã§ããªããããHTTP 1.1ãæ€åº/軜æžãããªãã·ã§ã³ãå°ãªããªããŸãïŒã
ã¯ã©ã€ã¢ã³ãã䜿çšãããããžã§ã¯ãã«é©åãªåé¿çã¯ãããŸããïŒ ã¯ã©ã€ã¢ã³ãããã€æ»ãã§ããã®ãããããŠãããä¿®æ£ããããã«å¿ èŠãªæäœéã®ããšãã©ã®ããã«ç¹å®ã§ããŸããïŒããã»ã¹ãåèµ·åããããšãå¯äžã®éžæè¢ã§ããããã«èãããŸãïŒïŒ
ã¯ã©ã€ã¢ã³ãããã€æ»ãã§ããããã©ã®ããã«ç¹å®ã§ããŸãã
åãURLã«å¯ŸããŠwrite tcp xxx use of closed network connection
ãšã©ãŒãç¹°ãè¿ãçºçããå Žåã ããã¯ãã¯ã©ã€ã¢ã³ããåæ¢ããŠããããšã瀺ããŠããŸãã Transportå
ã®æ¥ç¶ããŒã«ã¯ãèŠæ±ãããhostïŒportã®ãããtcpæ¥ç¶ããã£ãã·ã¥ããŸããã
ã¯ã©ã€ã¢ã³ãã䜿çšãããããžã§ã¯ãã«é©åãªåé¿çã¯ãããŸããïŒ
ç§ã®ç¥ãéãã http.Client
ãåæ§ç¯ãããšãã¢ããªã±ãŒã·ã§ã³å
šäœãåèµ·åããªããŠããã®åé¡ã解決ã§ããŸãã
ãããä¿®æ£ããããã«å¿ èŠãªæå°éã®ããšã¯äœã§ãã
ãããžã§ã¯ããžã®ãœãŒã¹ã³ãŒãã¬ãã«ã®ã¢ã¯ã»ã¹ãå¿ èŠã§ãã ãã¶ããäžèšã®ã¡ã«ããºã ã䜿çšããŠãæ»ãã ã¯ã©ã€ã¢ã³ããæ€åºããå¿ èŠã«å¿ããŠæ°ããã¯ã©ã€ã¢ã³ããåæ§ç¯ã§ããŸãã å€ãã¯ã©ã€ã¢ã³ãã䜿çšããŠãã人ãããªãå Žåã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãè¡ãããŸãã
ãããžã§ã¯ãã«ãœãŒã¹ã³ãŒãã§ã¢ã¯ã»ã¹ã§ããŸãããkubernetesã¯ã©ã€ã¢ã³ãã䜿çšããŠããŸãã ãŠã©ãããå®è¡ãããšãTCPæ¥ç¶ããã®ããã«åæãããŠãããã©ãããæ€åºãããªãããã§ãïŒãŠã©ããã¯HTTPãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããŠãããããåŠçããã³ãŒãã«ãšã©ãŒãçºçããããšã¯ãããŸããïŒã
ããã ããã§ãã http.Client
ã¯kubernetesã¯ã©ã€ã¢ã³ãã«ãã£ãŠå
¬éãããŠããŸããã
çŸåšããããã¬ãã«ã®ã¢ããªã±ãŒã·ã§ã³ããã®ãããªåé¿çãã»ãšãã©ã³ã¹ãããããã«å®è¡ããããšã¯çµ¶æçã§ãã
kubernetesã¯ã©ã€ã¢ã³ããhttp.DefaultClient
䜿çšããªãå Žåã¯ãkubernetesã¯ã©ã€ã¢ã³ãå
šäœãåæ§ç¯ããããšã§ä¿®æ£ã§ããŸãã
ãŠã©ãããªã¯ãšã¹ãã«ã€ããŠã¯ãæªåããŠããŸãã kubernetesã¯ã©ã€ã¢ã³ãã¯ãªã¯ãšã¹ããåè©Šè¡ãç¶ããŠããããã§ãäžäœã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã©ãŒã¯è¡šç€ºãããŸããã ç§ã¯ä»ãã®ãããªç¶æ³ã«ã€ããŠè¯ãèãããããŸããã
ããã§ææ¡ãuse of closed network connection
ãšã©ãŒãåžžã«è¡šç€ºãããŸãã
ãã«ãªã¯ãšã¹ããäœæããŠãã ããããã®äž»é¡ã調æ»ããŸãã
åäžã®ãã¢ã¡ã¿ã«ã¯ã©ã¹ã¿ãŒã§ã¯ãããã24æéããšã«çŽ2ã4åçºçããã®ãããããŸãã 1.17.12
ããã¯ãåäžããŒãã¯ã©ã¹ã¿ãŒã§ãã£ãŠããapi-serverããããåèµ·åãããšãã«çºçããŸãã apiserverãžã®æ¥ç¶ã倱ãããããããšã©ãŒçªå·ã®æå°åæ¹æ³ã«ãããapiserverãåèµ·åããåé¡ã解決ãããŠããŸãã
ãã¹ã¿ãŒããŒãã®åã§haproxyã䜿çšããŠããŸãããLBæ§æã§ãããé²ãæ¹æ³ã¯ãããšæããŸããïŒ
@ shubb30ããªãã®è§£æ±ºçãç§ãšå ±æããŠãããããã§ããïŒ
åé¡ãçºçãããšãã«ãapiserverãåèµ·åããªãããšã確èªã§ããŸãã ããŒã¢ã³ã»ãããšã·ã§ã«ããªãã¯ã䜿çšããŠãã°ãšã³ããªãç£èŠããkubeletãåèµ·åããŠããŸããããã¯ããªãããŸãæ©èœããŠããŸãããäžæçãªåé¿çã«ãããªããšæããŸãã
ããã¯ãåé¿çãšããŠããŸãæ©èœããŠãããã®ã®ä¿®æ£ããŒãžã§ã³ã§ãã
ãããã¿ããªïŒ
ãã®ããã¯ããŒãã圹ç«ã€å¯èœæ§ããããšæããŸããïŒ
https://github.com/golang/go/issues/40423
æå ±ïŒgolang / netãã¹ã¿ãŒã¯http2ãã©ã³ã¹ããŒãã®æ§æããµããŒãããŠãããããã¿ã€ã ã¢ãŠããèšå®ã§ããããã«ãªããŸããã https://github.com/golang/net/commit/08b38378de702b893ee869b94b32f833e2933bd2
çµããã
PRã¯ã¬ãã¥ãŒã®ããã«éãããŸããã
ãã1ã€ã®è¯ããã¥ãŒã¹ïŒKubernetesã¯æšæºã®net / httpããã±ãŒãžã«ãã³ãã«ãããŠããhttp2ã䜿çšããªãããã次ã®GoãªãªãŒã¹ãåŸ ã€å¿ èŠã¯ãããŸããã ãã®åé¡ãä¿®æ£ããã«ã¯ã httpsïŒ//github.com/golang/net/commit/08b38378de702b893ee869b94b32f833e2933bd2ãçŽæ¥äœ¿çšã§ã
ããã§ä¿®æ£ãææ¡ããŸããã https://github.com/kubernetes/kubernetes/pull/95898
äŸåé¢ä¿ãå¿
èŠãªããŒãžã§ã³ã«æŽæ°ããããã©ã«ãã§http2ãã©ã³ã¹ããŒããã«ã¹ãã§ãã¯ãæå¹ã«ããŸãã
ããã¯ãclient-goã䜿çšããŠapiserverïŒäŸïŒkubeletïŒãšéä¿¡ããã¢ããªã±ãŒã·ã§ã³ãããæžã蟌ã¿tcp xxxã§ã®ã¢ããªã®ãã³ã°ïŒéããæ¥ç¶ã®äœ¿çšãã®åé¡ãåãé€ãã®ã«åœ¹ç«ã€ã¯ãã§ãã
ã³ã¡ã³ãã¯ãæ°è»œã«ã©ããã
èšåãããïŒ95898ã¯ãè°è«ããå¿ èŠããªãçç±ã§ééãããããã§ãã
ãã®åé¡ã«é¢ããŠä»ã«æŽæ°ã¯ãããŸããïŒ
https://github.com/kubernetes/kubernetes/pull/95981 ïŒäžèšã®ãªã³ã¯ïŒã¯ãhttp / 2ä¿®æ£ããã«ããããã«é²è¡äžã§ã
ãã®åé¡ã¯ã1.17.XããŒãžã§ã³ã®kubernetesã«åºæã®ãã®ã§ããïŒ
@krmayankkæ£ç¢ºã«ãã€éå§ããããã¯å®å šã«ã¯
@krmayankk v1.18.9ã§ããã®åé¡ãçºçããŸãããããã°ã®ããããŒãžã§ã³ã®Rancherãåå ã§ããããã¯ãŒã¯ã®äœ¿çšçãéåžžã«é«ããªããŸããã å¥ã®ããŒãžã§ã³ã«ããŒã«ããã¯ããåŸãåé¡ã¯èŠ³å¯ãããŸããã§ããã
ãã®åé¡ãçºçããŸããããäžèšã®ã³ã¡ã³ãã®åé¿çã䜿çšããŠãå°ããªè¶£å³ã®ã¯ã©ã¹ã¿ãŒã§ãä¿®æ£ãããŸããã
åé¿çãsystemdãŠãããããã³ã¿ã€ããŒãšããŠããŒãã«ãããã€ããããã®å°ããªansible-playbookãäœæããŸãããããã«ãããåæ§ã®èšå®ã§ä»ã®ãŠãŒã¶ãŒããã°ããç¯çŽã§ããå¯èœæ§ããããŸãã
https://github.com/kubernetes/kubernetes/pull/95981ããã³https://github.com/kubernetes/kubernetes/issues/87615ãã1.18ãªãªãŒã¹ãã©ã³ããžã®ãã§ãªãŒããã¯/ããã¯ããŒãã®èšç»ã¯ãããŸããïŒ
ïŒ95981ãã1.17ãªãªãŒã¹ãã©ã³ãããã§ãªãŒããã¯ããèšç»ã¯ãããŸããïŒ
ãã®ã³ã¡ã³ãã§ã¯ãå€ããªãªãŒã¹ãžã®ããã¯ããŒãã«ã€ããŠèª¬æããŠããŸãïŒ https ïŒ
çãã¯ã倧å€ã§ãç©äºãå£ãå¯èœæ§ãããã®ã§ãããããããã§ã¯ãªããã ãšæããŸãã 質åããããšãã«v1.17ãå®è¡ããŠãã人ã ã«æåŸ ããã®ãšåãçãããããŸããããã§ã¯ãä¿®æ£ãååŸããããã«v1.20ã«ã¢ããã°ã¬ãŒãããŠã¿ãŸãããïŒ ïŒç¬ãïŒ
ãããå°ãªããšã1.19ã«ããã¯ããŒããããšãä¿®æ£ãæ¯èŒçæ©ãå©çšå¯èœã«ãªãããããã°ãããã§ãããã Dockerã®å»æ¢ã«ããã1.20ã延æãã人ããããšæããŸãã
ãããå°ãªããšã1.19ã«ããã¯ããŒããããšãä¿®æ£ãæ¯èŒçæ©ãå©çšå¯èœã«ãªãããããã°ãããã§ãããã
ããã¯ãã§ã«è¡ãããŠããŸãã
Dockerã®å»æ¢ã«ããã1.20ã延æãã人ããããšæããŸãã
éæšå¥šã®èŠå以å€ãdockerã«é¢ããŠ1.20ã§ã¯äœãå€æŽãããŠããŸããã éæšå¥šæéã®çµäºæã«ãdockershimãµããŒãã¯åé€ãããŸãã
ã©ãºãã¢ã³10ã®1.20ã§ãããã®ãšã©ãŒãçºçããŸããããã«å¯Ÿããä¿®æ£ãååŸããããšããã©ãããå§ããã°ããã§ããããã ã¯ã©ãŠã管çã¯ã©ã¹ã¿ãŒãå®è¡ããã³ã¹ãã¯ãç¬èªã®ã¯ã©ã¹ã¿ãŒã§å®è¡ãããããã¯ããã«è²»çšå¹æãé«ãããã§ã
ç§èªèº«ã®æ確ãã®ããã«ãããã¯ïŒ95981ã«ãã£ãŠè§£æ±ºãããã¹ãã§ããããã«èŠããŸãããããŠããã¯ããã1.20ã«äœãã1.19ã«ããã¯ããŒããããŸãããïŒ
/éžã¶
@caesarxuchao ïŒãã®åé¡ã解決ããŸãã
察å¿ããŠããã®ïŒ
95981ã¯1.20ã«ããŒãžãããïŒ96770ã§1.19ã«ãã§ãªãŒããã¯ãããŸããã
/éžã¶
PRã³ã¡ã³ãã䜿çšããŠç§ãšããåãããããã®æé ã¯ããã¡ãããå
¥æã§ãkubernetes / test-infraãªããžããªã«å¯ŸããŠåé¡ã
v1.16ãv1.17ããŸãã¯v1.18ã®ããã¯ããŒã/ãã§ãªãŒããã¯ã¯ãããŸããïŒ
@chilicatã¯https://github.com/kubernetes/kubernetes/pull/95981#issuecomment-730561539ãåç §ããŠ
æãåèã«ãªãã³ã¡ã³ã
ãã®bashã¹ã¯ãªããã5åããšã«å®è¡ããŠä¿®æ£ããŸããã