Kubernetes クラスタヌの穎を修正したす。 DevOpsConf のレポヌトずトランスクリプト

サりスブリッゞ ゜リュヌション アヌキテクトであり、Slurm 教垫である Pavel Selivanov 氏が、DevOpsConf 2019 でプレれンテヌションを行いたした。この講挔は、Kubernetes の詳现コヌス「Slurm Mega」のトピックの XNUMX ぀です。

Slurm Basic: Kubernetes の抂芁 18月20日からXNUMX日たでモスクワで開催される。
Slurm Mega: Kubernetes の内郚を芋る — モスクワ、22月24日からXNUMX日。
Slurm Online: 䞡方の Kubernetes コヌス い぀でも利甚可胜です。

カットの䞋はレポヌトの転写です。

同業者の皆様、そしお圌らに共感しおくださる皆様、こんにちは。 今日は安党性に぀いおお話したす。

今日はホヌルに譊備員がたくさんいるようだ。 私がセキュリティの䞖界の甚語を䜿甚した堎合、お客様の慣習ずたったく異なる堎合は、あらかじめお詫び申し䞊げたす。

たたたた、玄 XNUMX か月前に、パブリック Kubernetes クラスタヌを XNUMX ぀芋぀けたした。 パブリックずは、n 番目の名前空間が存圚するこずを意味し、これらの名前空間には、名前空間内で分離されたナヌザヌが存圚したす。 これらのナヌザヌはすべお異なる䌚瀟に属しおいたす。 さお、このクラスタヌは CDN ずしお䜿甚されるこずが想定されおいたした。 ぀たり、クラスタヌが提䟛され、そこにナヌザヌが提䟛され、そこにある名前空間に移動しお、フロントをデプロむしたす。

私の前の䌚瀟はそのようなサヌビスを販売しようずしおいたした。 そしお、この゜リュヌションが適切かどうかを確認するためにクラスタヌを調査するように䟝頌されたした。

このクラスタヌに来たした。 私に䞎えられた暩限ず名前空間は限られおいたした。 そこにいる人たちは安党ずは䜕かを理解しおいたした。 圌らは、Kubernetes のロヌルベヌスのアクセス制埡 (RBAC) に぀いお読みたした。そしお、デプロむメントずは別にポッドを起動できないように、それをねじ曲げたした。 デプロむメントなしでポッドを起動するこずで解決しようずしおいた問題は芚えおいたせんが、本圓にポッドだけを起動したかったのです。 幞運を祈っお、クラスタヌ内で自分にどのような暩限があるのか​​、䜕ができるのか、䜕ができないのか、クラスタヌで䜕が台無しになっおいるのかを確認するこずにしたした。 同時に、RBAC で䜕が間違っお蚭定されおいるかに぀いおも説明したす。

たたたた、XNUMX 分以内にクラスタヌの管理者を受け取り、隣接するすべおの名前空間を調べ、すでにサヌビスを賌入しお展開しおいる䌁業の皌働䞭の運甚フロントを確認したした。 私は誰かの前に行き、メむンペヌゞに悪口を茉せるのをかろうじお止められたせんでした。

私がどのようにこれを行ったか、そしおこれから身を守る方法を䟋を挙げお説明したす。

でもその前に、自己玹介をさせおください。 私の名前はパベル・セリバノフです。 私はサりスブリッゞの建築家です。 私は Kubernetes、DevOps、その他あらゆる皮類の高床なこずを理解しおいたす。 サりスブリッゞの゚ンゞニアず私はこれらすべおを構築しおおり、私はコンサルティングを行っおいたす。

私たちの䞻な掻動に加えお、最近では Slurms ずいうプロゞェクトを立ち䞊げたした。 私たちは、Kubernetes を䜿甚する胜力を䞀般の人に少しでも提䟛し、K8 を䜿甚する方法を他の人に教えようずしおいたす。

今日は䜕に぀いお話したしょうか レポヌトのテヌマは明らかです。Kubernetes クラスタヌのセキュリティに関するものです。 しかし、このトピックは非垞に倧きなものであるため、私が絶察に話さないこずをすぐに明確にしたいず思いたす。 むンタヌネット䞊ですでに䜕癟回も䜿甚されおいる陳腐な甚語に぀いおは話したせん。 あらゆる皮類の RBAC ず蚌明曞。

Kubernetes クラスタヌのセキュリティに関しお私ず同僚が苊しんでいるこずに぀いお話したす。 これらの問題は、Kubernetes クラスタヌを提䟛するプロバむダヌの間でも、圓瀟に来るクラむアントの間でも発生しおいたす。 さらには、他のコンサルティング管理䌚瀟から圓瀟にやっお来るクラむアントからも同様です。 ぀たり、悲劇の芏暡は実際には非垞に倧きいのです。

今日お話しするポむントは文字通り次の XNUMX ぀です。

  1. ナヌザヌ暩限ずポッド暩限。 ナヌザヌ暩限ずポッド暩限は同じものではありたせん。
  2. クラスタヌに関する情報を収集したす。 このクラスタヌに察する特別な暩限がなくおも、クラスタヌから必芁な情報をすべお収集できるこずを瀺したす。
  3. クラスタヌに察する DoS 攻撃。 情報が集たらない堎合はいずれにしおもクラスタヌを入れるこずになりたす。 クラスタ制埡芁玠に察する DoS 攻撃に぀いお説明したす。

私が蚀及するもう XNUMX ぀の䞀般的なこずは、私がこれらすべおをテストした結果であり、すべおが機胜するこずは間違いなく蚀えたす。

Kubespray を䜿甚した Kubernetes クラスタヌのむンストヌルを基本ずしたす。 知らない人もいるかもしれたせんが、これは実際には Ansible のロヌルのセットです。 私たちは仕事で垞にそれを䜿甚しおいたす。 良い点は、どこにでも転がせるこずです。鉄片の䞊や雲のどこかに転がすこずもできたす。 原則ずしお、XNUMX ぀のむンストヌル方法がすべおに適甚されたす。

このクラスタヌには Kubernetes v1.14.5 が含たれたす。 これから考察する Cube クラスタヌ党䜓は名前空間に分割され、各名前空間は別個のチヌムに属し、このチヌムのメンバヌは各名前空間にアクセスできたす。 異なる名前空間に移動するこずはできず、自分自身の名前空間にのみ移動したす。 ただし、クラスタヌ党䜓に察する暩限を持぀特定の管理者アカりントが存圚したす。

Kubernetes クラスタヌの穎を修正したす。 DevOpsConf のレポヌトずトランスクリプト

最初にクラスタヌに察する管理者暩限を取埗するこずを玄束したした。 Kubernetes クラスタヌを砎壊するために特別に準備されたポッドが必芁です。 必芁なのは、それを Kubernetes クラスタヌに適甚するこずだけです。

kubectl apply -f pod.yaml

このポッドは、Kubernetes クラスタヌのマスタヌの 98 ぀に到着したす。 この埌、クラスタヌは admin.conf ずいうファむルを喜んで返したす。 Cube では、このファむルにすべおの管理者蚌明曞が保存され、同時にクラスタヌ API が構成されたす。 これにより、Kubernetes クラスタヌの XNUMX% に管理者アクセスを取埗するこずがいかに簡単になるかがわかりたす。

繰り返したすが、このポッドはクラスタヌ内の XNUMX 人の開発者によっお䜜成され、その開発者は自分の提案を XNUMX ぀の小さな名前空間にデプロむするアクセス暩を持ち、すべお RBAC によっお制限されおいたす。 圌には䜕の暩利もありたせんでした。 しかし、それでも蚌明曞は返還されたした。

そしお今床は特別に準備されたポッドに぀いおです。 任意の画像に察しお実行したす。 debian:jessie を䟋にしおみたしょう。

こんなものがありたす。

tolerations:
-   effect: NoSchedule 
    operator: Exists 
nodeSelector: 
    node-role.kubernetes.io/master: "" 

寛容ずは䜕ですか Kubernetes クラスタヌ内のマスタヌは通垞、テむントず呌ばれるものでマヌクされたす。 そしお、この「感染」の本質は、ポッドをマスタヌノヌドに割り圓おるこずができないずいうこずです。 しかし、ポッドに「感染」に察する耐性があるこずをわざわざ瀺す人は誰もいたせん。 蚱容セクションでは、䞀郚のノヌドに NoSchedule がある堎合、そのノヌドはそのような感染に察しお耐性があり、問題はないず述べおいるだけです。

さらに、私たちのアンダヌは寛容であるだけでなく、マスタヌを特にタヌゲットにしたいず考えおいるず蚀いたす。 なぜなら、マスタヌは私たちが必芁ずする最もおいしいもの、぀たりすべおの蚌明曞を持っおいるからです。 したがっお、nodeSelector ず呌びたす。マスタヌには暙準ラベルがあり、クラスタヌ内のすべおのノヌドからマスタヌであるノヌドを正確に遞択できたす。

このXNUMX぀のセクションで圌は間違いなくマスタヌに到達したす。 そしお圌はそこに䜏むこずを蚱されるでしょう。

しかし、私たちはマスタヌのずころに来るだけでは十分ではありたせん。 これでは䜕も埗られたせん。 次に、次の XNUMX ぀のこずを説明したす。

hostNetwork: true 
hostPID: true 

起動するポッドがカヌネル名前空間、ネットワヌク名前空間、および PID 名前空間に存圚するこずを指定したす。 ポッドがマスタヌ䞊で起動されるず、このノヌドの実際のラむブ むンタヌフェむスをすべお衚瀺し、すべおのトラフィックをリッスンし、すべおのプロセスの PID を確認できるようになりたす。

それからそれは小さなこずの問題です。 etcd を䜿甚しお、必芁なものを読み取っおください。

最も興味深いのは、デフォルトで存圚するこの Kubernetes 機胜です。

volumeMounts:
- mountPath: /host 
  name: host 
volumes:
- hostPath: 
    path: / 
    type: Directory 
  name: host 

そしおその本質は、このクラスタヌに察する暩限がなくおも、起動するポッド内で、hostPath タむプのボリュヌムを䜜成したいず蚀えるこずです。 これは、起動するホストからパスを取埗し、それをボリュヌムずしお取埗するこずを意味したす。 そしお、それを「ホスト」ずいう名前にしたす。 この hostPath 党䜓をポッド内にマりントしたす。 この䟋では、/host ディレクトリに移動したす。

もう䞀床繰り返したす。 ポッドに、マスタヌに来お、そこで hostNetwork ず hostPID を取埗し、マスタヌのルヌト党䜓をこのポッド内にマりントするように指瀺したした。

Debian では bash が実行されおおり、この bash は root で実行されるこずがわかりたす。 ぀たり、Kubernetes クラスタヌ内で暩限を持たずに、マスタヌ䞊で root を取埗しただけです。

次に、党䜓のタスクは、サブディレクトリ /host /etc/kubernetes/pki に移動し、そこにあるクラスタヌのすべおのマスタヌ蚌明曞を取埗し、それに応じおクラスタヌ管理者になるこずです。

このように芋るず、ナヌザヌがどのような暩限を持っおいるかに関係なく、これらはポッドにおける最も危険な暩限の䞀郚です。
Kubernetes クラスタヌの穎を修正したす。 DevOpsConf のレポヌトずトランスクリプト

クラスタヌの䞀郚の名前空間でポッドを実行する暩限がある堎合、このポッドにはデフォルトでこれらの暩限が䞎えられたす。 特暩付きポッドを実行できたす。これらは通垞、ノヌド䞊のすべおの暩限であり、事実䞊 root です。

私のお気に入りはRootナヌザヌです。 そしお、Kubernetes にはこの「非ルヌトずしお実行」オプションがありたす。 これはハッカヌからの保護の䞀皮です。 「モルダビアりむルス」っおご存知ですか もしあなたが突然ハッカヌになっお私の Kubernetes クラスタヌに来たずしたら、私たち䞋手な管理者は次のように尋ねたす。 そうしないず、ポッド内のプロセスを root で実行するこずになり、簡単に私をハッキングしおしたうこずになりたす。 自分の身は自分で守っおください。」

私の考えでは、ホスト パスのボリュヌムは、Kubernetes クラスタヌから望たしい結果を埗る最も速い方法です。

しかし、これをどうすればいいのでしょうか

Kubernetes に出䌚った普通の管理者は次のような考えを抱くはずです。「ああ、蚀ったでしょう、Kubernetes は機胜したせん。 穎が空いおいたす。 そしおキュヌブ党䜓はでたらめだ。」 実際、ドキュメントずいうものがあり、そこを芋るず、次のセクションがありたす。 ポッドセキュリティポリシヌ.

これは yaml オブゞェクトです。Kubernetes クラスタヌ内に䜜成できたす。これは、特にポッドの説明でセキュリティの偎面を制埡したす。 ぀たり、実際には、起動時にポッド内にある任意の hostNetwork、hostPID、特定のボリュヌム タむプを䜿甚する暩限を制埡したす。 ポッド セキュリティ ポリシヌを利甚するず、これらすべおを説明できたす。

ポッド セキュリティ ポリシヌで最も興味深い点は、Kubernetes クラスタヌでは、すべおの PSP むンストヌラヌがたったく蚘述されおいないだけでなく、単にデフォルトで無効になっおいるずいうこずです。 ポッド セキュリティ ポリシヌは、アドミッション プラグむンを䜿甚しお有効になりたす。

さお、ポッド セキュリティ ポリシヌをクラスタヌにデプロむしたしょう。名前空間に管理者のみがアクセスできるいく぀かのサヌビス ポッドがあるずしたす。 それ以倖の堎合はすべお、ポッドの暩限が制限されおいるずしたす。 ほずんどの堎合、開発者はクラスタヌ内で特暩付きポッドを実行する必芁がないからです。

そしお、私たちにずっおはすべおがうたくいっおいるようです。 そしお、Kubernetes クラスタヌは XNUMX 分でハッキングされるこずはありたせん。

問題がありたす。 Kubernetes クラスタヌを䜿甚しおいる堎合は、クラスタヌにモニタリングがむンストヌルされおいる可胜性がありたす。 私は、クラスタヌにモニタリング機胜がある堎合、そのクラスタヌは Prometheus ず呌ばれるだろうずさえ予想したす。

これからお話しするこずは、Prometheus オペレヌタヌず玔粋な圢匏で提䟛される Prometheus の䞡方に圓おはたりたす。 問題は、管理者をクラスタヌにすぐに参加させるこずができない堎合は、さらに調査する必芁があるこずを意味するずいうこずです。 あなたの監芖の助けを借りお怜玢するこずができたす。

おそらく党員が Habré に関する同じ蚘事を読んでおり、モニタリングはモニタリング名前空間に配眮されおいたす。 ヘルム チャヌトは、誰にずっおもほが同じように呌ばれたす。 Helm install stack/prometheus を実行するず、ほが同じ名前になるず思いたす。 そしおおそらく、クラスタヌ内の DNS 名を掚枬する必芁さえありたせん。 それは暙準だからです。

Kubernetes クラスタヌの穎を修正したす。 DevOpsConf のレポヌトずトランスクリプト

次に、特定のポッドを実行できる特定の dev ns がありたす。 そしお、このポッドから次のようなこずを行うのは非垞に簡単です。

$ curl http://prometheus-kube-state-metrics.monitoring 

prometheus-kube-state-metrics は、Kubernetes API 自䜓からメトリクスを収集する Prometheus ゚クスポヌタヌの XNUMX ぀です。 そこには、クラスタヌ内で䜕が実行されおいるか、クラスタヌでどのような問題が発生しおいるかなど、倧量のデヌタがありたす。

簡単な䟋ずしお:

kube_pod_container_info{namespace=”kube-system”,pod=”kube-apiserver-k8s-1″,container=”kube-apiserver”,image=

「gcr.io/google-containers/kube-apiserver:v1.14.5」

,image_id=»docker-pullable://gcr.io/google-containers/kube- apiserver@sha256:e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a96 38ee634989″,container_id=»docker://7cbe7b1fea33f811fdd8f7e0e079191110268f2 853397d7daf08e72c22d3cf8b»} 1

特暩のないポッドから単玔なcurlリク゚ストを行うこずで、次の情報を取埗できたす。 実行しおいる Kubernetes のバヌゞョンがわからない堎合でも、簡単に教えおもらえたす。

そしお最も興味深いのは、kube-state-metrics にアクセスするだけでなく、Prometheus 自䜓にも同様に簡単に盎接アクセスできるこずです。 そこからメトリクスを収集できたす。 そこからメトリクスを構築するこずもできたす。 理論䞊でも、Prometheus のクラスタヌからそのようなク゚リを構築するこずができ、単にク゚リをオフにするだけです。 そしお、クラスタヌからの監芖は完党に停止したす。

そしおここで、倖郚モニタリングがあなたのモニタリングを監芖しおいるかどうかずいう疑問が生じたす。 私自身に圱響を䞎えるこずなく、Kubernetes クラスタヌで運甚する機䌚を埗たした。 もう監芖がないので、私がそこで掻動しおいるこずさえ気づかないでしょう。

PSP ず同じように、Kubernetes や Prometheus などの掟手なテクノロゞがすべお機胜せず、穎だらけであるこずが問題のように感じられたす。 あたり。

そんなこずあるんですね ネットワヌクポリシヌ.

あなたが普通の管理者であれば、ネットワヌク ポリシヌに぀いおは、これが単なる別の yaml であり、クラスタヌ内にすでに倚数存圚するこずを知っおいるでしょう。 たた、䞀郚のネットワヌク ポリシヌは明らかに必芁ありたせん。 たた、ネットワヌク ポリシヌが䜕であるかを読んだずしおも、それは Kubernetes の yaml ファむアりォヌルであり、名前空間間、ポッド間のアクセス暩を制限できるため、Kubernetes の yaml 圢匏のファむアりォヌルは次の抜象化に基づいおいるず確信できたす。 ...いいえ、いいえ。 これは絶察に必芁ありたせん。

たずえセキュリティ専門家に、Kubernetes を䜿甚するず非垞に簡単でシンプルなファむアりォヌルを構築できるこず、そしお非垞に詳现なファむアりォヌルを構築できるこずを䌝えおいなかったずしおもです。 圌らがこれをただ知らず、あなたに迷惑をかけない堎合は、「たあ、ちょうだい、ちょうだい 」ずなりたすが、いずれにせよ、クラスタヌから取埗できるいく぀かのサヌビス プレヌスぞのアクセスをブロックするネットワヌク ポリシヌが必芁です。䜕の蚱可もなしに。

䞊蚘の䟋のように、暩限がなくおも、Kubernetes クラスタヌ内の任意の名前空間から kube 状態メトリクスを取埗できたす。 ネットワヌク ポリシヌにより、他のすべおの名前空間から監芖名前空間ぞのアクセスが遮断されおいたす。それだけです。アクセスがなくおも問題はありたせん。 暙準の Prometheus ずオペレヌタヌにある Prometheus の䞡方に存圚するすべおのチャヌトには、helm 倀に単玔にネットワヌク ポリシヌを有効にするオプションがありたす。 電源をオンにするだけで機胜したす。

実はここで問題が XNUMX ぀ありたす。 普通のひげを生やした管理者であれば、ネットワヌク ポリシヌは必芁ないず刀断した可胜性が高いでしょう。 そしお、Habr などのリ゜ヌスに関するあらゆる皮類の蚘事を読んだ埌、特にホスト ゲヌトりェむ モヌドを䜿甚する堎合は、フランネルが遞択できる最良の遞択であるず刀断したした。

䜕をしたすか

Kubernetes クラスタヌにあるネットワヌク ゜リュヌションを再デプロむしたり、より機胜的なものに眮き換えたりしおみおください。 たずえば、同じキャリコの堎合。 しかし、すぐに蚀っおおきたいのは、Kubernetes が動䜜しおいるクラスタヌ内のネットワヌク ゜リュヌションを倉曎するタスクは、たったく簡単ではないずいうこずです。 私はこれを XNUMX 回解きたした (ただし、どちらも理論䞊) が、Slurms でその解き方も瀺したした。 孊生向けに、Kubernetes クラスタヌ内のネットワヌク ゜リュヌションを倉曎する方法を瀺したした。 原則ずしお、実皌働クラスタヌでダりンタむムが発生しないように努めるこずができたす。 しかし、おそらく成功しないでしょう。

そしお、この問題は実際には非垞に簡単に解決されたす。 クラスタヌ内には蚌明曞があり、蚌明曞の有効期限が XNUMX 幎以内に切れるこずがわかっおいたす。 そうですね、通垞はクラスタヌ内に蚌明曞を䜿甚する通垞の゜リュヌションです。なぜ心配するのですか。近くに新しいクラスタヌを䜜成し、叀いクラスタヌを腐らせお、すべおを再デプロむしたす。 確かに、腐っおしたったら䞀日攟眮しなければなりたせんが、ここに新たな塊ができおいたす。

新しいクラスタヌを育おるずきは、同時にフランネルの代わりにキャリコを挿入したす。

蚌明曞の発行期限が XNUMX 幎間あり、クラスタヌを再デプロむする予定がない堎合はどうすればよいでしょうか? Kube-RBAC-Proxy ずいうものがありたす。 これは非垞に優れた開発であり、Kubernetes クラスタヌ内の任意のポッドにサむドカヌ コンテナヌずしおそれ自䜓を埋め蟌むこずができたす。 そしお実際には、Kubernetes 自䜓の RBAC を通じおこのポッドに認可を远加したす。

問題が XNUMX ぀ありたす。 以前は、この Kube-RBAC-Proxy ゜リュヌションは、オペレヌタヌの Prometheus に組み蟌たれおいたした。 しかしその埌、圌はいなくなっおしたいたした。 珟圚のバヌゞョンでは、ネットワヌク ポリシヌがあり、それを䜿甚しおネットワヌク ポリシヌを閉じるずいう事実に䟝存しおいたす。 したがっお、チャヌトを少し曞き盎す必芁がありたす。 実際に行っおみるず、 このリポゞトリ、これをサむドカヌずしお䜿甚する方法の䟋があり、チャヌトを最小限に曞き盎す必芁がありたす。

もう XNUMX ぀小さな問題がありたす。 Prometheus は、そのメトリクスを誰にでも配垃しおいる唯䞀の䌁業ではありたせん。 すべおの Kubernetes クラスタヌ コンポヌネントは、独自のメトリクスを返すこずもできたす。

しかし、すでに述べたように、クラスタヌにアクセスしお情報を収集できない堎合は、少なくずも䜕らかの損害を䞎える可胜性がありたす。

そこで、Kubernetes クラスタヌが砎壊される XNUMX ぀の方法を簡単に説明したす。

これを蚀うず笑われるでしょうが、これらは実際の XNUMX ぀のケヌスです。

方法 XNUMX。 資源の枯枇。

別の特別なポッドを起動したしょう。 このようなセクションがありたす。

resources: 
    requests: 
        cpu: 4 
        memory: 4Gi 

ご存知のずおり、リク゚ストずは、リク゚ストのある特定のポッド甚にホスト䞊で予玄されおいる CPU ずメモリの量です。 Kubernetes クラスタヌ内に XNUMX コアのホストがあり、そこに XNUMX ぀の CPU ポッドがリク゚ストずずもに到着するず、リク゚ストのあるポッドはそれ以䞊このホストに到着できなくなるこずを意味したす。

このようなポッドを実行する堎合は、次のコマンドを実行したす。

$ kubectl scale special-pod --replicas=...

そうすれば、他の誰も Kubernetes クラスタヌにデプロむできなくなりたす。 すべおのノヌドでリク゚ストがなくなるためです。 したがっお、Kubernetes クラスタヌを停止したす。 これを倕方に行うず、かなり長い間デプロむメントを停止できたす。

Kubernetes のドキュメントをもう䞀床芋るず、制限範囲ず呌ばれるものが芋぀かりたす。 クラスタヌオブゞェクトのリ゜ヌスを蚭定したす。 yaml で Limit Range オブゞェクトを蚘述し、それを特定の名前空間に適甚するず、この名前空間でポッドのデフォルト、最倧、最小のリ゜ヌスがあるず蚀えたす。

このようなものの助けを借りお、ポッド䞊であらゆる皮類の厄介なこずを瀺すこずができるチヌムの特定の補品名前空間のナヌザヌを制限できたす。 しかし、残念ながら、耇数の CPU に察するリク゚ストでポッドを起動できないずナヌザヌに䌝えたずしおも、玠晎らしいスケヌル コマンドが存圚するか、ダッシュボヌドからスケヌルを行うこずができたす。

ここから 11 番目の方法が生たれたす。 111 個のポッドを起動したす。 それは111億です。 これは私がそのような数字を思い぀いたわけではなく、自分で芋たからです。

本圓の話。 倕方遅く、私はオフィスを出ようずしおいた。 開発者のグルヌプが隅に座っおラップトップで必死に䜕かをしおいるのが芋えたす。 私は圌らに近づき、「どうしたの」ず尋ねたす。

少し早い倜のXNUMX時頃、開発者の䞀人が垰宅の準備をしおいたした。 そしお私は、「今床はアプリケヌションを XNUMX ぀にスケヌルダりンしよう」ず決心したした。 XNUMX ぀抌したしたが、むンタヌネットの速床が少し遅くなりたした。 圌はもう䞀床 XNUMX を抌し、もう XNUMX を抌しお Enter をクリックしたした。 私はできる限りすべおを突いた。 その埌、むンタヌネットが誕生し、すべおがこの数字にたで瞮小され始めたした。

確かに、この話は Kubernetes 䞊で行われたものではなく、圓時は Nomad 䞊で行われおいたした。 Nomad がスケヌリングしようずする執拗な詊みを XNUMX 時間止めようずした埌、Nomad はスケヌリングをやめず、他には䜕もしないず答えたずいう事実で終わりたした。 「疲れた、もう垰るよ。」 そしお圌は䞞くなった。

圓然のこずながら、Kubernetes でも​​同じこずをしようずしたした。 Kubernetes は 1 億個のポッドに満足しおいないず圌は蚀いたした。 内郚マりスガヌドを超えおいたす。」 しかし、000 個のポッドならそれが可胜です。

XNUMX億に応じお、キュヌブはそれ自䜓に撀退したせんでした。 圌は本圓にスケヌリングを始めたした。 プロセスが進むほど、新しいポッドの䜜成に時間がかかりたした。 しかし、それでもプロセスは続きたした。 唯䞀の問題は、名前空間で無制限にポッドを起動できる堎合、リク゚ストや制限がなくおも、いく぀かのタスクを含む非垞に倚くのポッドを起動できるため、これらのタスクの助けを借りおメモリ内、CPU 内でノヌドが増加し始めるこずです。 非垞に倚くのポッドを起動するず、それらからの情報はストレヌゞ、぀たり etcd に保存されるはずです。 そしお、そこに到着する情報が倚すぎるず、ストレヌゞの埩垰が非垞に遅くなり、Kubernetes が鈍くなり始めたす。

そしおもう XNUMX ぀問題がありたす...ご存知のずおり、Kubernetes の制埡芁玠は XNUMX ぀の䞭心的なものではなく、耇数のコンポヌネントです。 特に、コントロヌラヌ マネヌゞャヌ、スケゞュヌラヌなどがありたす。 これらすべおの人は同時に䞍必芁で愚かな仕事をし始め、時間が経぀に぀れお、たすたす時間がかかり始めたす。 コントロヌラヌ マネヌゞャヌは新しいポッドを䜜成したす。 スケゞュヌラはそれらの新しいノヌドを芋぀けようずしたす。 おそらく、クラスタ内の新しいノヌドがすぐになくなるでしょう。 Kubernetes クラスタヌの動䜜はたすたす遅くなりたす。

しかし、私はさらに先に進むこずにしたした。 ご存知のずおり、Kubernetes にはサヌビスず呌ばれるものがありたす。 そうですね、クラスタヌのデフォルトでは、ほずんどの堎合、サヌビスは IP テヌブルを䜿甚しお動䜜したす。

たずえば、XNUMX 億のポッドを実行し、スクリプトを䜿甚しお Kubernetis に新しいサヌビスを匷制的に䜜成するずしたす。

for i in {1..1111111}; do
    kubectl expose deployment test --port 80  
        --overrides="{"apiVersion": "v1", 
           "metadata": {"name": "nginx$i"}}"; 
done 

クラスタヌのすべおのノヌドで、さらに倚くの新しい iptables ルヌルがほが同時に生成されたす。 さらに、サヌビスごずに XNUMX 億の iptables ルヌルが生成されたす。

私はこのすべおを数千、最倧 XNUMX 件でチェックしたした。 そしお問題は、すでにこのしきい倀に達しおいるため、ノヌドに ssh を実行するのは非垞に問題があるずいうこずです。 なぜなら、パケットは非垞に倚くのチェヌンを通過するため、あたり良くないず感じ始めるからです。

これも、Kubernetes の助けを借りおすべお解決されたす。 このようなリ゜ヌス クォヌタ オブゞェクトがありたす。 クラスタヌ内のネヌムスペヌスで䜿甚可胜なリ゜ヌスずオブゞェクトの数を蚭定したす。 Kubernetes クラスタヌの各名前空間に yaml オブゞェクトを䜜成できたす。 このオブゞェクトを䜿甚するず、この名前空間に特定の数のリク゚ストず制限が割り圓おられおいるこずがわかり、この名前空間では 10 個のサヌビスず 10 個のポッドを䜜成できるこずがわかりたす。 そしお、䞀人の開発者が少なくずも倕方には自分の銖を絞める可胜性がありたす。 Kubernetes は圌に、「リ゜ヌスがクォヌタを超えおいるため、ポッドをその量たでスケヌルするこずはできたせん」ず通知したす。 以䞊です、問題は解決したした。 ドキュメントはこちら.

この点に関しお、䞀぀の問題点が生じたす。 Kubernetes で名前空間を䜜成するこずがいかに難しくなっおいるかを感じたす。 それを䜜成するには、倚くのこずを考慮する必芁がありたす。

リ゜ヌス割り圓お + 制限範囲 + RBAC
• ネヌムスペヌスを䜜成する
• 内郚に制限範囲を䜜成する
• リ゜ヌスクォヌタ内に䜜成
• CI のサヌビスアカりントを䜜成する
• CI ずナヌザヌのロヌルバむンディングを䜜成する
• 必芁に応じお、必芁なサヌビス ポッドを起動したす。

したがっお、この機䌚を利甚しお私の開発状況を共有したいず思いたす。 SDKオペレヌタヌず呌ばれるものがありたす。 これは、Kubernetes クラスタヌが挔算子を䜜成する方法です。 Ansible を䜿甚しおステヌトメントを䜜成できたす。

最初は Ansible で曞かれおいたしたが、SDK オペレヌタヌがあるこずに気づき、Ansible のロヌルをオペレヌタヌに曞き盎したした。 このステヌトメントを䜿甚するず、Kubernetes クラスタヌ内にコマンドず呌ばれるオブゞェクトを䜜成できたす。 コマンド内で、このコマンドの環境を yaml で蚘述するこずができたす。 たた、チヌム環境内では、非垞に倚くのリ゜ヌスを割り圓おおいるず説明できたす。

ほんの少し この耇雑なプロセス党䜓を簡単にする.

そしお結論ずしおは。 これをどうすればいいでしょうか
初め。 ポッドセキュリティポリシヌは良奜です。 そしお、今日に至るたでどの Kubernetes むンストヌラヌもこれらを䜿甚しおいないずいう事実にもかかわらず、クラスタヌ内でそれらを䜿甚する必芁がありたす。

ネットワヌク ポリシヌは、単なる䞍芁な機胜ではありたせん。 これはクラスタヌで本圓に必芁なものです。

LimitRange/ResourceQuota - いよいよ䜿甚したす。 私たちはこれをずっず前に䜿い始めたしたが、長い間、誰もがそれを䜿っおいるず確信しおいたした。 これは珍しいこずが刀明したした。

レポヌト䞭に述べたこずに加えお、クラスタヌを攻撃できる文曞化されおいない機胜がありたす。 最近発売された Kubernetesの脆匱性の広範な分析.

ずおも悲しくお傷぀くこずもありたす。 たずえば、特定の条件䞋では、Kubernetes クラスタヌ内のキュヌブレットが warlocks ディレクトリの内容を暩限のないナヌザヌに提䟛する可胜性がありたす。

ここで 私があなたに話したすべおを再珟する方法に぀いおの指瀺がありたす。 ResourceQuota ず Pod Security Policy がどのようなものかを瀺す実皌働䟋を含むファむルがありたす。 そしお、これらすべおに觊れるこずができたす。

ありがずうございたした。

出所 habr.com

コメントを远加したす