メむンコンテンツぞスキップ
芋出し画像

KubernetesのNetworkPolicyで「党拒吊」ず「党蚱可」を蚭定する方法

    kubernetesでPod同士の通信を制埡したい堎面っお、意倖ずありたすよね。

    AWSだずEC2同士の通信はSecurity Groupでコントロヌルできたすが、
    kubernetesでPod間の通信を制埡したい堎合に出おくるのがNetworkPolicyです。

    実際に觊っおいる䞭で、「これちょっず分かりづらいな」ず感じたポむントがありたした。
    それが「党拒吊」ず「党蚱可」の曞き方です。

    ingress: [] が党拒吊、
    ingress: [{}] が党蚱可。

    ぱっず芋はほずんど同じなのに、動きは真逆です。
    ちょっずした違いなのに結果が倧きく倉わるので、ここは䞀床敎理しおおきたいずころです。


    (1) 党拒吊を蚭定する方法ingress: []

    䟋えば、以䞋のようなNetworkPolicyがあるずしたす。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: nginx-deny-all-ingress
      namespace: network-test
    spec:
      podSelector:
        matchLabels:
          app: nginx
      policyTypes:
      - Ingress
      ingress: []     # 党拒吊
    

    この䞭にある ingress: [] がポむントです。

    これは蚱可ルヌルが1぀もない状態を衚しおいたす。

    NetworkPolicyは「蚱可された通信だけを通す仕組み」なので、
    蚱可が存圚しない堎合は、すべお拒吊されたす。

    たずえるなら、入通リストを甚意したのに䞭身が空の状態です。
    リスト自䜓はあるのに、誰も名前が曞かれおいないので、結果ずしお党員入れたせん。

    そのため、この蚭定を適甚するず察象のPodは倖郚からの通信を受け付けなくなりたす。


    (2) 党蚱可を蚭定する方法ingress: [{}]

    今床は党蚱可のパタヌンです。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: nginx-allow-all-ingress
      namespace: network-test
    spec:
      podSelector:
        matchLabels:
          app: nginx
      policyTypes:
      - Ingress
      ingress:
        - {}
    

    or

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: nginx-allow-all-ingress
      namespace: network-test
    spec:
      podSelector:
        matchLabels:
          app: nginx
      policyTypes:
      - Ingress
      ingress: [{}]
    

    こちらは条件なしの蚱可ルヌルが1぀ある状態です。

    {} は送信元やポヌトの条件を指定しおいないため、
    どこからでも、どのポヌトでも通信を受け入れる圢になりたす。

    むメヌゞずしおは、入通ルヌルに「条件なしで通しおよい」ず1行曞かれおいる状態です。
    现かい制限がないぶん、結果ずしお党員通れるようになりたす。

    デバッグや疎通確認のずきに䜿われるこずが倚い蚭定です。

    ドキュメントなどでは - {} の圢匏で曞かれおいるこずが倚いですが、
    自分は党拒吊ずの察比を分かりやすくするために ingress: [{}] ず曞くこずがありたす。

    ingress: [] ず䞊べたずきに、空なのかルヌルがあるのかが刀断しやすくなるためです。


    (3) 䌌おいるのに結果が逆になる理由

    この2぀の違いは「ルヌルが存圚するかどうか」です。

    • ingress: []
      ルヌルはあるが䞭身が空
      そのため蚱可される通信はない

    • ingress: [{}]
      条件なしのルヌルが1぀ある
      そのためすべおの通信が蚱可される

    同じように芋えおも、
    片方は「䜕も蚱可しおいない」、もう片方は「条件なしで蚱可しおいる」ずいう違いがありたす。

    ここを取り違えるず、意図しない通信状態になるので泚意が必芁です。


    (4) よくある勘違い

    (1) NetworkPolicyが存圚しない堎合

    制埡自䜓がない状態なので、基本的には通信できたす。

    (2) NetworkPolicyが存圚しお ingress: [] の堎合

    察象のPodは倖郚からの通信を受け付けなくなりたす。

    「曞いおいない」ず「空で曞いおいる」は意味が違う、ずいう点がポむントです。


    (5) 実務での䜿い分け

    (1) たず党郚閉じたい堎合

    ingress: []
    

    䞍芁な通信を先に止めお、必芁なものだけ埌から蚱可しおいく圢です。

    (2) 䞀時的に党郚開けたい堎合

    ingress:
      - {}
    

    or

    ingress: [{}]
    

    疎通確認やデバッグ時に、䞀時的に通信を通したい堎合に䜿われたす。


    (6) サンプルで実際に確認しおみる

    実際に詊すず、この違いはかなりはっきり䜓感できたす。

    以䞋では、curl が入っおいるPodから nginx に通信できるかどうかを確認したす。

    たずは次のマニフェストを apply したす。

    apiVersion: v1
    kind: Pod
    metadata:
      name: curl
      namespace: network-test
      labels:
        app: curl
    spec:
      containers:
        - name: curl
          image: curlimages/curl:latest
          command: ["sleep", "infinity"]
      restartPolicy: Always
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: network-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:stable
              ports:
                - containerPort: 80
              securityContext:
                capabilities:
                  add: ["NET_ADMIN"]
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: network-test
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          targetPort: 80
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: nginx-deny-all-ingress
      namespace: network-test
    spec:
      podSelector:
        matchLabels:
          app: nginx
      policyTypes:
      - Ingress
      ingress: []     # 党拒吊
      # ingress: [{}] # 党蚱可
    
    

    apply したあず、以䞋のコマンドで確認できたす。

    kubectl exec -n network-test curl -- curl -v http://nginx.network-test.svc.cluster.local:80
    

    ingress: [] の状態では通信できず、
    ingress: [{}] に倉曎するず通信できるようになりたす。

    芋た目は少ししか違わないのに、結果がはっきり倉わるので、この差は䜓感しおおくず蚘憶に残りやすいでぜひ詊しおみおください


    たずめ

    KubernetesのNetworkPolicyで党拒吊ず党蚱可を蚭定する堎合、ingress の曞き方がそのたた挙動に盎結したす。

    ingress: [] は蚱可ルヌルがないため党拒吊、
    ingress: [{}] は条件なしの蚱可ルヌルがあるため党蚱可になりたす。


    Yamlの配列の曞き方、なんずなく苊手なんですよね 
    NetworkPolicyで配列が出おくるず、䞀瞬思考が止たっおしたうこずがありたす

     
     

    toshi

     
     
    Kubernetesが奜きなむンフラ゚ンゞニア / 株匏䌚瀟クラフトマン゜フトりェア / 文系出身から営業→䌁画→フロント゚ンド→バック゚ンド→むンフラ゚ンゞニアぞずキャリアチェンゞしおきたした。い぀か自前でクラりドみたいなものを぀くれるように日々奮闘䞭です

    あなたぞのおすすめ