k8s Network Policy 시작 정보

4955 단어 Kubernetestech
Kubbernetes를 처음 사용하는 Network Policy를 대상으로 한 입문 기사다.

Network Policy 란 무엇입니까?

  • Pod 간 통신 또는 외부 엔드포인트로의 통신을 제어하는 리소스
  • label을 사용하여 Pod를 선택하고 선택한 Pod의traffic rule를 설정합니다
  • podSelector의 지정을 비워 Network Policy가 속한 Namespace의 모든 Pod를 대상으로 할 수 있습니다
  • Namespace 단위로 traffic
  • 제어 가능

    EKS의 Network Policy

  • Calico를 설치하여 Network Policy
  • 사용 가능
  • Fargate 지원되지 않음
  • Calico


    Ref: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/calico.html

  • 캘리코를 설치하기 위한 선언문
  • kube-systemnamespace에서 DaemonSet
  • 생성
    k apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/release-1.5/config/v1.5/calico.yaml
    k get daemonset calico-node --namespace kube-system
    
    k get daemonset calico-node --namespace kube-system
    NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
    calico-node   2         2         2       2            2           beta.kubernetes.io/os=linux   41s
    
  • 사용만 하면 완성
  • Network Policy 검증


    프로비저닝

  • 레이어 1, 2, 3종namespace
  • 제작
  • nginx/busybox의Deployment와 서비스 만들기
  • 네트워크 Policy를 설정하여 얕은 레이어에서 깊은 레이어로의 통신을 허용하지만 반대로 할 수 없음
  • NetworkPolicy


    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: np-layer1
      namespace: layer1
    spec:
      # podSelecorに空の指定をすることで、NetworkPolicyが存在するnamespace内の全てのPodを対象とする
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
      # namespace内の通信を許可する為に、layer1 namespaceからのtrafficをallow
      ingress:
      - from:
        # layer1からのtraficをallow
        - namespaceSelector:
            matchLabels:
              role: layer1
      # egressに空の指定をすることで全てのtrafficをallow
      egress:
      - {}
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: np-layer2
      namespace: layer2
    spec:
      # podSelecorに空の指定をすることで、NetworkPolicyが存在するnamespace内の全てのPodを対象とする
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        # layer1からのtraficをallow
        - namespaceSelector:
            matchExpressions:
            - key: role
              operator: In
              values: [layer1,layer2]
      # layer3へのtrafficをallow
      egress:
      - {}
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: np-layer3
      namespace: layer3
    spec:
      # podSelecorに空の指定をすることで、NetworkPolicyが存在するnamespace内の全てのPodを対象とする
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        # layer1,2からのtraficをallow
        - namespaceSelector:
            matchExpressions:
            - key: role
              operator: In
              values: [layer1,layer2]
      # egressを指定しないことで、全てのtrafficをdeny
    

    동작 검증


    wget --server-response http://nginx1.layer1 -q -O -
    
  • layer1 -> layer1,2,3
  • wget --server-response http://nginx1.layer1 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
    wget --server-response http://nginx2.layer2 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
    wget --server-response http://nginx3.layer3 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
  • layer2 -> layer1,2,3
  • wget --server-response http://nginx1.layer1 -q -O -
    # NG
    
    wget --server-response http://nginx2.layer2 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
    wget --server-response http://nginx3.layer3 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
  • layer3-> layer1,2,3
  • wget --server-response http://nginx1.layer1 -q -O -
    # NG
    
    wget --server-response http://nginx2.layer2 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    
    wget --server-response http://nginx3.layer3 -q -O -
      HTTP/1.1 200 OK
      Server: nginx/1.17.9
    

    알아차리다

  • 설치콜만 해도 쉬워요.
  • Kubernetes Networking에 대한 이해, manifest에 대한 이해, 활용(calico의 모니터링과 고장 시 대응 등), 테스트 등 필요
  • https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/pod-networking.html
  • egress를 엄격히 압축하면 kube-System과 소통할 수 없고 이름 해결이 안 된다
  • egress로 엄격하게 압축하기 어려워(ip로 지정하면 외출 불가)
  • RDS/ElastiCache 등 Cluster 이외의 접근 제어를 할 수 없음(IP 주소의 지정이 되어 아무리 집중해도 서브넷 단위의 제어를 할 수 없음. NLB에 SG를 부여할 수 없는 문제와 비슷함)
  • 또는 SG per Pod
  • 필요

    좋은 웹페이지 즐겨찾기