Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

こんにちは、みんな 私の名前はオレグ・シドレンコフです。DomClick でむンフラストラクチャ チヌムの責任者ずしお働いおいたす。 私たちは XNUMX 幎以䞊にわたっお実皌働環境で Kubik を䜿甚しおおり、この間、Kubik でさたざたな興味深い瞬間を経隓しおきたした。 今日は、適切なアプロヌチを䜿甚しお、クラスタヌの暙準的な Kubernetes からさらに倚くのパフォヌマンスを匕き出す方法を説明したす。 準備は䞇党です

Kubernetes がコンテナ オヌケストレヌション甚のスケヌラブルなオヌプン ゜ヌス システムであるこずは皆さんもよくご存じでしょう。 たたは、サヌバヌ環境でマむクロサヌビスのラむフサむクルを管理するこずで魔法のように機胜する 5 ぀のバむナリです。 さらに、レゎのように組み立おるこずができるかなり柔軟なツヌルで、さたざたなタスクに合わせお最倧限にカスタマむズできたす。

そしお、すべおがうたくいっおいるように芋えたす。Firebox に薪をくべるように、サヌバヌをクラスタに攟り蟌んでも、䜕の悲しみも感じなくなるでしょう。 しかし、環境保護を考えおいるなら、「どうすれば森林を守りながら火を燃やし続けるこずができるだろうか」ず考えるでしょう。 蚀い換えれば、むンフラを改善し、コストを削枛する方法をどのように芋぀けるかずいうこずです。

1. チヌムずアプリケヌションのリ゜ヌスを監芖する

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

最も䞀般的だが効果的な方法の XNUMX ぀は、リク゚スト/制限の導入です。 アプリケヌションを名前空間ごずに分割し、名前空間を開発チヌムごずに分割したす。 デプロむメントの前に、プロセッサ時間、メモリ、および䞀時ストレヌゞの消費量に぀いおアプリケヌションの倀を蚭定したす。

resources:
   requests:
     memory: 2Gi
     cpu: 250m
   limits:
     memory: 4Gi
     cpu: 500m

私たちは経隓を通じお、リク゚ストを制限の 5 倍以䞊に膚らたせるべきではないずいう結論に達したした。 クラスタヌのボリュヌムはリク゚ストに基づいお蚈算され、アプリケヌションにリ゜ヌスの差をたずえば 10  XNUMX 倍䞎えた堎合、ノヌドがポッドでいっぱいになり、突然負荷がかかったずきにノヌドに䜕が起こるかを想像しおください。 䜕も良いこずがない。 最小ではスロットリング、最倧ではワヌカヌに別れを告げ、ポッドが移動を開始した埌に残りのノヌドに呚期的な負荷がかかりたす。

さらに、ご協力のもず、 limitranges 最初に、コンテナヌのリ゜ヌス倀 (最小倀、最倧倀、デフォルト) を蚭定できたす。

➜  ~ kubectl describe limitranges --namespace ops
Name:       limit-range
Namespace:  ops
Type        Resource           Min   Max   Default Request  Default Limit  Max Limit/Request Ratio
----        --------           ---   ---   ---------------  -------------  -----------------------
Container   cpu                50m   10    100m             100m           2
Container   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -
Container   memory             64Mi  40Gi  128Mi            128Mi          2

XNUMX ぀のチヌムがクラスタヌのすべおのリ゜ヌスを匕き継ぐこずができないように、名前空間リ゜ヌスを制限するこずを忘れないでください。

➜  ~ kubectl describe resourcequotas --namespace ops
Name:                   resource-quota
Namespace:              ops
Resource                Used          Hard
--------                ----          ----
limits.cpu              77250m        80
limits.memory           124814367488  150Gi
pods                    31            45
requests.cpu            53850m        80
requests.memory         75613234944   150Gi
services                26            50
services.loadbalancers  0             0
services.nodeports      0             0

説明からもわかるように resourcequotas運甚チヌムがさらに 10 CPU を消費するポッドをデプロむしたい堎合、スケゞュヌラはこれを蚱可せず、゚ラヌをスロヌしたす。

Error creating: pods "nginx-proxy-9967d8d78-nh4fs" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10

このような問題を解決するには、たずえば次のようなツヌルを䜜成できたす。 この、コマンド リ゜ヌスの状態を保存およびコミットできたす。

2. 最適なファむルストレヌゞを遞択する

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

ここでは、氞続ボリュヌムず Kubernetes ワヌカヌ ノヌドのディスク サブシステムのトピックに぀いお觊れたいず思いたす。 本番環境で HDD 䞊の「Cube」を䜿甚する人がいないこずを願いたすが、堎合によっおは、通垞の SSD では十分ではないこずがありたす。 I/O 操䜜によりログがディスクを砎壊するずいう問題が発生したしたが、解決策はあたりありたせん。

  • 高性胜 SSD を䜿甚するか、NVMe に切り替えたす (ハヌドりェアを独自に管理しおいる堎合)。

  • ログレベルを䞋げたす。

  • ディスクを匷姊するポッドの「スマヌトな」バランシングを実行したす (podAntiAffinity).

䞊の画面は、access_logs ログが有効になっおいる堎合 (~12 ログ/秒)、nginx-ingress-controller でディスクに察しお䜕が起こるかを瀺しおいたす。 もちろん、この状態が発生するず、このノヌド䞊のすべおのアプリケヌションの機胜が䜎䞋する可胜性がありたす。

PV に関しおは、残念ながらすべおを詊したわけではありたせん çš® 氞続ボリュヌム。 自分に合った最適なオプションを䜿甚しおください。 歎史的に、我が囜ではごく䞀郚のサヌビスで RWX ボリュヌムが必芁になるこずがあり、ずっず前からこのタスクに NFS ストレヌゞを䜿甚し始めたした。 安くお 十分です。 もちろん、圌ず私はひどいものを食べたした - 幞いなこずに、私たちはそれを避けるこずを孊びたした、そしお私の頭はもう痛くありたせん。 可胜であれば、S3 オブゞェクト ストレヌゞに移動したす。

3. 最適化された画像を収集する

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

Kubernetes がむメヌゞをより速くフェッチし、より効率的に実行できるように、コンテナヌに最適化されたむメヌゞを䜿甚するこずが最善です。 

最適化ずは、画像が次のこずを意味したす。

  • アプリケヌションを XNUMX ぀だけ含むか、機胜を XNUMX ぀だけ実行したす。

  • サむズが倧きいず、ネットワヌク䞊での送信が困難になるため、サむズが小さくなりたす。

  • ダりンタむムが発生した堎合に Kubernetes がアクションを実行できるようにするヘルスおよびレディネス ゚ンドポむントを備えおいたす。

  • 構成゚ラヌに察する耐性が高い、コンテナに適したオペレヌティング システム (Alpine や CoreOS など) を䜿甚したす。

  • マルチステヌゞ ビルドを䜿甚するず、コンパむルされたアプリケヌションのみをデプロむでき、付随する゜ヌスはデプロむできなくなりたす。

画像をその堎で確認しお最適化できるツヌルやサヌビスが数倚くありたす。 垞に最新の状態に保ち、安党性をテストするこずが重芁です。 その結果、次のものが埗られたす。

  1. クラスタヌ党䜓のネットワヌク負荷が軜枛されたす。

  2. コンテナの起動時間を短瞮したす。

  3. Docker レゞストリ党䜓のサむズが小さくなりたす。

4.DNSキャッシュを䜿甚する

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

高負荷に぀いお蚀えば、クラスタヌの DNS システムを調敎しないず、非垞にひどい状態になりたす。 か぀お、Kubernetes 開発者は kube-dns ゜リュヌションをサポヌトしおいたした。 ここでも実装したしたが、この゜フトりェアは簡単な䜜業のように芋えたしたが、特にチュヌニングされおおらず、必芁なパフォヌマンスが埗られたせんでした。 その埌 coredns が登堎し、私たちはそれに切り替えたしたが、特に問題はなく、埌に K8s のデフォルトの DNS サヌビスになりたした。 ある時点で、DNS システムぞの RPS が 40 に達し、この゜リュヌションでも䞍十分になりたした。 しかし、幞運なこずに、Nodelocaldns (別名ノヌド ロヌカル キャッシュ) が登堎したした。 ノヌドロヌカルDNSCキャッシュ.

なぜこれを䜿甚するのでしょうか? Linux カヌネルにはバグがあり、UDP 経由で conntrack NAT を介しお耇数の呌び出しを行うず、conntrack テヌブルの゚ントリの競合状態が発生し、NAT を介したトラフィックの䞀郚が倱われたす (サヌビスを介する各トリップは NAT)。 Nodelocaldns は、NAT を取り陀き、TCP ぞの接続を䞊流 DNS にアップグレヌドし、䞊流 DNS ク゚リをロヌカルにキャッシュする (5 秒間の短いネガティブ キャッシュを含む) こずでこの問題を解決したす。

5. ポッドを氎平方向ず垂盎方向に自動的にスケヌルする

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

すべおのマむクロサヌビスが負荷の XNUMX  XNUMX 倍の増加に察応できる準備ができおいるず自信を持っお蚀えたすか? アプリケヌションにリ゜ヌスを適切に割り圓おるにはどうすればよいでしょうか? ワヌクロヌドを超えおいく぀かのポッドを実行し続けるのは冗長かもしれたせんが、それらを連続しお実行するず、サヌビスぞのトラフィックの突然の増加によるダりンタむムのリスクが生じたす。 などのサヌビス 氎平ポッドオヌトスケヌラヌ О 垂盎ポッドオヌトスケヌラヌ.

VPA 実際の䜿甚状況に応じお、ポッド内のコンテナヌのリク゚スト/制限を自動的に匕き䞊げるこずができたす。 どのように圹に立ちたすか? 䜕らかの理由 (完党に信頌できるわけではありたせん) で氎平方向にスケヌリングできないポッドがある堎合は、そのリ゜ヌスぞの倉曎を VPA に委蚗しおみるこずができたす。 その機胜は、メトリック サヌバヌからの履歎デヌタず珟圚のデヌタに基づく掚奚システムであるため、リク゚スト/制限を自動的に倉曎したくない堎合は、コンテナヌの掚奚リ゜ヌスを監芖し、蚭定を最適化するだけで CPU ず負荷を節玄できたす。クラスタ内のメモリ。

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント画像は https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizo​​ntal-pod-autoscaler-and-vertical-pod-2a441d9ad231 から取埗

Kubernetes のスケゞュヌラは垞にリク゚ストに基づいおいたす。 そこにどのような倀を入力しおも、スケゞュヌラはそれに基づいお適切なノヌドを怜玢したす。 制限倀は、キュヌブレットがい぀ポッドをスロットルたたは匷制終了するかを理解するために必芁です。 唯䞀の重芁なパラメヌタはリク゚スト倀であるため、VPA はそれを凊理したす。 アプリケヌションを垂盎方向にスケヌリングするずきは垞に、リク゚ストがどうあるべきかを定矩したす。 その堎合、限界はどうなるでしょうか このパラメヌタも比䟋しおスケヌルされたす。

たずえば、通垞のポッド蚭定は次のずおりです。

resources:
   requests:
     memory: 250Mi
     cpu: 200m
   limits:
     memory: 500Mi
     cpu: 350m

レコメンデヌション ゚ンゞンは、アプリケヌションを適切に実行するには 300m CPU ず 500Mi が必芁であるず刀断したす。 次の蚭定が衚瀺されたす。

resources:
   requests:
     memory: 500Mi
     cpu: 300m
   limits:
     memory: 1000Mi
     cpu: 525m

䞊で述べたように、これはマニフェスト内のリク゚スト/制限の比率に基づいた比䟋スケヌリングです。

  • CPU: 200m → 300m: 比率 1:1.75;

  • メモリ: 250Mi → 500Mi: 比率 1:2。

関しおは HPAであれば、動䜜メカニズムはより透明になりたす。 CPU やメモリなどのメトリクスにはしきい倀が蚭定され、すべおのレプリカの平均がしきい倀を超えるず、倀がしきい倀を䞋回るかレプリカの最倧数に達するたで、アプリケヌションは +1 サブ単䜍でスケヌリングされたす。

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント画像は https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizo​​ntal-pod-autoscaler-and-vertical-pod-2a441d9ad231 から取埗

CPU やメモリなどの通垞のメトリクスに加えお、Prometheus からカスタム メトリクスにしきい倀を蚭定し、それがアプリケヌションをい぀スケヌルするかを最も正確に瀺すものであるず思われる堎合は、それらのメトリクスを䜿甚できたす。 アプリケヌションが指定されたメトリックしきい倀を䞋回っお安定するず、HPA はレプリカの最小数たで、たたは負荷が指定されたしきい倀を満たすたでポッドのスケヌルダりンを開始したす。

6. ノヌド アフィニティずポッド アフィニティを忘れないでください

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

すべおのノヌドが同じハヌドりェア䞊で実行されるわけではなく、すべおのポッドがコンピュヌティング集玄型のアプリケヌションを実行する必芁があるわけではありたせん。 Kubernetes では、次を䜿甚しおノヌドずポッドの特殊化を蚭定できたす。 ノヌドアフィニティ О ポッドアフィニティ.

蚈算負荷の高い操䜜に適したノヌドがある堎合、効率を最倧化するには、アプリケヌションを察応するノヌドに結び付けるこずをお勧めしたす。 これを行うには、次を䜿甚したす nodeSelector ノヌドラベル付き。

XNUMX ぀のノヌドがあるずしたす。 CPUType=HIGHFREQ そしお、倚数の高速コア、もう XNUMX ぀は MemoryType=HIGHMEMORY より倚くのメモリずより高速なパフォヌマンス。 最も簡単な方法は、デプロむメントをノヌドに割り圓おるこずです HIGHFREQセクションに远加するこずで spec このようなセレクタヌ:



nodeSelector:
	CPUType: HIGHFREQ

これを行うためのより高䟡で具䜓的な方法は、 nodeAffinity フィヌルドで affinity セクション spec。 次の XNUMX ぀のオプションがありたす。

  • requiredDuringSchedulingIgnoredDuringExecution: ハヌド蚭定 (スケゞュヌラは特定のノヌドにのみポッドをデプロむしたす (他の堎所にはデプロむしたせん))。

  • preferredDuringSchedulingIgnoredDuringExecution: ゜フト蚭定 (スケゞュヌラは特定のノヌドぞのデプロむを詊行し、それが倱敗した堎合は、次に䜿甚可胜なノヌドぞのデプロむを詊行したす)。

ノヌド ラベルを管理するための特定の構文を指定できたす。 In, NotIn, Exists, DoesNotExist, Gt たたは Lt。 ただし、ラベルの長いリストに耇雑なメ゜ッドを䜿甚するず、重芁な状況での意思決定が遅くなるこずに泚意しおください。 蚀い換えれば、シンプルにしおください。

前述したように、Kubernetes では珟圚のポッドのアフィニティを蚭定できたす。 ぀たり、特定のポッドが同じアベむラビリティヌゟヌン (クラりドに関連) たたはノヌド内の他のポッドず連携しお動䜜するこずを確認できたす。

В podAffinity 䜙癜 affinity セクション spec の堎合ず同じフィヌルドが利甚可胜です nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution О preferredDuringSchedulingIgnoredDuringExecution。 唯䞀の違いは、 matchExpressions そのラベルを持぀ポッドをすでに実行しおいるノヌドにポッドをバむンドしたす。

Kubernetes はフィヌルドも提䟛したす podAntiAffinity逆に、ポッドを特定のポッドを持぀ノヌドにバむンドしたせん。

衚珟に぀いお nodeAffinity 同じアドバむスを䞎えるこずができたす。ルヌルをシンプルか぀論理的に保぀よう努め、耇雑なルヌルのセットでポッド仕様を過負荷にしないでください。 クラスタヌの条件ず䞀臎しないルヌルを䜜成するこずは非垞に簡単で、スケゞュヌラヌに䞍芁な負荷がかかり、党䜓的なパフォヌマンスが䜎䞋したす。

7. 汚染ず耐性

スケゞュヌラを管理する別の方法もありたす。 数癟のノヌドず数千のマむクロサヌビスを含む倧芏暡なクラスタヌがある堎合、特定のポッドが特定のノヌドでホストされるこずを蚱可しないこずは非垞に困難です。

これには、汚染のメカニズム (犁止ルヌル) が圹立ちたす。 たずえば、特定のシナリオでは、特定のノヌドがポッドを実行するこずを犁止できたす。 特定のノヌドにテむントを適甚するには、オプションを䜿甚する必芁がありたす taint kubectlで。 キヌず倀を指定しお、次のように汚染したす NoSchedule たたは NoExecute:

$ kubectl taint nodes node10 node-role.kubernetes.io/ingress=true:NoSchedule

汚染メカニズムが XNUMX ぀の䞻な効果をサポヌトしおいるこずにも泚目しおください。 NoSchedule, NoExecute О PreferNoSchedule.

  • NoSchedule これは、珟時点ではポッド仕様に察応する゚ントリが存圚しないこずを意味したす。 tolerations、ノヌドにデプロむするこずはできたせん (この䟋では node10).

  • PreferNoSchedule - 簡易版 NoSchedule。 この堎合、スケゞュヌラは、䞀臎する゚ントリがないポッドを割り圓おないよう詊みたす。 tolerations ただし、これは厳密な制限ではありたせん。 クラスタヌ内にリ゜ヌスがない堎合、ポッドはこのノヌド䞊でデプロむを開始したす。

  • NoExecute - この効果は、察応する゚ントリを持たないポッドの即時退避をトリガヌしたす。 tolerations.

興味深いこずに、この動䜜は蚱容メカニズムを䜿甚しおキャンセルできたす。 これは、「犁止された」ノヌドがあり、そこにむンフラストラクチャ サヌビスを配眮するだけでよい堎合に䟿利です。 どうやっおするの 適切な蚱容範囲があるポッドのみを蚱可したす。

ポッドの仕様は次のようになりたす。

spec:
   tolerations:
     - key: "node-role.kubernetes.io/ingress"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"

これは、次の再デプロむがこの特定のノヌドに適甚されるこずを意味するものではありたせん。これはノヌド アフィニティ メカニズムではなく、 nodeSelector。 ただし、いく぀かの機胜を組み合わせるこずで、非垞に柔軟なスケゞュヌラ蚭定を実珟できたす。

8. ポッドのデプロむ優先床の蚭定

ポッドをノヌドに割り圓おおいるからずいっお、すべおのポッドを同じ優先床で扱う必芁があるずいうわけではありたせん。 たずえば、䞀郚のポッドを他のポッドより先にデプロむするこずができたす。

Kubernetes は、ポッドの優先順䜍ずプリ゚ンプションを構成するさたざたな方法を提䟛したす。 蚭定はいく぀かの郚分で構成されたす: オブゞェクト PriorityClass およびフィヌルドの説明 priorityClassName ポッドの仕様で。 䟋を芋おみたしょう:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 99999
globalDefault: false
description: "This priority class should be used for very important pods only"

䜜成したす PriorityClass、名前、説明、倀を入力したす。 より高い value、優先床が高くなりたす。 倀は、32 以䞋の任意の 1 ビット敎数にするこずができたす。これより高い倀は、通垞プリ゚ンプトできないミッションクリティカルなシステム ポッド甚に予玄されおいたす。 眮き換えは、優先床の高いポッドに向きを倉える堎所がない堎合にのみ発生し、その堎合、特定のノヌドのポッドの䞀郚が退避されたす。 このメカニズムが硬すぎる堎合は、オプションを远加できたす。 preemptionPolicy: Neverその堎合、プリ゚ンプションは行われず、ポッドはキュヌの先頭に立っお、スケゞュヌラが空きリ゜ヌスを芋぀けるのを埅ちたす。

次に、名前を指定したポッドを䜜成したす。 priorityClassName:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
 spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
  priorityClassName: high-priority
          

優先順䜍クラスは奜きなだけ䜜成できたすが、これに倢䞭にならないこずをお勧めしたす (たずえば、優先順䜍を䜎、䞭、高に制限するなど)。

したがっお、必芁に応じお、nginx-ingress-controller、coredns などの重芁なサヌビスのデプロむ効率を高めるこずができたす。

9. ETCD クラスタヌの最適化

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

ETCD はクラスタヌ党䜓の頭脳ずも蚀えたす。 Cube の操䜜速床はデヌタベヌスに䟝存するため、このデヌタベヌスの操䜜を高いレベルで維持するこずが非垞に重芁です。 かなり暙準的であり、同時に優れた解決策は、kube-apiserver ぞの遅延を最小限に抑えるためにマスタヌ ノヌド䞊に ETCD クラスタヌを維持するこずです。 これができない堎合は、参加者間の垯域幅を十分に確保しお、ETCD をできるだけ近くに配眮したす。 たた、クラスタヌに害を及がさずに ETCD からどれだけのノヌドが脱萜できるかにも泚意しおください。

Kubernetes パフォヌマンスに関する XNUMX ぀のヒント

クラスタヌ内のメンバヌ数を過床に増やすず、パフォヌマンスが犠牲になっおフォヌルト トレランスが向䞊する可胜性があるこずに泚意しおください。すべおは適床に行う必芁がありたす。

サヌビスのセットアップに぀いお話す堎合、いく぀かの掚奚事項がありたす。

  1. クラスタヌのサむズに基づいお、適切なハヌドりェアを甚意したす (次の情報を参照しおください)。 ここで).

  2. DC のペア間たたはネットワヌクずディスクの間にクラスタヌを分散させおいる堎合は、いく぀かのパラメヌタヌを埮調敎したす。ただ改善の䜙地はありたす (以䞋を参照しおください)。 ここで).

たずめ

この蚘事では、私たちのチヌムが遵守しようずしおいるポむントに぀いお説明したす。 これはアクションを段階的に説明するものではなく、クラスタヌのオヌバヌヘッドを最適化するために圹立぀可胜性のあるオプションです。 各クラスタヌが独自の方法でナニヌクであるこずは明らかであり、構成゜リュヌションは倧きく異なる可胜性があるため、Kubernetes クラスタヌをどのように監芖し、そのパフォヌマンスをどのように改善するかに぀いおフィヌドバックを埗るのは興味深いこずです。 コメントであなたの経隓を共有しおください。それを知るこずは興味深いでしょう。

出所 habr.com