Kubernetes 䜿甚時によくある 10 の間違い

ノヌト。 翻蚳。: この蚘事の著者は、チェコの小さな䌚瀟、pipetail の゚ンゞニアです。 圌らは、Kubernetes クラスタヌの運甚に関連する [時にはありふれたものですが、それでも] 非垞に差し迫った問題ず誀解の玠晎らしいリストをたずめるこずに成功したした。

Kubernetes 䜿甚時によくある 10 の間違い

長幎にわたっお Kubernetes を䜿甚しおきたため、私たちは倚数のクラスタヌ (GCP、AWS、Azure 䞊のマネヌゞドクラスタヌずアンマネヌゞドクラスタヌの䞡方) を操䜜しおきたした。 時間が経぀に぀れお、いく぀かの間違いが垞に繰り返されおいるこずに気づき始めたした。 しかし、これは恥ずべきこずではありたせん。ほずんどのこずは私たち自身で行ったのです。

この蚘事には、最も䞀般的な゚ラヌが含たれおおり、それらを修正する方法に぀いおも説明されおいたす。

1. リ゜ヌス: リク゚ストず制限

このアむテムは間違いなく最も泚目を集め、リストの最初の堎所に倀したす。

通垞、CPU リク゚スト たったく指定されおいないか、倀が非垞に䜎いかのどちらかです (各ノヌドにできるだけ倚くのポッドを配眮するため)。 したがっお、ノヌドは過負荷になりたす。 高負荷時には、ノヌドの凊理胜力が最倧限に掻甚され、特定のワヌクロヌドは「芁求」したものだけを受け取りたす。 CPU スロットル。 これにより、アプリケヌションの遅延、タむムアりト、その他の䞍快な結果が増加したす。 (これに぀いお詳しくは、最近の翻蚳をご芧ください:Kubernetes の CPU 制限ず積極的なスロットル" - 玄。 翻蚳

最倧限の努力 非垞に ノヌ 掚奚

resources: {}

非垞に䜎い CPU リク゚スト (非垞に䜎い) ノヌ 掚奚

   resources:
      Requests:
        cpu: "1m"

䞀方、CPU 制限が存圚するず、ノヌド プロセッサが完党にロヌドされおいない堎合でも、ポッドによるクロック サむクルの䞍圓なスキップが発生する可胜性がありたす。 繰り返したすが、これにより遅延が増加する可胜性がありたす。 パラメヌタを巡る論争は続く CPU CFS クォヌタ Linux カヌネルでは、蚭定された制限に応じお CPU スロットリングが行われ、さらに CFS クォヌタが無効になりたす...悲しいこずに、CPU 制限は、解決できる以䞊の問題を匕き起こす可胜性がありたす。 詳现に぀いおは、以䞋のリンクを参照しおください。

過剰な遞択 (オヌバヌコミット) メモリの問題は、より倧きな問題に぀ながる可胜性がありたす。 CPU の制限に達するずクロック サむクルがスキップされ、メモリの制限に達するずポッドが匷制終了されたす。 芳察したこずがありたすか OOMkill? はい、たさにそれが私たちが話しおいるこずです。

このようなこずが起こる可胜性を最小限に抑えたいですか? (以䞋の䟋のように) メモリ芁求を制限倀に蚭定するこずで、メモリを過剰に割り圓おず、保蚌された QoS (サヌビス品質) を䜿甚したす。 これに぀いお詳しくは、 ヘニング・ゞェむコブスのプレれンテヌション (Zalando のリヌド゚ンゞニア)。

砎裂性 (OOMkillされる可胜性が高くなりたす):

   resources:
      requests:
        memory: "128Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: 2

保蚌された:

   resources:
      requests:
        memory: "128Mi"
        cpu: 2
      limits:
        memory: "128Mi"
        cpu: 2

リ゜ヌスを蚭定するずきに䜕が圹立぀可胜性がありたすか?

ずずも​​に メトリクスサヌバヌ ポッド (およびポッド内のコンテナヌ) による珟圚の CPU リ゜ヌス消費量ずメモリ䜿甚量を確認できたす。 おそらく、すでに䜿甚しおいるこずでしょう。 次のコマンドを実行するだけです。

kubectl top pods
kubectl top pods --containers
kubectl top nodes

ただし、珟圚の䜿甚状況のみが衚瀺されたす。 これにより、おおよその芏暡を把握できたすが、最終的には次のこずが必芁になりたす。 時間の経過に䌎うメトリクスの倉化の履歎 (「CPU のピヌク負荷はどれくらいでしたか?」、「昚日の朝の負荷はどれくらいでしたか?」などの質問に答えるため)。 このために䜿甚できたす プロメテりス, デヌタドッグ およびその他のツヌル。 メトリクスサヌバヌからメトリクスを取埗しお保存するだけで、ナヌザヌはメトリクスをク゚リしお、それに応じおプロットするこずができたす。

垂盎ポッドオヌトスケヌラヌ 蚱可する 自動化 このプロセス。 CPU ずメモリの䜿甚履歎を远跡し、この情報に基づいお新しいリク゚ストず制限を蚭定したす。

コンピュヌティング胜力を効率的に䜿甚するこずは簡単な䜜業ではありたせん。 テトリスをずっずプレむしおいるようなものです。 平均消費量が䜎い (たずえば、玄 10%) コンピュヌティング胜力に倚額の費甚を支払っおいる堎合は、AWS Fargate たたは Virtual Kubelet をベヌスにした補品を怜蚎するこずをお勧めしたす。 これらはサヌバヌレス/埓量制課金モデルに基づいお構築されおおり、そのような状況ではコストが安くなる可胜性がありたす。

2. Liveness プロヌブず Readiness プロヌブ

デフォルトでは、Kubernetes では liveness チェックず readiness チェックが有効になっおいたせん。 そしお時々電源を入れ忘れるこずもありたす...

しかし、臎呜的な゚ラヌが発生した堎合にサヌビスの再起動を開始するには、他にどのようにすればよいでしょうか? たた、ロヌド バランサヌは、ポッドがトラフィックを受け入れる準備ができおいるこずをどのようにしお知るのでしょうか? それずもより倚くのトラフィックを凊理できるのでしょうか?

これらのテストは互いに混同されるこずがよくありたす。

  • 掻気 — 「生存性」チェック。倱敗した堎合にポッドを再起動したす。
  • 準備 — 準備状況チェック。倱敗した堎合、ポッドを Kubernetes サヌビスから切断したす (これは次のコマンドを䜿甚しお確認できたす) kubectl get endpoints) ずなり、次のチェックが正垞に完了するたでトラフィックは到着したせん。

これらのチェックは䞡方ずも ポッドのラむフサむクル党䜓にわたっお実行されたす。 それは非垞に重芁です。

よくある誀解は、readiness プロヌブは起動時にのみ実行され、ポッドの準備ができおいるこずをバランサヌが認識できるずいうものです (Ready) になり、トラフィックの凊理を開始できるようになりたす。 ただし、これは䜿甚䞊のオプションの XNUMX ぀にすぎたせん。

もう XNUMX ぀は、ポッド䞊のトラフィックが過剰であるこずが刀明する可胜性です。 過負荷になる (たたはポッドがリ゜ヌスを倧量に消費する蚈算を実行したす)。 この堎合、準備状況チェックが圹に立ちたす。 ポッドの負荷を軜枛し、ポッドを「冷华」したす。。 今埌、準備状況チェックが正垞に完了するず、 ポッドの負荷を再び増加させたす。 この堎合 (準備テストが倱敗した堎合)、掻性テストの倱敗は非垞に逆効果になりたす。 健党で䞀生懞呜に動䜜しおいるポッドを再起動する必芁はありたせん。

したがっお、堎合によっおは、誀っお蚭定されたパラメヌタヌを䜿甚しおチェックを有効にするよりも、たったくチェックを行わない方が良い堎合がありたす。 䞊で述べたように、もし 掻性チェックは準備チェックをコピヌしたす、それでは倧倉なこずになりたす。 可胜なオプションは次のずおりです 準備テストのみず 危険な生呜力 脇に眮いおおいおください。

共通の䟝存関係が倱敗した堎合、どちらのタむプのチェックも倱敗すべきではありたせん。倱敗しないず、すべおのポッドの連鎖的 (雪厩のような) 倱敗が発生したす。 蚀い換えるず、 自分を傷぀けないでください.

3. 各HTTPサヌビスのロヌドバランサヌ

おそらく、クラスタヌ内に倖郚に転送したい HTTP サヌビスがあるず思いたす。

次のようにサヌビスを開くず、 type: LoadBalancer、そのコントロヌラヌ (サヌビス プロバむダヌによっお異なりたす) は、倖郚ロヌドバランサヌ (必ずしも L7 で実行されるわけではなく、むしろ L4 で実行される堎合もありたす) を提䟛およびネゎシ゚ヌトしたす。これは、コスト (倖郚静的 IPv4 アドレス、コンピュヌティング胜力、秒単䜍の請求) に圱響を䞎える可胜性がありたす。 そのようなリ゜ヌスを倚数䜜成する必芁があるためです。

この堎合、XNUMX ぀の倖郚ロヌド バランサヌを䜿甚しおサヌビスを開く方がはるかに論理的です。 type: NodePort。 あるいは、さらに良いのは、次のようなものを展開するこずです nginx-ingress-controller たたは トレフィク、誰が唯䞀の人になりたすか ノヌドポヌト 倖郚ロヌド バランサヌに関連付けられた゚ンドポむント。次を䜿甚しおクラスタヌ内のトラフィックをルヌティングしたす。 進入-Kubernetes リ゜ヌス。

盞互に察話する他のクラスタヌ内 (マむクロ) サヌビスは、次のようなサヌビスを䜿甚しお「通信」できたす。 クラスタヌIP DNS を介した組み蟌みのサヌビス怜出メカニズム。 パブリック DNS/IP は䜿甚しないでください。これは遅延に圱響を䞎え、クラりド サヌビスのコストを増加させる可胜性がありたす。

4. クラスタヌの機胜を考慮せずにクラスタヌを自動スケヌルする

クラスタヌにノヌドを远加したり、クラスタヌからノヌドを削陀したりする堎合、それらのノヌドの CPU 䜿甚率などの基本的なメトリクスに䟝存すべきではありたせん。 ポッドの蚈画では、倚くのこずを考慮する必芁がありたす 制限ポッド/ノヌドのアフィニティ、テむントず蚱容、リ゜ヌス リク゚スト、QoS など。 これらの埮劙な違いを考慮せずに倖郚オヌトスケヌラヌを䜿甚するず、問題が発生する可胜性がありたす。

特定のポッドをスケゞュヌルする必芁があるが、利甚可胜なすべおの CPU パワヌが芁求たたは逆アセンブルされ、ポッドが 状態に陥っおしたう Pending。 倖郚オヌトスケヌラヌは珟圚の平均 CPU 負荷 (芁求されたものではない) を確認し、拡匵を開始したせん。 芏栌倖 - 別のノヌドを远加したせん。 その結果、このポッドはスケゞュヌルされたせん。

この堎合、逆スケヌリング (スケヌルむン) — クラスタヌからノヌドを削陀するこずは垞に実装が困難です。 ステヌトフル ポッド (氞続ストレヌゞが接続されおいる) があるず想像しおください。 氞続ボリュヌム 通垞は所属する 特定のアベむラビリティヌゟヌン リヌゞョン内では耇補されたせん。 したがっお、倖郚オヌトスケヌラヌがこのポッドを含むノヌドを削陀するず、スケゞュヌラヌは別のノヌドでこのポッドをスケゞュヌルできなくなりたす。これは、氞続ストレヌゞが配眮されおいる可甚性ゟヌンでのみ実行できるためです。 ポッドがスタック状態になる Pending.

Kubernetes コミュニティで非垞に人気のある クラスタヌオヌトスケヌラヌ。 クラスタヌ䞊で実行され、䞻芁なクラりド プロバむダヌの API をサポヌトし、すべおの制限を考慮し、䞊蚘の堎合に拡匵できたす。 たた、蚭定されたすべおの制限を維持しながらスケヌルむンするこずもできるため、コスト (未䜿甚の容量に費やされるこずになるコスト) を節玄できたす。

5. IAM/RBAC 機胜の無芖

氞続的なシヌクレットを持぀ IAM ナヌザヌの䜿甚には泚意しおください。 マシンずアプリケヌション。 ロヌルずサヌビス アカりントを䜿甚しお䞀時的なアクセスを敎理する (サヌビスアカりント).

Cloud IAM にアクセスできるにもかかわらず、アクセス キヌ (およびシヌクレット) がアプリケヌション構成にハヌドコヌディングされおいるだけでなく、シヌクレットのロヌテヌションが無芖されおいるずいう事実によく遭遇したす。 必芁に応じお、ナヌザヌの代わりに IAM ロヌルずサヌビス アカりントを䜿甚したす。

Kubernetes 䜿甚時によくある 10 の間違い

kube2iam のこずは忘れお、サヌビス アカりントの IAM ロヌルに盎接進みたす (「 同じ名前のメモ シュテパン・ノラニヌ):

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
  name: my-serviceaccount
  namespace: default

泚釈が XNUMX ぀ありたす。 そんなに難しくないですよね

たた、サヌビス アカりントずむンスタンス プロファむルの暩限を付䞎しないでください。 admin О cluster-admin圌らがそれを必芁ずしないなら。 これは、特に RBAC K8 では実装が少し難しくなりたすが、努力する䟡倀は間違いなくありたす。

6. ポッドの自動アンチアフィニティに䟝存しない

ノヌド䞊にあるデプロむメントの XNUMX ぀のレプリカがあるず想像しおください。 ノヌドが萜ち、それに䌎っおすべおのレプリカも萜ちたす。 䞍快な状況ですよね しかし、なぜすべおのレプリカが同じノヌド䞊にあったのでしょうか? Kubernetes は高可甚性 (HA) を提䟛するものではないでしょうか?!

残念ながら、Kubernetes スケゞュヌラは、独自の刀断で、分離存圚のルヌルに準拠しおいたせん。 (アンチアフィニティ) ポッド甚。 それらは明瀺的に指定する必芁がありたす。

// ПпущеМП Ўля краткПстО
      labels:
        app: zk
// ПпущеМП Ўля краткПстО
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"

それだけです。 これで、ポッドは別のノヌドでスケゞュヌルされたす (この条件はスケゞュヌル䞭にのみチェックされ、操䜜䞭にはチェックされたせん)。 requiredDuringSchedulingIgnoredDuringExecution).

ここで私たちが話しおいるのは、 podAntiAffinity 異なるノヌド䞊: topologyKey: "kubernetes.io/hostname", - 異なるアベむラビリティヌゟヌンに぀いおではありたせん。 本栌的な HA を実装するには、このトピックをさらに深く掘り䞋げる必芁がありたす。

7. PodDisruptionBudget の無芖

Kubernetes クラスタヌ䞊に実皌働負荷があるず想像しおください。 定期的に、ノヌドずクラスタヌ自䜓を曎新 (たたは廃止) する必芁がありたす。 PodDisruptionBudget (PDB) は、クラスタヌ管理者ずナヌザヌ間のサヌビス保蚌契玄のようなものです。

PDB を䜿甚するず、ノヌド䞍足によるサヌビスの䞭断を回避できたす。

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: zookeeper

この䟋では、クラスタヌのナヌザヌずしお、管理者に次のように述べたす。「私は Zookeeper サヌビスを持っおいたす。䜕をするにしおも、このサヌビスの少なくずも 2 ぀のレプリカを垞に䜿甚できるようにしたいのです。」

これに぀いお詳しく読むこずができたす ここで.

8. 共通クラスタヌ内の耇数のナヌザヌたたは環境

Kubernetes 名前空間 (名前空間) 匷力な絶瞁を提䟛しない.

よくある誀解は、非本番ロヌドを XNUMX ぀の名前空間にデプロむし、本番ロヌドを別の名前空間にデプロむするず、 お互いにいかなる圱響も䞎えたせん...ただし、リ゜ヌスの芁求/制限、クォヌタの蚭定、および priorityClasses の蚭定を䜿甚しお、䞀定レベルの分離を達成できたす。 デヌタ プレヌン内の䞀郚の「物理的」分離は、アフィニティ、蚱容範囲、テむント (たたはノヌドセレクタヌ) によっお提䟛されたすが、そのような分離は完党に分離されたす。 難しい 埋め蟌む。

同じクラスタヌ内で䞡方のタむプのワヌクロヌドを組み合わせる必芁がある堎合は、耇雑さに察凊する必芁がありたす。 そのような必芁がなく、䜙裕がある堎合は、 もう䞀぀のクラスタヌ (たずえば、パブリック クラりド内で) であれば、そうする方が良いでしょう。 これにより、より高いレベルの断熱性が実珟されたす。

9. externalTrafficPolicy: クラスタヌ

クラスタヌ内のすべおのトラフィックが、デフォルトのポリシヌが蚭定されおいる NodePort などのサヌビスを経由しおいるこずがよく芋られたす。 externalTrafficPolicy: Cluster。 ぀たり、 ノヌドポヌト はクラスタヌ内のすべおのノヌドで開いおおり、それらのいずれかを䜿甚しお目的のサヌビス (ポッドのセット) ず察話できたす。

Kubernetes 䜿甚時によくある 10 の間違い

同時に、䞊蚘の NodePort サヌビスに関連付けられた実際のポッドは、通垞、特定のサヌバヌでのみ利甚可胜です。 これらのノヌドのサブセット。 ぀たり、必芁なポッドがないノヌドに接続するず、トラフィックが別のノヌドに転送されたす。 ホップを远加する レむテンシの増加 (ノヌドが異なるアベむラビリティ ゟヌン/デヌタ センタヌに配眮されおいる堎合、レむテンシは非垞に高くなる可胜性がありたす。さらに、䞋りトラフィックのコストも増加したす)。

䞀方、特定の Kubernetes サヌビスにポリシヌが蚭定されおいる堎合、 externalTrafficPolicy: Localそうするず、必芁なポッドが実際に実行されおいるノヌドでのみ NodePort が開きたす。 状態を確認する倖郚ロヌドバランサを䜿甚する堎合 (健康蚺断) ゚ンドポむント (どのように機胜するか) AWS ELB、 圌 必芁なノヌドにのみトラフィックを送信したす、これは遅延、コンピュヌティングのニヌズ、䞋り料金に有益な効果をもたらしたすそしお垞識的には同様です。

すでに次のようなものを䜿甚しおいる可胜性が高いです トレフィク たたは nginx-ingress-controller NodePort ゚ンドポむント (たたは NodePort を䜿甚する LoadBalancer) ずしお HTTP 受信トラフィックをルヌティングし、このオプションを蚭定するず、そのようなリク゚ストの埅ち時間を倧幅に短瞮できたす。

В この出版物 externalTrafficPolicy ずその利点ず欠点に぀いお詳しく孊ぶこずができたす。

10. クラスタヌに瞛られず、コントロヌル プレヌンを乱甚しないでください。

以前は、サヌバヌを適切な名前で呌び出すのが慣䟋でした。 アントン、HAL9000、Colossus...珟圚、それらはランダムに生成された識別子に眮き換えられおいたす。 しかし、その習慣は残り、珟圚では固有名詞がクラスタヌに属したす。

兞型的なストヌリヌ (実際の出来事に基づく): すべおは抂念実蚌から始たったので、クラスタヌには誇らしい名前が付けられたした テスト 䜕幎も経ちたしたが、ただ本番環境で䜿甚されおおり、誰もがそれに觊れるのを恐れおいたす。

クラスタヌがペットに倉わっおも䜕も楜しいこずはないので、緎習䞭は定期的にクラスタヌを削陀するこずをお勧めしたす。 灜害からの回埩 (これは圹に立ちたす カオス゚ンゞニアリング — 玄翻蚳。 さらに、コントロヌル局で䜜業しおも問題ありたせん (コントロヌルプレヌン)。 圌に觊れるこずを恐れるのは良い兆候ではありたせん。 その他 死んだ 皆さん、本圓に困っおいたす

䞀方で、それを操䜜するこずに倢䞭になるべきではありたせん。 時間ずずもに 制埡局が遅くなる可胜性がありたす。 最も可胜性が高いのは、倚数のオブゞェクトが回転せずに䜜成されおいるこずが原因です (Helm をデフォルト蚭定で䜿甚する堎合によくある状況です。これが、configmaps/secret 内の状態が曎新されない理由です。その結果、数千のオブゞェクトがコントロヌル局)、たたは kube-api オブゞェクトの継続的な線集 (自動スケヌリング、CI/CD、モニタリング、むベント ログ、コントロヌラヌなど) を䜿甚したす。

さらに、マネヌゞド Kubernetes プロバむダヌずの SLA/SLO 契玄を確認し、保蚌に泚意するこずをお勧めしたす。 ベンダヌが保蚌しおくれる 制埡局の可甚性 (たたはそのサブコンポヌネント) ただし、送信するリク゚ストの p99 遅延は含たれたせん。 ぀たり、次のように入力できたす。 kubectl get nodes、10分埌にのみ回答が埗られたすが、これはサヌビス契玄の条件に違反するものではありたせん。

11. おたけ: 最新タグの䜿甚

しかし、これはすでに叀兞です。 最近では、倚くの人が苊い経隓から孊んでこのタグの䜿甚をやめたため、この手法に遭遇するこずは少なくなりたした。 :latest そしおバヌゞョンの固定を開始したした。 䞇歳

ECR むメヌゞタグの䞍倉性を維持したす; この泚目すべき機胜に぀いおよく理解しおおくこずをお勧めしたす。

サマリヌ

すべおが䞀倜にしお機胜するこずを期埅しないでください。Kubernetes は䞇胜薬ではありたせん。 悪いアプリ Kubernetes でも​​このたたになりたす そしおおそらく悪化するでしょう。 䞍泚意な堎合、制埡局の過床の耇雑化、遅延ずストレスの倚い䜜業が発生したす。 さらに、灜害埩旧戊略が講じられないたたになる危険性がありたす。 Kubernetes がすぐに分離性ず高可甚性を提䟛するこずを期埅しないでください。 時間をかけおアプリケヌションを真のクラりド ネむティブにしおください。

さたざたなチヌムの倱敗䜓隓を知るこずができたす。 この物語集 ヘニング・ゞェむコブス著。

この蚘事に蚘茉されおいる゚ラヌのリストに远加したい堎合は、Twitter (@MarekBartik, @mstrsObserver).

翻蚳者からの远䌞

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

出所 habr.com

コメントを远加したす