티스토리 뷰

Azure Network Policy는 다음 링크에서 설명되어 있듯이 NSG(Network Security Groups)처럼 kubernetes cluster 내부의 통신을 micro-segmentation 으로 관리하기 위한 서비스이다.

설치

일반적으로 AKS(Azure Kubernetes Service) 생성시 argument로 전달하여 설치가 가능하다.

$ az aks create -g resourcegroup -n clustername --network-plugin azure --network-policy azure

만약 초기 설치시 network-policy를 지정하지 않았다면 다음 manifest를 통해 설치가 가능하다.
(다만 동작상 문제가 되지는 않으나 azure portal 및 cli 상에 정보조회가 network policy가 null로 출력된다.또한 공식적으로는 DIY kubernetes(직접 azure 상에 구현한 kubernetes)에 대해서 제공하고 있기에 지원상 제약이 따를수도 있다.)

다음과 같이 manifest 기반으로 설치를 진행한다.
(현재 버전은 1.4.29이며 가급적 최신버전으로 설치하기를 권장한다.)

$ kubectl apply -f https://raw.githubusercontent.com/Azure/azure-container-networking/master/npm/azure-npm.yaml

어떤 방식으로 설치가 되던 azure-npm 이름의 daemonset이 배포된것을 확인 할 수 있다.
(실제 azure network policy manager라는 이름으로 github 링크에서 관리되고 있다.)

$ kubectl get ds -n kube-system -l app=azure-npm
NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
azure-npm   4         4         4       4            4           kubernetes.io/os=linux   24h

알아두어야 할 사항들

  • networkpolicy가 존재하는 namespace에서만 각 pod가 해당 networkpolicy로 제어된다.
  • 공식문서상 소개된 windows 제한사항 이 있다.

동작원리

간단하게 network policy가 동작원리를 알아보자.
(참고로 해당 테스트 결과는 azure-npm 1.4.45 이다.)

먼저 daemonset으로 각 노드마다 동작되는 azure-npm pod에 접근해보자.
이후 아래와 같은 metadata API에 대한 접근을 제한해보자.
(해당 yaml은 link에서 소개된 yaml이다.)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-instance-metadata
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 169.254.169.254/32

이는 metadta API 조회를 위한 IMDS IP(169.254.169.254)로만 제어하고 나머지는 모두 허용시키는 networkpolicy 이다.
실제 생성된 networkpolicy를 조회해보면 해당 namespace에 대해 except 로 지정된 ip를 제외하고 모든 traffic을 허용한다고 나와있다.

jacob@laptop:~ $ kubectl describe networkpolicy restrict-instance-metadata
Name:         restrict-instance-metadata
Namespace:    default
Created on:   2023-04-17 15:37:20 +0900 KST
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Not affecting ingress traffic
  Allowing egress traffic:
    To Port: <any> (traffic allowed to all ports)
    To:
      IPBlock:
        CIDR: 0.0.0.0/0
        Except: 169.254.169.254/32
  Policy Types: Egress

위 정책은 egress에 대한 제어가 목적이기에 아래와 같이 AZURE-NPM-EGRESS chain에 description이 network policy와 매칭되는 rule이 추가되었음을 확인할 수 있다.

root@aks-nodepool1-38764369-vmss000004:/usr/local/npm# iptables -nvL AZURE-NPM-EGRESS
Chain AZURE-NPM-EGRESS (2 references)
 pkts bytes target     prot opt in     out     source               destination
  126  7560 AZURE-NPM-EGRESS-3618314628  all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set azure-npm-4272224941 src match-set azure-npm-2064349730 src /* EGRESS-POLICY-kube-system/konnectivity-agent-FROM-podlabel-app:konnectivity-agent-AND-ns-kube-system-IN-ns-kube-system */
    0     0 AZURE-NPM-EGRESS-4213911885  all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set azure-npm-784554818 src /* EGRESS-POLICY-default/restrict-instance-metadata-FROM-ns-default-IN-ns-default */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x800/0x800 /* DROP-ON-EGRESS-DROP-MARK-0x800/0x800 */
    0     0 AZURE-NPM-ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x200/0x200 /* ACCEPT-ON-INGRESS-ALLOW-MARK-0x200/0x200 */

실제 아래와 같이 networkpolicy 이름이 description에 존재하는 rule내 ipset 항목에 포함되는 경우 모두 accept되도록 된다. 만약 해당 ipset에 포함되지 않은 경우 특정 flag(0x800)가 mark 되고 다른 rule에서 차단되게 된다.

root@aks-nodepool1-38764369-vmss000004:/usr/local/npm# iptables -nvL AZURE-NPM-EGRESS-4213911885
Chain AZURE-NPM-EGRESS-4213911885 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 AZURE-NPM-ACCEPT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set azure-npm-50166028 dst /* ALLOW-TO-cidr-restrict-instance-metadata-in-ns-default-0-0OUT */
    0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* DROP-ALL */ MARK or 0x800

실제 위 rule에 ipset 이 존재하며 하나(azure-npm-50166028)는 networkpolicy에 정의된 ip 항목들이며 나머지 하나(azure-npm-784554818)는 pod들의 ip이다.

root@aks-nodepool1-38764369-vmss000004:/usr/local/npm# ipset -L azure-npm-50166028
Name: azure-npm-50166028
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 4294967295
Size in memory: 640
References: 1
Number of entries: 3
Members:
128.0.0.0/1
0.0.0.0/1
169.254.169.254 nomatch

root@aks-nodepool1-38764369-vmss000004:/usr/local/npm# ipset -L azure-npm-784554818
Name: azure-npm-784554818
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 576
References: 4
Number of entries: 2
Members:
10.1.1.32
10.1.1.15

정리하자면 AZURE-NPM-EGRESS chain에 생성한 networkpolicy에 매칭되는 chain이 생성되고 생성된 chain에는 두개의 ipset 이 존재하고 두 ipset은 pod의 IPs와 접근가능한 목적지 IP를 의미하게 된다.
결론적으로 ipset(azure-npm-784554818)에 속한 pod에서 ipset(azure-npm-50166028)에 속한 대상을 접근하고자 할때 허용/차단이 이루어지게 된다.

설정 및 기타 기능

Prometheus exporter로 metric 을 제공한다.
관련 url은 다음과 같다.

  • localhost:10091/node-metrics
  • localhost:10091/cluster-metrics

prometheus scrap configuration에서 사용될수 있는 yaml은 다음과 같다.
https://github.com/Azure/azure-container-networking/blob/master/npm/metrics/prometheus-server-scrape-config.yaml

root@aks-nodepool1-34436767-vmss000000:/usr/bin# cat /etc/azure-npm/azure-npm.json
{
    "ResyncPeriodInMinutes": 15,
    "ListeningPort":         10091,
    "ListeningAddress":      "0.0.0.0",
    "Toggles": {
        "EnablePrometheusMetrics": true,
        "EnablePprof":             true,
        "EnableHTTPDebugAPI":      true,
        "EnableV2NPM":             false,
        "PlaceAzureChainFirst":    false
    },
    "Transport": {
      "Address":    "azure-npm.kube-system.svc.cluster.local",
      "Port":       19002,
      "ServicePort": 9001
    }
}

참고

networkpolicy를 flow 기반으로 그래픽컬 하게 확인시켜주는 url이 있다. 생성한 networkpolicy를 업로드하여 simulation 해볼수 있으니 참고하면 좋을듯하다.

관련 코드

Disclaim
Microsoft의 공식적인 문서가 아닌 개인의 경험을 바탕으로 작성된 내용임을 알립니다.
This is not official document published by Microsoft. Note that this document is based on personal experience.

'Cloud > Public Cloud' 카테고리의 다른 글

Bicep  (0) 2023.11.07
Azure Custom Policy for AKS cluster  (0) 2023.05.08
Logic Apps for Azure Resource  (0) 2023.04.17
Kata Container on AKS  (0) 2023.03.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함