본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 174: Network Policy

by 공부하는 무니 2023. 1. 20.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


먼저 네트워킹 및 보안 기초를 올바르게 세우고 시작하겠습니다. 이것이 너무 기본적일 수 있지만, 본격적으로 시작하기 전에 우리 모두가 같은 이해 수준에 있는지 확인하기 위해 잠시 시간을 할애하고 싶었습니다.
웹, 앱, 데이터베이스 서버를 통해 흐르는 트래픽의 간단한 예부터 시작하겠습니다.

사용자에게 프론트 엔드를 제공하는 웹 서버, 백엔드 API를 제공하는 앱 서버 및 데이터베이스 서버가 있습니다. 사용자는 포트 80으로 웹 서버에 요청을 보냅니다. 그러면 웹 서버는 포트 5000으로 API 서버로 요청을 보냅니다. 그런 다음 API 서버는 포트 3306으로 데이터베이스 서버에서 데이터를 가져온 다음 데이터를 다시 사용자에게 보냅니다. 매우 간단한 설정입니다.
여기에는 수신과 송신의 두 가지 유형의 트래픽이 있습니다. 예를 들어 웹 서버의 경우 사용자로부터 들어오는 트래픽은 Ingress 트래픽이고 앱 서버로 나가는 요청은 Egress 트래픽입니다. 이 트래픽들은 직선으로 표시됩니다.

수신 및 송신을 정의할 때 트래픽이 시작된 것에서부터의 방향만 보고 있다는 점을 기억하십시오. 점선으로 표시된 사용자에 대한 응답은 실제로 중요하지 않습니다.

마찬가지로 백엔드 API 서버의 경우 포트 5000에서 웹 서버로부터 ingress 트래픽을 수신하고 데이터베이스 서버로 포트 3306으로 egress 트래픽을 가지고 있습니다.
그리고 데이터베이스 서버의 관점에서 볼 때 API 서버로부터 포트 3306에서 인그레스 트래픽을 수신합니다.

이 작업을 수행하는 데 필요한 규칙을 나열하자면 웹 서버의 포트 80에서 HTTP 트래픽을 수락하는 데 필요한 ingress rule, 웹 서버에서 API의 포트 5000으로 트래픽을 허용하는 egress rule,  API 서버의 포트 5000에서 트래픽을 허용하는 ingress rule, 데이터베이스 서버의 포트 3306으로 트래픽을 허용하는 egress rule, 마지막으로 포트 3306에서 트래픽을 수락하는 데이터베이스 서버의 ingress rule입니다. 이것이 traffic flow와 rule의 기본입니다.

Network Security

이제 Kubernetes의 네트워크 보안을 살펴보겠습니다. 일련의 파드 및 서비스를 호스팅하는 노드 집합이 있는 클러스터가 있습니다. 각 노드에는 IP 주소가 있으며 각 파드와 서비스도 마찬가지입니다. 쿠버네티스 네트워킹의 전제 조건 중 하나는 구현하는 솔루션이 무엇이든 간에 파드는 route와 같은 추가 설정을 구성하지 않고도 서로 통신할 수 있어야 합니다.

예를 들어 이 네트워크 솔루션에서 모든 파드는 Kubernetes 클러스터의 노드 전체에 걸쳐 있는 가상 사설망(virtual private network)에 있으며 default로 해당 목적으로 구성된 IP 또는 파드 이름 또는 서비스를 사용하여 서로 연결할 수 있습니다. Kubernetes는 default로 모든 파드에서 클러스터 내의 다른 파드 또는 서비스로의 트래픽을 허용하는 모두 허용 규칙으로 구성됩니다.

이전 논의를 다시 가져와 Kubernetes에 어떻게 적용되는지 살펴보겠습니다. 애플리케이션의 각 컴포넌트에 대해 Pod를 배포합니다. 하나는 프론트 엔드 웹 서버용, API 서버용, 다른 하나는 데이터베이스용입니다. 우리는 엔드 유저와 엔드 유저 간의 통신을 가능하게 하는 서비스를 만듭니다. 위에서 논의한 내용에 따라 default로 3개의 파드는 모두 Kubernetes 클러스터 내에서 서로 통신할 수 있습니다.

Network Policy

프론트 엔드 웹 서버가 데이터베이스 서버와 직접 통신할 수 없도록 하려면 어떻게 해야 합니까? 예를 들어 보안 팀과 감사에서 이러한 일이 발생하지 않도록 해야 한다고 가정해 보겠습니다. 여기에서 API 서버에서만 DB 서버로의 트래픽을 허용하는 네트워크 정책을 구현합니다. 그리고 네트워크 정책은 파드, replicaSet 또는 서비스와 같은 Kubernetes 네임스페이스의 또 다른 오브젝트이며, 네트워크 정책을 하나 이상의 파드에 연결합니다. 네트워크 정책 내에서 규칙을 정의할 수 있습니다.

이 경우 포트 3306의 API 파드에서 수신 트래픽만 허용한다고 말하고 싶습니다. 이 정책이 생성되면 파드에 대한 다른 모든 트래픽을 차단하고 지정된 규칙과 일치하는 트래픽만 허용합니다. 다시 말하지만 이것은 네트워크 정책이 적용되는 파드에만 적용됩니다.

그렇다면 네트워크 정책을 파드에 어떻게 적용하거나 연결합니까? replicaSet 또는 서비스를 파드, 레이블 및 selector에 연결하기 위해 이전에 사용했던 것과 동일한 기술을 사용합니다. 파드에 레이블을 지정하고 네트워크 정책의 podSelector 필드에 동일한 레이블을 사용한 다음 rule을 작성합니다. 정책 유형에서 규칙이 ingress 또는 egress 트래픽을 허용할지, 아니면 둘 다를 허용할지 지정합니다.

Network Policy Rules

이번 경우에는 DB 파드에 대한 ingress 트래픽만 허용하기를 원하므로 ingress를 추가합니다. 다음으로 ingress rule을 지정합니다. 그러면 API 파드의 트래픽이 허용되고 label과 selector를 사용하여 API 파드를 지정합니다. 마지막으로 트래픽을 허용하는 포트는 3306입니다. 이것들을 함께 두면 됩니다.

Create network policy

빈 오브젝트 definition 파일로 시작해보겠습니다. apiVersion, kind, metadata, spec이 있습니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
 name: db-policy
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api-pod
    ports:
    - protocol: TCP
      port: 3306

API 버전은 networking.k8s.io/v1입니다. kind는 NetworkPolicy이며 정책 이름을 db-policy로 지정한 다음 spec 섹션에서 먼저 파드 selector를 이동하여 이 정책을 db 파드에 적용합니다. 그런 다음 위에서 만든 규칙을 그 아래로 이동하면 됩니다. 첫 번째 네트워크 정책이 준비되었습니다.

ingress 또는 egress 격리는 policyTypes에 ingress나 egress이 있는 경우에만 적용됩니다. 이 예에서는 policyTypes에 ingress만 있습니다. 즉, ingress 트래픽만 격리되고 모든 egress 트래픽은 영향을 받지 않습니다. 파드가 모든 egress 호출을 할 수 있고 차단되지 않음을 의미합니다. 따라서 egress 또는 ingress 격리가 발생하려면 policyTypes 아래에 추가해야 합니다. 그렇지 않으면 격리가 없습니다.

$ kubectl create -f policy-definition.yaml

kubectl create 커맨드를 실행하여 정책을 작성하십시오.

Note

네트워크 정책은 Kubernetes 클러스터에 구현된 네트워크 솔루션에 의해 시행되며 모든 네트워크 솔루션이 네트워크 정책을 지원하는 것은 아닙니다. 지원되는 몇 가지는 Kube-router, Calico, Romana 및 Wave-net입니다. Flannel을 네트워킹 솔루션으로 사용한 경우 네트워크 정책을 지원하지 않습니다. 네트워크 정책에 대한 지원을 보려면 항상 네트워크 솔루션 공식문서를 참조하세요. 또한 네트워크 정책을 지원하지 않는 솔루션으로 구성된 클러스터에서도 정책을 생성할 수는 있지만 적용되지는 않는다는 점을 기억하세요. 네트워크 솔루션이 네트워크 정책을 지원하지 않는다는 오류 메시지가 표시되지 않습니다. 

반응형

댓글