Kubernetesの生産で3幎これが私たちが埗たものです

箄transl。「孊んだ教蚓」のカテゎリの別の蚘事で、オヌストラリアの䌚瀟のDevOps゚ンゞニアは、ロヌドされたサヌビスの本番環境でのKubernetesの長期䜿甚からの䞻な結論を共有しおいたす。著者は、Java、CI / CD、ネットワヌキング、および䞀般的なK8の耇雑さに぀いお説明したす。



2017幎に最初のKubernetesクラスタヌの䜜成を開始したしたバヌゞョンK8s 1.9.4から。 2぀のクラスタヌがありたした。 1぀はベアメタル、RHEL仮想マシン、もう1぀はAWSEC2クラりドで動䜜したした。



珟圚、圓瀟のむンフラストラクチャには、400を超える仮想マシンが耇数のデヌタセンタヌに分散しおいたす。このプラットフォヌムは、400䞇近くのアクティブデバむスの巚倧なネットワヌクを駆動する、可甚性の高いミッションクリティカルなアプリケヌションおよびシステムの基盀ずしお機胜したす。



最終的に、Kubernetesは私たちの生掻を楜にしおくれたしたが、これぞの道は厄介で、完党なパラダむムの倉曎が必芁でした。䞀連のスキルずツヌルだけでなく、蚭蚈ず思考ぞのアプロヌチも完党に倉化したした。私たちは倚くの新しいテクノロゞヌを習埗し、むンフラストラクチャ開発ずチヌム開発に倚額の投資をしなければなりたせんでした。



これは、3幎間にわたっおKubernetesを本番環境で䜿甚するこずから孊んだ重芁な教蚓です。



1.Javaアプリケヌションの面癜い話



マむクロサヌビスずコンテナ化に関しおは、゚ンゞニアは、䞻にその悪名高い䞍完党なメモリ管理のために、Javaを敬遠する傟向がありたす。ただし、今日では状況が異なり、Javaのコンテナずの互換性は近幎向䞊しおいたす。結局のずころ、ApacheKafkaやElasticsearchのような人気のあるシステムでさえJavaで実行されたす。



2017〜 2018幎には、䞀郚のアプリケヌションがJavaバヌゞョン8で実行されたした。圌らはしばしばDockerのようなコンテナ化された環境で機胜するこずを拒吊し、ヒヌプメモリの問題ずガベヌゞコレクタの䞍適切な䜜業のためにクラッシュしたした。結局のずころ、これらの問題は、JVMがLinuxコンテナ化メカニズムcgroupsおよびnamespacesを実行できないこずが原因でした。



それ以来、OracleはJavaのコンテナの䞖界ずの互換性を改善するために倚倧な努力を払っおきたした。早期のJavaのバヌゞョン8のように、実隓的なJVMフラグは、これらの問題に察凊するために登堎XX:+UnlockExperimentalVMOptions及びXX:+UseCGroupMemoryLimitForHeap.



しかし、すべおの改善にもかかわらず、誰もJavaはただ過床にメモリ集玄やPythonに比べお起動が遅いこずに悪い評刀を持っおいるず䞻匵しないだろう。たたは行く。これは䞻に、JVMおよびClassLoaderのメモリ管理の詳现によるものです。



今日、我々があれば持っおいるバヌゞョン11以䞊を䜿甚するためのJavaで動䜜するように、我々は少なくずも詊しおみたす。たた、Kubernetesのメモリ制限は、JVMの最倧ヒヌプメモリ制限よりも1 GB高くなっおいたす-Xmx 念のため。぀たり、JVMがヒヌプメモリに8 GBを䜿甚する堎合、アプリケヌションのKubernetesメモリ制限は9GBに蚭定されたす。これらの察策ず改善のおかげで、生掻は少し楜になりたした。



2.Kubernetesラむフサむクルに関連する曎新



Kubernetesのラむフサむクル管理曎新、远加は、特にクラスタヌがベアメタルたたは仮想マシンに基づいおいる堎合、面倒で難しいこずです。新しいバヌゞョンにアップグレヌドするには、新しいクラスタヌを䜜成しおからワヌクロヌドをそのクラスタヌに転送する方がはるかに簡単であるこずが刀明したした。既存のサむトのアップグレヌドは、倚倧な劎力ず慎重な蚈画を䌎うため、単玔に実行䞍可胜です。



これは、Kubernetesには、アップグレヌド時に考慮できない「可動」パヌツが倚すぎるためです。クラスタが機胜するためには、DockerからCalicoやFlannelなどのCNIプラグむンたで、これらすべおのコンポヌネントをたずめお収集する必芁がありたす。 Kubespray、KubeOne、kops、kube-awsなどのプロゞェクトは、プロセスをいくらか簡玠化したすが、欠点がないわけではありたせん。



Kubesprayを䜿甚しおRHEL仮想マシンにクラスタヌをデプロむしたした。圌は自分が優れおいるこずを蚌明した。Kubesprayには、ノヌドの䜜成、远加、削陀、バヌゞョンの曎新、および本番環境でKubernetesを操䜜するために必芁なほがすべおのスクリプトがありたした。ずはいえ、アップグレヌドスクリプトには、マむナヌバヌゞョンでもスキップしおはならないずいう譊告が䌎いたした。぀たり、目的のバヌゞョンに到達するには、ナヌザヌはすべおの䞭間バヌゞョンをむンストヌルする必芁がありたした。



ここでの䞻なポむントは、Kubernetesを䜿甚する予定がある堎合、たたはすでに䜿甚しおいる堎合は、K8sのラむフサむクルに関連する手順ず、それが゜リュヌションにどのように適合するかを怜蚎するこずです。倚くの堎合、クラスタヌを最新の状態に保぀よりも、クラスタヌを䜜成しお実行する方が簡単です。



3.ビルドしおデプロむしたす



ビルドずデプロむメントのパむプラむンを修正する必芁があるずいう事実に備えおください。Kubernetesぞの移行に䌎い、これらのプロセスは根本的に倉化したした。Jenkinsパむプラむンを再構築しただけでなく、Helmなどのツヌルを䜿甚しお、Gitの構築ず操䜜、Dockerむメヌゞのタグ付け、Helmチャヌトのバヌゞョン管理のための新しい戊略を開発したした。



コヌド、Kubernetesデプロむメントファむル、Dockerfiles、Dockerむメヌゞ、Helmチャヌトを維持するための単䞀の戊略ず、それらすべおを結び付ける方法が必芁になりたす。



䜕床か繰り返した埌、次の図に萜ち着きたした。



  • アプリケヌションコヌドずそのヘルムチャヌトは、異なるリポゞトリにありたす。これにより、それらを互いに独立しおバヌゞョン管理できたすセマンティックバヌゞョン管理。
  • , , . , , app-1.2.0 charts-1.1.0. (values) Helm, patch- (, 1.1.0 1.1.1). (RELEASE.txt) .
  • , Apache Kafka Redis ( ), . , Docker- Helm-. Docker- , .


(. .: Open Source- Kubernetes — werf — , .)



4. Liveness Readiness ( )



Kubernetesの掻性ず準備のチェックは、システムの問題に自埋的に察凊するのに最適です。障害が発生したずきにコンテナを再起動し、「異垞な」むンスタンスからトラフィックをリダむレクトできたす。ただし、状況によっおは、これらのチェックが䞡刃の剣に倉わり、アプリケヌションの起動ず回埩に圱響を䞎える可胜性がありたすこれは、メッセヌゞングプラットフォヌムやデヌタベヌスなどのステヌトフルアプリケヌションに特に圓おはたりたす。



私たちのカフカは圌らの犠牲者になりたした。私たちは3のステヌトフル蚭定しおいたBrokerのず3ZookeeperずのをreplicationFactor= 3、minInSyncReplica= 2.ランダムなクラッシュたたはクラッシュ埌に、Kafkaを再起動するず問題が発生したした。起動時に、Kafkaは砎損したむンデックスを修正するために远加のスクリプトを実行したした。これには、問題の重倧床に応じお10〜30分かかりたした。この遅延により、掻性テストが継続的に倱敗し、Kubernetesが「匷制終了」しおKafkaを再起動したした。その結果、Kafkaはむンデックスを修正するだけでなく、開始するこずさえできたした。



圓時の唯䞀の解決策initialDelaySecondsは、掻性テスト蚭定のパラメヌタヌを調敎しお、コンテナヌの起動埌にのみチェックが実行されるようにするこずでした。もちろん、䞻な課題は、どの遅延を蚭定するかを決定するこずです。障害が発生した埌の個々の開始には最倧1時間かかる堎合があり、これを考慮に入れる必芁がありたす。䞀方で、initialDelaySeconds、遅いKubernetesは、コンテナの起動䞭の障害に応答したす。



この堎合、スむヌトスポットは、initialDelaySecondsすべおの障害状況ディスク障害、ネットワヌクの問題、システムクラッシュなどでアプリケヌションを正垞に起動するのに十分な時間を䞎えながら、埩元力の芁件に最適な倀です。



曎新Kubernetesの最近のバヌゞョンでは、スタヌトアッププロヌブず呌ばれる3番目のタむプのテストが登堎したした。1.16リリヌス以降はアルファ版ずしお、1.18以降はベヌタ版ずしお利甚できたす。



スタヌトアッププロヌブは、コンテナが起動するたで準備チェックず掻性チェックを無効にするこずで䞊蚘の問題を解決し、それによっおアプリケヌションを正垞に起動できるようにしたす。


5.倖郚IPの操䜜



結局のずころ、静的な倖郚IPを䜿甚しおサヌビスにアクセスするず、カヌネルの接続远跡メカニズムに倧きな圧力がかかりたす。泚意深く考えないず、「壊れる」可胜性がありたす。



私たちのクラスタヌではCalico、CNIずBGPルヌティングプロトコルの䞡方を䜿甚し、境界ルヌタヌず察話したす。久郚プロキシモヌドが有効になりiptablesたす。 Kubernetesで非垞に忙しいサヌビス毎日数癟䞇の接続を凊理するぞのアクセスを倖郚IPを介しお開きたす。゜フトりェア定矩のネットワヌキングに由来するSNATずマスキングのため、Kubernetesにはこれらすべおの論理フロヌを远跡するメカニズムが必芁です。このため、K8sはこれらのコアツヌルonntrackをnetfilter..。圌らの助けを借りお、静的IPぞの倖郚接続を管理し、静的IPはサヌビスの内郚IPに倉換され、最埌にポッドのIPアドレスに倉換されたす。そしお、これはすべおテヌブルconntrackずiptablesを䜿甚しお行われたす。



ただし、テヌブルの可胜性はconntrack無制限ではありたせん。制限に達するず、Kubernetesクラスタヌより正確には、コアのOSカヌネルは新しい接続を受け入れるこずができなくなりたす。 RHELでは、この制限は次のように確認できたす。



$  sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_maxnet.netfilter.nf_conntrack_count = 167012
net.netfilter.nf_conntrack_max = 262144


この制限を回避する1぀の方法は、耇数のノヌドを゚ッゞルヌタヌず組み合わせお、静的IPぞの着信接続がクラスタヌ党䜓に分散されるようにするこずです。クラスタ内に倚数のマシンがある堎合、このアプロヌチでは、テヌブルのサむズを倧幅に増やしおconntrack、非垞に倚数の着信接続を凊理できたす。



2017幎に最初に始めたずき、これは私たちを完党に混乱させたした。しかし、比范的最近2019幎4月にキャリコプロゞェクトは「aptのタむトルの䞋に詳现な調査を公衚接続远跡はもはやあなたの友達ですなぜ」そこにあるこずのように翻蚳。ロシア語-箄TRANSLは。



本圓にKubernetesが必芁ですか



3幎が経ちたしたが、私たちは日々新しいこずを発芋・孊び続けおいたす。 Kubernetesは、特に環境の開始ず皌働の維持の分野で、独自の䞀連の課題を䌎う耇雑なプラットフォヌムです。それはあなたの考え方、建築、デザむンに察する態床を倉えるでしょう。チヌムのスケヌルアップずアップグレヌドに察凊する必芁がありたす。



䞀方、クラりドで䜜業し、Kubernetesをサヌビスずしお䜿甚できるようにするず、プラットフォヌムの保守内郚ネットワヌクのCIDRの拡匵やKubernetesの曎新などに関連するほずんどの心配がなくなりたす。



今日、私たちは自分自身に尋ねる䞻な質問が本圓にあるこずを理解するようになりたしたKubernetesが必芁ですか問題がどれほどグロヌバルであるか、そしおKubernetesがそれに察凊するのに圹立぀かどうかを評䟡するのに圹立ちたす。



問題は、Kubernetesぞの移行には費甚がかかるずいうこずです。したがっお、ナヌスケヌスの利点およびプラットフォヌムをどの皋床、どのように掻甚するかは、支​​払う䟡栌を正圓化するはずです。もしそうなら、Kubernetesはあなたの生産性を倧幅に向䞊させるこずができたす。



テクノロゞヌのためのテクノロゞヌは無意味であるこずを忘れないでください。



翻蚳者からのPS



私たちのブログも読んでください






All Articles