개발하자

Azure CNI 네트워크 정책을 사용하여 Kubernetes 포드에서 특정 FQDN/DNS로의 송신만 허용

Cuire 2022. 12. 10. 07:39
반응형

Azure CNI 네트워크 정책을 사용하여 Kubernetes 포드에서 특정 FQDN/DNS로의 송신만 허용

어떻게 Azure CNI 네트워크 정책을 사용하여 Kubernetes 포드에서 나가는 것을 특정 FQDN/DNS로만 제한할 수 있습니까?

이는 다음을 통해 달성할 수 있습니다.

이스티오

apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
  name: googleapis
  namespace: default
spec:
  destination:
      service: "*.googleapis.com"
  ports:
      - port: 443
        protocol: https

실륨

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "fqdn"
spec:
  endpointSelector:
    matchLabels:
      app: some-pod
  egress:
  - toFQDNs:
    - matchName: "api.twitter.com"  
  - toEndpoints:
    - matchLabels:
        "k8s:io.kubernetes.pod.namespace": kube-system
        "k8s:k8s-app": kube-dns
    toPorts:
    - ports:
      - port: "53"
        protocol: ANY
      rules:
        dns:
        - matchPattern: "*"

OpenShift

apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
  name: default-rules 
spec:
  egress: 
  - type: Allow
    to:
      dnsName: www.example.com
  - type: Deny
    to:
      cidrSelector: 0.0.0.0/0

Azure CNI 네트워크 정책으로 유사한 작업을 수행하려면 어떻게 해야 합니까?




K8s 네트워크 정책 적용

`

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-rules
spec:
  podSelector:
    matchLabels:
      role: pod_role
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    - host: www.example.com

`

언급




FQDN/DNS 규칙이 있는 ATM 네트워크 정책은 AKS에서 지원되지 않습니다.

Azure CNI 및 Azure Policy Plugin을 사용하면 기본 Kubernetes 네트워크 정책이 제공됩니다.

Azure CNI & Calico Policy Plugin을 사용하면 FQDN/DNS가 아닌 Global Network Policies와 같은 고급 기능을 사용할 수 있습니다. 불행하게도 이것은 칼리코 클라우드의 유료 기능이다.




Google에서 이 페이지를 클릭하는 경우:

클라우드 프로바이더(OpenTelekomCloud)에서 잘 작동하는 솔루션을 찾았고 다른 많은 솔루션에서도 잘 작동할 것입니다.

라는 프로젝트가 있다.

사용자 정의 리소스 정의

apiVersion: networking.gke.io/v1alpha3
kind: FQDNNetworkPolicy
metadata:
  name: allow-test
  namespace: test1
spec:
  podSelector: {}
  egress:
    - to:
      - fqdns:
        - heise.de
      ports:
      - port: 443
        protocol: TCP
      - port: 80
        protocol: TCP

FQDN을 확인하고 최종 네트워크 정책을 생성하며 30초마다 레코드를 업데이트합니다. 최종 정책은 다음과 같습니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-test
  namespace: test1
  annotations:
    fqdnnetworkpolicies.networking.gke.io/owned-by: allow-test
spec:
  podSelector: {}
  egress:
    - ports:
        - protocol: TCP
          port: 443
        - protocol: TCP
          port: 80
      to:
        - ipBlock:
            cidr: 128.65.210.8/32
  policyTypes:
    - Ingress
    - Egress

GKE 외부에서 작동하도록 하려면 다음 권한을 yaml(릴리스 페이지에서 다운로드)의 clusterRole에 추가해야 했습니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fqdnnetworkpolicies-manager-role
rules:

...

- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies/status
  verbs:
  - get
  - patch
  - update

반응형