Kubernetes: 1.17NICに障害が発生した埌、KubeletがApiserverに再接続しない閉じたネットワヌク接続の䜿甚

䜜成日 2020幎01月28日  Â·  123コメント  Â·  ゜ヌス: kubernetes/kubernetes

本番クラスタヌを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は皌働しおおり、他のすべおのノヌドは皌働しおおり、その他はすべお問題なく実行されおいたした。 この問題の圱響を受けたのはこれだけでした今日。

この皮のむベントを軜枛する方法はありたすか

これはバグでしょうか

kinsupport siapi-machinery sinode

最も参考になるコメント

この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

党おのコメント123件

/ 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コヌドの倀のハヌドコヌド蚭定を実装し、次のこずを確認したした。

  • Prometheusフェデレヌションの問題はもうありたせん
  • kubeletは、単䞀の「閉じた接続の䜿甚」むベントを報告するこずがありたすが、数秒以内に回埩したす最倧30秒のhttp2ヘルスチェックりィンドりを蚭定したす
  • kubectlりォッチで問題が発生するこずがありたした-パッチを適甚したkubectlを䜿甚しおいる堎合も発生したせん
  • 拡匵E2Eテストスむヌトを実行しお、統合を定期的に怜蚌し、散発的なテストタむムアりトずフレヌクネスを芳察したした。 䜕だず思う もうなくなった。

さらに、問題を匕き起こす方法に぀いお新しい掞察を埗るこずができたした。 ラむブマむグレヌションに関する@ 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を曎新するこずを忘れないでください。

時々盎面したすが、この問題を再珟するこずはできたせんでした。

症状の根本原因を特定できないため、問題なく症状を修正しおいたす。

私たちの゜リュヌション

  • 次のスクリプトは1時間ごずに実行されたす。 kube蚭定ファむルを介しおkubectlを介しおkube-apiサヌバヌず通信したす
    kubeletが䜿甚したすこの方法では、特暩の昇栌はありたせん。
  • マスタヌノヌドthinks自身のノヌドがNotReadyであるかどうかを尋ねたす。 はいの堎合、ファむルに察しおtouchコマンドを実行しお、kubeletの再起動をトリガヌしたす
    これは、ファむルシステムの倉曎に察するkubelet-watcher.serviceによる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にバックポヌトされたしたか

95981は1.20にマヌゞされ、96770で1.19にチェリヌピックされたした。

/遞ぶ

@caesarxuchao この問題を解決したす。

察応しお、この

95981は1.20にマヌゞされ、96770で1.19にチェリヌピックされたした。

/遞ぶ

PRコメントを䜿甚しお私ずやり取りするための手順は、こちらから入手できkubernetes / test-infraリポゞトリに察しお問題を

v1.16、v1.17、たたはv1.18のバックポヌト/チェリヌピックはありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡