「Kubernetes によりレむテンシが 10 倍増加した」: この責任は誰にあるのでしょうか?

ノヌト。 翻蚳。: この蚘事は、ペヌロッパ䌁業 Adevinta で䞻任゜フトりェア ゚ンゞニアの職にある Galo Navarro によっお曞かれたもので、むンフラストラクチャ運甚の分野における魅力的で有益な「調査」です。 原題は、著者が最初に説明する理由により、翻蚳においおわずかに拡匵されたした。

「Kubernetes によりレむテンシが 10 倍増加した」: この責任は誰にあるのでしょうか?

著者からのメモ: この投皿のようです 惹かれる 予想をはるかに䞊回る泚目床。 蚘事のタむトルが誀解を招き、䞀郚の読者を悲したせおいるずいう怒りのコメントが今でも寄せられたす。 䜕が起こっおいるのか理由は理解しおいたす。したがっお、陰謀党䜓を台無しにする危険にもかかわらず、この蚘事が䜕に぀いおであるかをすぐに説明したいず思いたす。 チヌムが Kubernetes に移行するずきに私が芋た奇劙なこずは、問題が発生するたびに (移行埌のレむテンシの増加など)、最初に非難されるのは Kubernetes ですが、その埌、オヌケストレヌタヌが実際には非難されおいないこずが刀明するずいうこずです。非難。 この蚘事では、そのような事䟋の XNUMX ぀に぀いお説明したす。 その名前は、開発者の XNUMX 人の感嘆笊を繰り返したものです (埌で、Kubernetes がそれずは䜕の関係もないこずがわかりたす)。 ここでは Kubernetes に関する驚くべき事実は芋぀かりたせんが、耇雑なシステムに぀いおいく぀かの良い教蚓が埗られるず期埅できたす。

数週間前、私のチヌムは単䞀のマむクロサヌビスを、CI/CD、Kubernetes ベヌスのランタむム、メトリクス、その他の機胜を含むコア プラットフォヌムに移行しおいたした。 この移行は詊隓的なものでした。私たちはこれを基瀎ずしお、今埌数か月間でさらに玄 150 のサヌビスを移行する予定でした。 圌らは党員、スペむン最倧のオンラむン プラットフォヌム (Infojobs、Fotocasa など) の運営を担圓しおいたす。

アプリケヌションを Kubernetes にデプロむし、䞀郚のトラフィックをそこにリダむレクトした埌、驚くべき驚きが私たちを埅っおいたした。 遅れ 埅ち時間 Kubernetes でのリク゚ストは EC10 の 2 倍でした。 䞀般に、この問題の解決策を芋぀けるか、マむクロサヌビス (堎合によっおはプロゞェクト党䜓) の移行を攟棄する必芁がありたした。

Kubernetes のレむテンシが EC2 よりもはるかに高いのはなぜですか?

ボトルネックを芋぀けるために、リク゚スト パス党䜓に沿っおメトリクスを収集したした。 私たちのアヌキテクチャはシンプルです。API ゲヌトりェむ (Zuul) が EC2 たたは Kubernetes のマむクロサヌビス むンスタンスにリク゚ストをプロキシしたす。 Kubernetes では NGINX Ingress Controller を䜿甚し、バック゚ンドは次のような通垞のオブゞェクトです。 展開 Spring プラットフォヌム䞊の JVM アプリケヌションを䜿甚したす。

                                  EC2
                            +---------------+
                            |  +---------+  |
                            |  |         |  |
                       +-------> BACKEND |  |
                       |    |  |         |  |
                       |    |  +---------+  |                   
                       |    +---------------+
             +------+  |
Public       |      |  |
      -------> ZUUL +--+
traffic      |      |  |              Kubernetes
             +------+  |    +-----------------------------+
                       |    |  +-------+      +---------+ |
                       |    |  |       |  xx  |         | |
                       +-------> NGINX +------> BACKEND | |
                            |  |       |  xx  |         | |
                            |  +-------+      +---------+ |
                            +-----------------------------+

この問題はバック゚ンドの初期レむテンシヌに関連しおいるようです (グラフ䞊で問題のある領域を「xx」ずしおマヌクしたした)。 EC2 では、アプリケヌションの応答に玄 20 ミリ秒かかりたした。 Kubernetes では、レむテンシが 100  200 ミリ秒に増加したした。

私たちは、ランタむムの倉曎に関連する可胜性のある容疑者をすぐに华䞋したした。 JVM のバヌゞョンは倉わりたせん。 コンテナ化の問題もこれずは䜕の関係もありたせんでした。アプリケヌションはすでに EC2 䞊のコンテナ内で正垞に実行されおいたした。 読み蟌み䞭? しかし、1 秒あたり XNUMX リク゚ストでも高いレむテンシが芳察されたした。 ガベヌゞ コレクションの䞀時停止も無芖される可胜性がありたす。

Kubernetes 管理者の XNUMX 人は、DNS ク゚リによっお過去に同様の問題が発生したため、アプリケヌションに倖郚䟝存関係があるのではないかず疑問に思いたした。

仮説 1: DNS 名前解決

リク゚ストごずに、アプリケヌションは次のようなドメむン内の AWS Elasticsearch むンスタンスに XNUMX  XNUMX 回アクセスしたす。 elastic.spain.adevinta.com。 コンテナの内郚 貝殻がある, これにより、ドメむンの怜玢に実際に時間がかかるかどうかを確認できたす。

コンテナからの DNS ク゚リ:

[root@be-851c76f696-alf8z /]# while true; do dig "elastic.spain.adevinta.com" | grep time; sleep 2; done
;; Query time: 22 msec
;; Query time: 22 msec
;; Query time: 29 msec
;; Query time: 21 msec
;; Query time: 28 msec
;; Query time: 43 msec
;; Query time: 39 msec

アプリケヌションが実行されおいる EC2 むンスタンスの XNUMX ぀からの同様のリク゚スト:

bash-4.4# while true; do dig "elastic.spain.adevinta.com" | grep time; sleep 2; done
;; Query time: 77 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec

ルックアップに玄 30 ミリ秒かかったこずを考慮するず、Elasticsearch にアクセスするずきの DNS 解決が実際にレむテンシの増加に寄䞎しおいるこずが明らかになりたした。

しかし、これは次の XNUMX ぀の理由から奇劙でした。

  1. 私たちはすでに、高いレむテンシヌに悩たされるこずなく AWS リ゜ヌスず通信する Kubernetes アプリケヌションを倧量に持っおいたす。 理由が䜕であれ、それは特にこの事件に関連しおいたす。
  2. JVM がメモリ内 DNS キャッシュを実行するこずがわかっおいたす。 私たちの画像では、TTL 倀は次のように曞かれおいたす。 $JAVA_HOME/jre/lib/security/java.security そしお 10 秒に蚭定したす。 networkaddress.cache.ttl = 10。 ぀たり、JVM はすべおの DNS ク゚リを 10 秒間キャッシュする必芁がありたす。

最初の仮説を確認するために、DNS ぞの呌び出しをしばらく停止し、問題が解消されるかどうかを確認するこずにしたした。 たず、ドメむン名ではなく IP アドレスによっお Elasticsearch ず盎接通信するようにアプリケヌションを再構成するこずにしたした。 これにはコヌドの倉曎ず新しいデプロむメントが必芁ずなるため、単にドメむンをその IP アドレスにマップしたした。 /etc/hosts:

34.55.5.111 elastic.spain.adevinta.com

これで、コンテナはほが即座に IP を受け取りたした。 これにより、ある皋床の改善は埗られたしたが、予想されるレむテンシ レベルにわずかに近づくだけでした。 DNS 解決には長い時間がかかりたしたが、本圓の理由はただわかりたせん。

ネットワヌク経由の蚺断

を䜿甚しおコンテナからのトラフィックを分析するこずにしたした。 tcpdumpネットワヌク䞊で䜕が起こっおいるかを正確に確認するには:

[root@be-851c76f696-alf8z /]# tcpdump -leni any -w capture.pcap

次に、いく぀かのリク゚ストを送信し、そのキャプチャをダりンロヌドしたした (kubectl cp my-service:/capture.pcap capture.pcapさらなる分析のために Wiresharkの.

DNS ク゚リには䜕も疑わしいものはありたせんでした (埌で説明する XNUMX ぀の小さな点を陀いお)。 しかし、私たちのサヌビスが各リク゚ストを凊理する方法には、特定の奇劙な点がありたした。 以䞋は、応答が開始される前にリク゚ストが受け入れられたこずを瀺すキャプチャのスクリヌンショットです。

「Kubernetes によりレむテンシが 10 倍増加した」: この責任は誰にあるのでしょうか?

パッケヌゞ番号は最初の列に衚瀺されたす。 わかりやすくするために、さたざたな TCP フロヌを色分けしたした。

パケット 328 で始たる緑色のストリヌムは、クラむアント (172.17.22.150) がコンテナ (172.17.36.147) ぞの TCP 接続を確立する方法を瀺しおいたす。 最初のハンドシェむク (328-330) の埌、パッケヌゞ 331 が持ち蟌たれたした HTTP GET /v1/.. — 圓瀟のサヌビスぞの受信リク゚スト。 プロセス党䜓に 1 ミリ秒かかりたした。

灰色のストリヌム (パケット 339 から) は、サヌビスが Elasticsearch むンスタンスに HTTP リク゚ストを送信したこずを瀺しおいたす (既存の接続を䜿甚しおいるため、TCP ハンドシェむクはありたせん)。 これには 18 ミリ秒かかりたした。

ここたではすべお問題なく、時間は予想される遅延 (クラむアントから枬定した堎合は 20  30 ミリ秒) にほが䞀臎しおいたす。

ただし、青色のセクションには 86 ミリ秒かかりたす。 その䞭で䜕が起こっおいるのでしょうか パケット 333 で、サヌビスは HTTP GET リク゚ストを次の宛先に送信したした。 /latest/meta-data/iam/security-credentials、その盎埌に、同じ TCP 接続を介しお、別の GET リク゚ストが /latest/meta-data/iam/security-credentials/arn:...

トレヌス党䜓を通じお、すべおのリク゚ストでこれが繰り返されるこずがわかりたした。 確かに、コンテナヌでは DNS 解決が少し遅くなりたす (この珟象の説明は非垞に興味深いですが、別の蚘事に取っおおきたす)。 長い遅延の原因は、各リク゚ストでの AWS むンスタンス メタデヌタ サヌビスの呌び出しであるこずが刀明したした。

仮説 2: AWS ぞの䞍芁な呌び出し

䞡方の゚ンドポむントが属しおいたす AWS むンスタンスメタデヌタ API。 私たちのマむクロサヌビスは、Elasticsearch の実行䞭にこのサヌビスを䜿甚したす。 どちらの呌び出しも基本的な認蚌プロセスの䞀郚です。 最初のリク゚ストでアクセスされる゚ンドポむントは、むンスタンスに関連付けられた IAM ロヌルを発行したす。

/ # curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
arn:aws:iam::<account_id>:role/some_role

XNUMX 番目のリク゚ストは、XNUMX 番目の゚ンドポむントにこのむンスタンスの䞀時的なアクセス蚱可を芁求したす。

/ # curl http://169.254.169.254/latest/meta-data/iam/security-credentials/arn:aws:iam::<account_id>:role/some_role`
{
    "Code" : "Success",
    "LastUpdated" : "2012-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2017-05-17T15:09:54Z"
}

クラむアントはそれらを短期間䜿甚でき、定期的に新しい蚌明曞を取埗する必芁がありたす (蚌明曞が有効になる前に)。 Expiration。 モデルは単玔です。AWS はセキュリティ䞊の理由から䞀時キヌを頻繁にロヌテヌションしたすが、クラむアントはそれらを数分間キャッシュしお、新しい蚌明曞の取埗に䌎うパフォヌマンスの䜎䞋を補うこずができたす。

AWS Java SDK がこのプロセスを組織する責任を匕き継ぐ必芁がありたすが、䜕らかの理由でこれが行われたせん。

GitHub で問題を怜玢したずころ、問題が芋぀かりたした #1921。 圌女は、私たちがさらに「掘り䞋げる」方向を決定するのを手䌝っおくれたした。

AWS SDK は、次のいずれかの状況が発生した堎合に蚌明曞を曎新したす。

  • 有効期限 Expiration に萜ちる EXPIRATION_THRESHOLD、15分にハヌドコヌディングされおいたす。
  • 最埌に蚌明曞を曎新しおから、次の時間よりも長い時間が経過したした。 REFRESH_THRESHOLD、60分間ハヌドコヌディングされおいたす。

受け取った蚌明曞の実際の有効期限を確認するために、コンテナず EC2 むンスタンスの䞡方から䞊蚘の cURL コマンドを実行したした。 コンテナから受け取った蚌明曞の有効期間は、はるかに短く、ちょうど 15 分であるこずが刀明したした。

これですべおが明らかになりたした。最初のリク゚ストで、サヌビスは䞀時蚌明曞を受け取りたした。 これらは 15 分を超えお有効ではなかったため、AWS SDK は埌続のリク゚ストでそれらを曎新するこずを決定したす。 そしお、これはすべおのリク゚ストで起こりたした。

蚌明曞の有効期限が短くなったのはなぜですか?

AWS むンスタンス メタデヌタは、Kubernetes ではなく EC2 むンスタンスで動䜜するように蚭蚈されおいたす。 䞀方で、アプリケヌションのむンタヌフェヌスは倉曎したくありたせんでした。 このために䜿甚したのは キアム - 各 Kubernetes ノヌド䞊の゚ヌゞェントを䜿甚しお、ナヌザヌ (アプリケヌションをクラスタヌにデプロむする゚ンゞニア) が EC2 むンスタンスであるかのように IAM ロヌルをポッド内のコンテナに割り圓おるこずができるツヌル。 KIAM は、AWS むンスタンス メタデヌタ サヌビスぞの呌び出しをむンタヌセプトし、事前に AWS から受信した呌び出しをそのキャッシュから凊理したす。 アプリケヌションの芳点からは䜕も倉わりたせん。

KIAM はポッドに短期蚌明曞を提䟛したす。 ポッドの平均寿呜が EC2 むンスタンスの平均寿呜より短いこずを考慮するず、これは圓然のこずです。 蚌明曞のデフォルトの有効期間 同じ15分に等しい.

その結果、䞡方のデフォルト倀を重ね合わせるず問題が発生したす。 アプリケヌションに提䟛された各蚌明曞は 15 分埌に期限切れになりたす。 ただし、AWS Java SDK は、有効期限たで残り 15 分を切った蚌明曞は匷制的に曎新したす。

その結果、䞀時蚌明曞はリク゚ストごずに匷制的に曎新されるこずになり、AWS API ぞの呌び出しが数回必芁ずなり、レむテンシヌが倧幅に増加したす。 AWS Java SDK で次のこずがわかりたした。 機胜リク゚スト、同様の問題に぀いお蚀及しおいたす。

解決策は簡単であるこずがわかりたした。 より長い有効期間の蚌明曞を芁求するように KIAM を再構成しただけです。 これが発生するず、AWS メタデヌタ サヌビスの参加なしでリク゚ストが流れるようになり、レむテンシは EC2 よりもさらに䜎いレベルに䜎䞋したした。

所芋

移行に関する私たちの経隓に基づくず、最も䞀般的な問題の原因の XNUMX ぀は、Kubernetes やプラットフォヌムのその他の芁玠のバグではありたせん。 たた、移怍しおいるマむクロサヌビスの根本的な欠陥にも察凊しおいたせん。 さたざたな芁玠を組み合わせるずいうだけの理由で問題が発生するこずがよくありたす。

私たちは、これたで盞互䜜甚したこずのない耇雑なシステムを混ぜ合わせお、それらが単䞀のより倧きなシステムを圢成するこずを期埅しおいたす。 悲しいこずに、芁玠が増えれば増えるほど、゚ラヌの䜙地が増え、゚ントロピヌが高くなりたす。

私たちの堎合、高いレむテンシヌは、Kubernetes、KIAM、AWS Java SDK、たたはマむクロサヌビスのバグや間違った決定の結果ではありたせんでした。 これは、KIAM ず AWS Java SDK の XNUMX ぀の独立したデフォルト蚭定を組み合わせた結果です。 個別に考えるず、AWS Java SDK のアクティブな蚌明曞曎新ポリシヌず KAIM の蚌明曞の短い有効期間ずいう䞡方のパラメヌタが意味を持ちたす。 しかし、それらを組み合わせるず、結果は予枬䞍可胜になりたす。 XNUMX ぀の独立した論理的な゜リュヌションを組み合わせおも意味をなす必芁はありたせん。

翻蚳者からの远䌞

AWS IAM を Kubernetes ず統合するための KIAM ナヌティリティのアヌキテクチャに぀いお詳しくは、次の Web サむトをご芧ください。 この蚘事 クリ゚むタヌから。

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす