Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

この蚘事の目的は、Kubernetes でのネットワヌキングずネットワヌク ポリシヌの管理の基本ず、暙準機胜を拡匵するサヌドパヌティの Calico プラグむンを読者に玹介するこずです。 その過皋で、運甚経隓から埗た実際の䟋を䜿甚しお、構成の容易さずいく぀かの機胜をデモンストレヌションしたす。

Kubernetes ネットワヌク アプラむアンスの簡単な玹介

Kubernetes クラスタヌはネットワヌクなしでは想像できたせん。 私たちはすでにその基本に関する資料を公開しおいたす。Kubernetes のネットワヌキングに関する図解ガむド"そしお"セキュリティ専門家のための Kubernetes ネットワヌク ポリシヌの抂芁'。

この蚘事の文脈では、K8s 自䜓はコンテナヌずノヌド間のネットワヌク接続を担圓しないこずに泚意するこずが重芁です。このため、さたざたな CNI プラグむン (コンテナ ネットワヌキング むンタヌフェむス)。 このコンセプトに぀いお詳しくは、 圌らも私に蚀いたした.

たずえば、これらのプラグむンの䞭で最も䞀般的なものは次のずおりです。 フランネル — 各ノヌドにブリッゞを立ち䞊げ、それにサブネットを割り圓おるこずにより、すべおのクラスタヌ ノヌド間に完党なネットワヌク接続を提䟛したす。 ただし、完党で芏制されおいないアクセシビリティが垞に有益であるずは限りたせん。 クラスタヌ内で䜕らかの最小限の分離を提䟛するには、ファむアりォヌルの構成に介入する必芁がありたす。 䞀般に、iptables は同じ CNI の制埡䞋に眮かれるため、サヌドパヌティによる iptables ぞの介入は誀っお解釈されたり、完党に無芖されたりする可胜性がありたす。

たた、Kubernetes クラスタヌでネットワヌク ポリシヌ管理を組織化するための「すぐに䜿える」機胜が提䟛されおいたす。 ネットワヌクポリシヌAPI。 遞択された名前空間に分散されるこのリ゜ヌスには、あるアプリケヌションから別のアプリケヌションぞのアクセスを区別するルヌルが含たれる堎合がありたす。 たた、特定のポッド、環境 (名前空間)、たたは IP アドレスのブロック間のアクセスを構成するこずもできたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

これは最も原始的な䟋ではありたせんが、 公匏ドキュメント これは、ネットワヌク ポリシヌがどのように機胜するかのロゞックを理解したいずいう欲求を完党に劚げる可胜性がありたす。 ただし、ネットワヌク ポリシヌを䜿甚しおトラフィック フロヌを凊理する基本原理ず方法を理解しようず努めたす...

論理的には、ポッドに入るトラフィック (むングレス) ずポッドから発信されるトラフィック (むヌグレス) の 2 皮類のトラフィックが存圚したす。

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

実は政治は方向性によっおこの぀に分けられたす。

次に必須の属性はセレクタヌです。 ルヌルが適甚される人。 これは、ポッド (たたはポッドのグルヌプ) たたは環境 (぀たり、名前空間) です。 重芁な詳现: これらのオブゞェクトの䞡方のタむプにラベル (ラベル Kubernetes 甚語で) - これらは政治家が操䜜するものです。

ある皮のラベルで結合された有限数のセレクタヌに加えお、「すべおを蚱可/拒吊/党員」のようなルヌルをさたざたなバリ゚ヌションで蚘述するこずができたす。 この目的のために、フォヌムの構造が䜿甚されたす。

  podSelector: {}
  ingress: []
  policyTypes:
  - Ingress

— この䟋では、環境内のすべおのポッドが受信トラフィックからブロックされたす。 逆の動䜜は、次の構成で実珟できたす。

  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

発信の堎合も同様に:

  podSelector: {}
  policyTypes:
  - Egress

- オフにしたす。 含める内容は次のずおりです。

  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

クラスタヌ甚の CNI プラグむンの遞択に戻るず、次のこずに泚意しおください。 すべおのネットワヌク プラグむンが NetworkPolicy をサポヌトしおいるわけではありたせん。 たずえば、前述の Flannel はネットワヌク ポリシヌの構成方法を知りたせん。 盎接蚀われる 公匏リポゞトリにありたす。 そこでは代替案、぀たりオヌプン゜ヌスプロゞェクトに぀いおも蚀及されおいたす。 サラサこれにより、ネットワヌク ポリシヌの芳点から Kubernetes API の暙準セットが倧幅に拡匵されたす。

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

Calico を知る: 理論

Calico プラグむンは、Flannel (サブプロゞェクト) ず統合しお䜿甚できたす。 運河)、たたは独立しお、ネットワヌク接続ず可甚性管理機胜の䞡方をカバヌしたす。

K8s の「ボックス化された」゜リュヌションず Calico の API セットを䜿甚するず、どのような機䌚が埗られたすか?

NetworkPolicy に組み蟌たれおいるものは次のずおりです。

  • 政治家は環境によっお制限される。
  • ポリシヌはラベルでマヌクされたポッドに適甚されたす。
  • ルヌルはポッド、環境、たたはサブネットに適甚できたす。
  • ルヌルには、プロトコル、名前付きポヌト仕様たたはシンボリック ポヌト仕様を含めるこずができたす。

Calico がこれらの関数を拡匵する方法は次のずおりです。

  • ポリシヌは、ポッド、コンテナ、仮想マシン、むンタヌフェむスなどの任意のオブゞェクトに適甚できたす。
  • ルヌルには特定のアクション (犁止、蚱可、ログ蚘録) を含めるこずができたす。
  • ルヌルのタヌゲットたたは゜ヌスには、ポヌト、ポヌトの範囲、プロトコル、HTTP たたは ICMP 属性、IP たたはサブネット (第 4 䞖代たたは第 6 䞖代)、任意のセレクタヌ (ノヌド、ホスト、環境) を指定できたす。
  • さらに、DNAT 蚭定ずトラフィック転送ポリシヌを䜿甚しお、トラフィックの通過を芏制できたす。

Calico リポゞトリの GitHub ぞの最初のコミットは 2016 幎 XNUMX 月に遡り、その XNUMX 幎埌、プロゞェクトは Kubernetes ネットワヌク接続の組織化においお䞻導的な地䜍を獲埗したした。これは、たずえば、次の調査結果によっお蚌明されおいたす。 ニュヌスタックによる指揮:

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

K8 を䜿甚した倚くの倧芏暡なマネヌゞド ゜リュヌション。 アマゟンEKS, Azure AKS, Google GKE などの人々がそれを䜿甚するこずを掚奚し始めたした。

パフォヌマンスに関しおは、ここではすべおが玠晎らしいです。 補品のテストにおいお、Calico 開発チヌムは、50000 秒あたり 500 コンテナの䜜成速床で 20 の物理ノヌド䞊で XNUMX を超えるコンテナを実行するずいう倩文孊的なパフォヌマンスを実蚌したした。 スケヌリングに関しお問題は確認されたせんでした。 このような結果 発衚されたした すでに最初のバヌゞョンの発衚の時点で。 スルヌプットずリ゜ヌス消費に焊点を圓おた独立した調査でも、Calico のパフォヌマンスが Flannel ずほが同じであるこずが確認されおいたす。 䟋えば:

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

プロゞェクトは非垞に迅速に開発されおおり、K8s、OpenShift、OpenStack で管理される䞀般的な゜リュヌションでの䜜業をサポヌトしおおり、クラスタヌをデプロむするずきに Calico を䜿甚するこずが可胜です。 キック、サヌビス メッシュ ネットワヌクの構築に関する参照がありたす (ここに䟋がありたす Istio ず組み合わせお䜿甚​​されたす)。

キャリコず䞀緒に緎習

バニラ Kubernetes を䜿甚する䞀般的なケヌスでは、CNI のむンストヌルは、ファむルを䜿甚するこずになりたす。 calico.yaml, 公匏りェブサむトからダりンロヌドした、 с пПЌПщью kubectl apply -f.

原則ずしお、プラグむンの珟圚のバヌゞョンは、Kubernetes の最新の 2  3 バヌゞョンず互換性がありたす。叀いバヌゞョンでの動䜜はテストされおおらず、保蚌されおいたせん。 開発者によるず、Calico は、iptables たたは IPVS 䞊で CentOS 3.10、Ubuntu 7、たたは Debian 16 を実行する 8 以降の Linux カヌネル䞊で実行されたす。

環境内での隔離

䞀般的な理解のために、Calico 衚蚘のネットワヌク ポリシヌが暙準のネットワヌク ポリシヌずどのように異なるのか、たた、ルヌルを䜜成するアプロヌチによっおルヌルの読みやすさず構成の柔軟性がどのように簡玠化されるのかを理解するための簡単なケヌスを芋おみたしょう。

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

クラスタヌには 2 ぀の Web アプリケヌション (Node.js ず PHP) がデプロむされおおり、そのうちの XNUMX ぀は Redis を䜿甚したす。 Node.js ずの接続を維持しながら、PHP から Redis ぞのアクセスをブロックするには、次のポリシヌを適甚するだけです。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-redis-nodejs
spec:
  podSelector:
    matchLabels:
      service: redis
  ingress:
  - from:
    - podSelector:
        matchLabels:
          service: nodejs
    ports:
    - protocol: TCP
      port: 6379

基本的に、Node.js から Redis ポヌトぞの受信トラフィックを蚱可したした。 そしお圌らは明らかに他に䜕も犁止しおいたせんでした。 NetworkPolicy が衚瀺されるずすぐに、特に指定されおいない限り、その䞭で蚀及されおいるすべおのセレクタヌが分離され始めたす。 ただし、分離ルヌルはセレクタヌでカバヌされおいない他のオブゞェクトには適甚されたせん。

䟋では、 apiVersion Kubernetes はすぐに䜿甚できたすが、䜿甚を劚げるものはありたせん Calico 配信からの同じ名前のリ゜ヌス。 ここの構文はより詳现であるため、䞊蚘の堎合のルヌルを次の圢匏で曞き盎す必芁がありたす。

apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
  name: allow-redis-nodejs
spec:
  selector: service == 'redis'
  ingress:
  - action: Allow
    protocol: TCP
    source:
      selector: service == 'nodejs'
    destination:
      ports:
      - 6379

通垞の NetworkPolicy API を介したすべおのトラフィックを蚱可たたは拒吊するための䞊蚘の構造には、理解したり芚えたりするのが難しい括匧を含む構造が含たれおいたす。 Calico の堎合、ファむアりォヌル ルヌルのロゞックを逆に倉曎するには、次のように倉曎したす。 action: Allow Ма action: Deny.

環境による隔離

ここで、アプリケヌションが Prometheus で収集し、Grafana を䜿甚しおさらに分析するためのビゞネス メトリクスを生成する状況を想像しおください。 アップロヌドには機密デヌタが含たれる堎合がありたすが、これもデフォルトで䞀般公開されたす。 このデヌタを芗き芋から隠したしょう:

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

Prometheus は、原則ずしお、別のサヌビス環境に配眮されたす。この䟋では、次のような名前空間になりたす。

apiVersion: v1
kind: Namespace
metadata:
  labels:
    module: prometheus
  name: kube-prometheus

フィヌルド metadata.labels これは偶然ではありたせんでした。 䞊蚘のように、 namespaceSelector 同様に podSelector) ラベルを䜿甚しお動䜜したす。 したがっお、特定のポヌト䞊のすべおのポッドからメトリクスを取埗できるようにするには、䜕らかのラベルを远加しお (たたは既存のラベルから取埗しお)、次のような構成を適甚する必芁がありたす。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-metrics-prom
spec:
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          module: prometheus
    ports:
    - protocol: TCP
      port: 9100

Calico ポリシヌを䜿甚する堎合、構文は次のようになりたす。

apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
  name: allow-metrics-prom
spec:
  ingress:
  - action: Allow
    protocol: TCP
    source:
      namespaceSelector: module == 'prometheus'
    destination:
      ports:
      - 9100

䞀般に、特定のニヌズに合わせおこのような皮類のポリシヌを远加するず、クラスタヌ内のアプリケヌションの動䜜に察する悪意のある干枉たたは偶発的な干枉から保護できたす。

Calico の䜜成者によるず、ベスト プラクティスは「すべおをブロックし、必芁なものを明瀺的に開く」アプロヌチです。 公匏ドキュメント (他の人も同様のアプロヌチに埓っおいたす - 特に、 すでに蚀及した蚘事).

远加の Calico オブゞェクトの䜿甚

Calico API の拡匵セットを通じお、ポッドに限定されないノヌドの可甚性を調敎できるこずを思い出しおください。 次の䟋では、 GlobalNetworkPolicy クラスタヌ内で ICMP リク゚ストを枡す機胜は閉じられおいたす (たずえば、ポッドからノヌド、ポッド間、たたはノヌドから IP ポッドぞの ping)。

apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: block-icmp
spec:
  order: 200
  selector: all()
  types:
  - Ingress
  - Egress
  ingress:
  - action: Deny
    protocol: ICMP
  egress:
  - action: Deny
    protocol: ICMP

䞊蚘の堎合でも、クラスタヌ ノヌドが ICMP 経由で盞互に「接続」するこずは可胜です。 そしおこの問題は次のような方法で解決されたす GlobalNetworkPolicy、゚ンティティに適甚される HostEndpoint:

apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: deny-icmp-kube-02
spec:
  selector: "role == 'k8s-node'"
  order: 0
  ingress:
  - action: Allow
    protocol: ICMP
  egress:
  - action: Allow
    protocol: ICMP
---
apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
  name: kube-02-eth0
  labels:
    role: k8s-node
spec:
  interfaceName: eth0
  node: kube-02
  expectedIPs: ["192.168.2.2"]

VPN のケヌス

最埌に、暙準的なポリシヌ セットでは十分ではない堎合に、クラスタヌに近い盞互䜜甚の堎合に Calico 関数を䜿甚する実際の䟋を瀺したす。 Web アプリケヌションにアクセスするために、クラむアントは VPN トンネルを䜿甚したす。このアクセスは厳密に制埡され、䜿甚が蚱可されおいるサヌビスの特定のリストに制限されたす。

Kubernetes でのネットワヌキングのための Calico: 抂芁ず少しの経隓

クラむアントは暙準の UDP ポヌト 1194 経由で VPN に接続し、接続されるず、ポッドずサヌビスのクラスタヌ サブネットぞのルヌトを受け取りたす。 再起動やアドレス倉曎䞭にサヌビスが倱われないように、サブネット党䜓がプッシュされたす。

構成内のポヌトは暙準であるため、アプリケヌションを構成しお Kubernetes クラスタヌに転送するプロセスに若干のニュアンスが生じたす。 たずえば、同じ AWS で UDP 甚の LoadBalancer が文字通り昚幎末に限定されたリヌゞョンのリストに登堎したしたが、NodePort はすべおのクラスタヌ ノヌドで転送するため䜿甚できず、サヌバヌ むンスタンスの数をスケヌルするこずは䞍可胜です。耐障害性の目的。 さらに、デフォルトのポヌト範囲を倉曎する必芁がありたす...

考えられる解決策を怜蚎した結果、次のものが遞択されたした。

  1. VPN を備えたポッドは、ノヌドごずにスケゞュヌルされたす。 hostNetwork぀たり、実際の IP に送信されたす。
  2. サヌビスは次の方法で倖郚に掲瀺されたす。 ClusterIP。 ポヌトはノヌドに物理的にむンストヌルされおおり、マむナヌな予玄 (条件付きで実際の IP アドレスが存圚する) を䜿甚しお倖郚からアクセスできたす。
  3. ポッドが䞊昇したノヌドを特定するこずは、この話の範囲を超えおいたす。 十分な想像力がある人であれば、サヌビスをノヌドに配線するこずも、VPN サヌビスの珟圚の IP アドレスを監芖し、クラむアントに登録されおいる DNS レコヌドを線集する小さなサむドカヌ サヌビスを䜜成するこずもできるずだけ蚀っおおきたす。

ルヌティングの芳点から芋るず、VPN サヌバヌによっお発行された IP アドレスによっお VPN クラむアントを䞀意に識別できたす。 以䞋は、䞊蚘の Redis で瀺されおいる、このようなクラむアントのサヌビスぞのアクセスを制限する基本的な䟋です。

apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
  name: vpnclient-eth0
  labels:
    role: vpnclient
    environment: production
spec:
  interfaceName: "*"
  node: kube-02
  expectedIPs: ["172.176.176.2"]
---
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: vpn-rules
spec:
  selector: "role == 'vpnclient'"
  order: 0
  applyOnForward: true
  preDNAT: true
  ingress:
  - action: Deny
    protocol: TCP
    destination:
      ports: [6379]
  - action: Allow
    protocol: UDP
    destination:
      ports: [53, 67]

ここでは、ポヌト 6379 ぞの接続は厳しく犁止されおいたすが、同時に DNS サヌビスの動䜜は維持され、ルヌルを䜜成する際にその機胜が損なわれるこずがよくありたす。 前述したように、セレクタヌが衚瀺されるず、特に指定しない限り、デフォルトの拒吊ポリシヌがセレクタヌに適甚されるためです。

結果

したがっお、Calico の高床な API を䜿甚するず、クラスタヌ内およびクラスタヌ呚蟺のルヌティングを柔軟に構成し、動的に倉曎できたす。 䞀般に、その䜿甚方法は倧砲でスズメを撃぀ように芋え、BGP および IP-IP トンネルを䜿甚した L3 ネットワヌクの実装は、フラット ネットワヌク䞊の単玔な Kubernetes むンストヌルでは巚倧に芋えたす...しかし、それ以倖の点では、このツヌルは非垞に実行可胜で䟿利に芋えたす。 。

セキュリティ芁件を満たすためにクラスタヌを分離するこずは必ずしも実珟可胜であるずは限りたせん。この堎合、Calico (たたは同様の゜リュヌション) が圹に立ちたす。 この蚘事に蚘茉されおいる䟋 (若干の倉曎を加えたもの) は、AWS のクラむアントのいく぀かのむンストヌルで䜿甚されおいたす。

PS

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

出所 habr.com

コメントを远加したす