NetworkPolicy 기본 설정

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 80

정책의 주요 내용

  • podSelector: 이 네트워크 정책이 적용될 파드를 지정합니다. 이 설정에서는 role: db라는 라벨이 붙은 모든 파드에 정책을 적용합니다. 즉, 이 정책은 데이터베이스 역할을 하는 파드를 보호하는 역할을 합니다.
  • policyTypes: 정책이 적용될 트래픽의 방향을 지정합니다.
    • Ingress: 외부에서 파드로 들어오는 트래픽에 대한 규칙을 정의합니다.
    • Egress: 파드에서 외부로 나가는 트래픽에 대한 규칙을 정의합니다. 이 설정에서는 인그레스(Ingress)와 이그레스(Egress) 규칙을 모두 정의하고 있습니다. 하지만 YAML 파일에 이그레스(Egress) 규칙이 명시되어 있지 않으므로, 이 정책이 적용되는 파드에서는 외부로의 모든 트래픽이 차단됩니다.
  • ingress: role: db 파드로 들어오는 트래픽에 대한 허용 규칙을 정의합니다.
    • from: 어떤 소스로부터의 트래픽을 허용할지 지정합니다. 여기서는 두 가지 소스를 허용하고 있습니다.
      • namespaceSelector: project: myproject 라벨이 붙은 모든 네임스페이스의 파드로부터의 접근을 허용합니다.
      • podSelector: 현재 네임스페이스(default) 내에서 role: frontend 라벨이 붙은 모든 파드로부터의 접근을 허용합니다. 즉, 이 데이터베이스 파드에는 myproject라는 프로젝트 라벨이 붙은 네임스페이스의 파드와, default 네임스페이스에 있는 frontend 파드만 접근할 수 있습니다.
    • ports: 허용되는 포트와 프로토콜을 지정합니다. 여기서는 TCP 프로토콜을 사용하는 80번 포트로 들어오는 트래픽만 허용하고 있습니다.
      • 참고: 보통 데이터베이스는 3306(MySQL), 5432(PostgreSQL) 등 다른 포트를 사용

 

 

[샘플1] 모든 인그레스 트래픽 차단 정책

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

정책의 주요 내용

    • podSelector: {}: 이 부분이 가장 중요합니다. 비어 있는 {}는 '모든 파드'를 의미합니다. 즉, 이 정책이 적용되는 네임스페이스의 모든 파드에 대해 규칙을 적용하겠다는 뜻입니다. 만약 네임스페이스가 명시되지 않았다면, 이 정책을 배포하는 네임스페이스의 모든 파드에 적용됩니다.
    • policyTypes: 정책이 적용될 트래픽의 방향을 지정합니다.
      • Ingress: 외부에서 파드로 들어오는 트래픽에 대한 규칙을 정의합니다.
      • 이 설정은 Ingress만 명시하고 있으며, 인그레스 규칙을 구체적으로 정의하는 ingress: 섹션이 없습니다.

요약

 

  • 들어오는 트래픽(Ingress):
    • ingress 규칙이 명시되어 있지 않습니다.
    • policyTypes에 Ingress가 포함되어 있고 ingress 규칙이 없으면, 이는 **'모든 인그레스 트래픽을 거부한다'**는 의미로 해석됩니다.
    • 따라서 이 정책이 적용되는 네임스페이스의 모든 파드는 외부로부터의 모든 네트워크 접근이 차단됩니다.
  • 나가는 트래픽(Egress):
    • Egress 정책 타입이 명시되지 않았으므로, 나가는 트래픽에는 아무런 제약이 없습니다. 모든 파드는 외부로 자유롭게 통신할 수 있습니다.

 

 

[샘플2] 모든 인그레스 트래픽 허용 정책

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-ingress
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

정책의 주요 내용

  • podSelector: {}: 이 정책이 적용될 파드를 지정합니다. 비어 있는 {}는 '모든 파드'를 의미합니다. 이 정책이 배포되는 네임스페이스에 있는 모든 파드에 규칙이 적용됩니다.
  • ingress: - {}: 이 부분이 핵심입니다. 비어 있는 ingress 규칙은 **모든 소스(from)**와 **모든 포트(ports)**에 대해 인그레스 트래픽을 허용하겠다는 의미입니다.
  • policyTypes: - Ingress: 이 정책이 **들어오는 트래픽(Ingress)**에 대한 규칙만 정의하고 있음을 나타냅니다.

 

요약

  1. 들어오는 트래픽(Ingress):
    • ingress: - {}는 모든 외부 소스로부터 모든 포트로 들어오는 트래픽을 허용합니다.
    • 이 정책은 마치 방화벽의 모든 문을 활짝 열어주는 것과 같습니다.
  2. 나가는 트래픽(Egress):
    • Egress 정책 타입이 명시되지 않았습니다.
    • 따라서 파드에서 외부로 나가는 트래픽에는 아무런 제약이 없습니다. 모든 파드는 외부로 자유롭게 통신할 수 있습니다.

 

 

https://kubernetes.io/docs/concepts/services-networking/network-policies/

 

Network Policies

If you want to control traffic flow at the IP address or port level (OSI layer 3 or 4), NetworkPolicies allow you to specify rules for traffic flow within your cluster, and also between Pods and the outside world. Your cluster must use a network plugin tha

kubernetes.io

 

문제 개요

ServiceAccount 를 파드용으로 생성 후 파드에 적용

 

- ServiceAccount 생성(https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/  참고)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa
automountServiceAccountToken: false

 

- Pod 생성 후 ServiceAccount 적용

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-pod
  name: my-pod
spec:
  serviceAccountName: my-sa
  automountServiceAccountToken: false
  containers:
  - image: nginx
    name: my-pod

ingrss 란 여러가지 조건에 따라 트래픽 라우팅을 설정해 주는 서비스이다.

AWS 로 예를들면 ALB 와 동일하다고 생각하면 된다. 

설정할 수 있는 조건으로는 host 와 path 등이 있고, ingress 를 사용하기 위해서는 ingress-controller 가 설치 되어 있어야 한다.


예제

  • Nginx Deployment 와 Service 가 Cluster 내부에서 기동 중
  • ingress controller 를 사용하여 외부에서 내부의 Nginx 서비스로 접근
  • Nginx ingress controller 는 아래의 경로를 통해 설치 

nginx ingress controller

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

 

Installation Guide - Ingress-Nginx Controller

Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,

kubernetes.github.io

 


  • Deploy, Service, Ingress 배포
  • 배포 후 Nginx-ingress-controller 의 서비스 인 ingress-nginx-controller 의 ip:port 형식으로 호출하여야 한다
  • ingress 에서 path 를 /test 로 설정하였으므로, 호출시 ip:port/test 를 하면 클러스터 내부의 nignx 응답을 받을 수 있다
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 31100
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
---
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 31100
  • 제 횐경에서의 ingress-nginx-controller 는 30303 포트이므로 NodeIP:30303/test 를 하게되면 ingress 를 통해서 nignx 가 호출 된다

'k8s > CKAD' 카테고리의 다른 글

NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

 

k8s 내부에서 pod 간의 통신을 제어할때 NetworkPolicy 를 사용하여 제어 할 수 있다.

간단한 예로 NetworkPolicy 적용 예를 살펴 보자


조건

1. 파드명이 db인 파드와 web인 파드가 있다

2. 파드명이 db인 파드는 파드명이 web  에서 오는 통신만 허용 하여야 한다

 


상세설명

[db pod yaml]

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: db
  name: db
  namespace: np-test
spec:
  containers:
  - image: nginx
    name: db

 

[web pod yaml]

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
  namespace: np-test
spec:
  containers:
  - image: nginx
    name: web

 

[NetworkPolicy]

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: np-test
spec:
  podSelector:
    matchLabels:
      app: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: web
  • NetworkPolicy 의 spec.podSelector 는 대사이 되는 파드를 지정하는 곳이다
  • matchLabels 가 app: db 로 설정 되어 있는내용은, 레이블 값이 app: db 인 파드는 아래 policy 의 정책을 적용 받는다 라는 내용이다
  • policyTypes 는 Ingress, Egress 조건을 지정한다
  • spec.ingress.from.podSelector 부분은 ingress 를 허용할 조건을 가진 파드를 명시한다
  • matchLabels 가 app: web 으로 되어 있는 부분은, 레이블 값이 app: web 인 파드만 위에 명시된 app: db 가 포함된 파드에 트래픽을 허용한다

위에 명시된 yaml 파일을 전부 배포후 테스트

 

1. web pod 에서 db pod 로 통신 확인

2. NetworkPolicy 에서 ingress 부분 삭제 후 통신 여부 테스트

- 아래 처럼 spec.ingress.from.podSelector를  app:was 로 설정하면 app: was 레이블을 가진 파드만 db 파드로 통신이 허용됨

- 아래 yaml로 NetworkPolicy 배포(수정) 후 통신 확인

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: np-test
spec:
  podSelector:
    matchLabels:
      app: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: was

 

NetworkPolicy 수정

 

아래와 같이 동일한 명령어지만 통신이 불가 한 것을 확인 할 수 있다

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
[CKAD] Secret 생성 후 Pod 에 env 로 사용  (0) 2023.12.01
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

조건

Secret Name : my-secret

Secret Key : MySecret

Secret Value : SecretValue

 

Pod Name : env-secret-pod

Pod Image : Nginx

 


 

1. Secret 생성

kubectl create secret generic my-secret --from-literal=MySecret=SecretValue

 

 

2. Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: env-secret-pod
spec:
  containers:
  - name: envars-secret-container
    image: nginx
    env:
    - name: SECRET_NAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: MySecret

 

 

3. 결과 확인

kubectl exec env-secret-pod -- env

 

 

참고자료

https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/

 

Distribute Credentials Securely Using Secrets

This page shows how to securely inject sensitive data, such as passwords and encryption keys, into Pods. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is re

kubernetes.io

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-secret-generic-em-

'k8s > CKAD' 카테고리의 다른 글

ingress 개념 정리  (1) 2024.01.21
NetworkPolicy 개념 정리  (0) 2024.01.20
[CKAD]k8s Job / CronJob  (0) 2023.09.10
[CKAD]Docker image build  (0) 2023.09.09

+ Recent posts