이 페이지에서는 클러스터 네트워크 정책을 사용하여 포드가 들어오는(또는 인그레스) 네트워크 트래픽을 수신할 수 있는지 여부를 제어하고 나가는(또는 이그레스) 트래픽을 전송할 수 있는지 여부를 제어합니다.
네트워크 정책을 사용하면 포드 객체 간의 연결을 제한할 수 있으므로 공격에 대한 노출을 줄일 수 있습니다.
네트워크 정책은 OSI 모델의 레이어 3 또는 레이어 4에서 방화벽 역할을 합니다. 승인 또는 암호화와 같은 추가 기능은 제공하지 않습니다.
포드 객체로 들어오는 트래픽 제한
NetworkPolicy
객체를 사용하면 포드에 대한 네트워크 액세스 정책을 구성할 수 있습니다. NetworkPolicy
객체에는 다음 정보가 포함됩니다.
정책이 적용되는 포드 객체. 라벨 및 선택기를 사용하여 포드 객체 및 워크로드를 정의합니다.
네트워크 정책이 영향을 주는 트래픽 유형: 들어오는 트래픽을 나타내는 인그레스, 나가는 트래픽을 나타내는 이그레스 또는 둘 다
인그레스 정책의 경우 지정된 포드 객체에 연결할 수 있는 포드 객체
이그레스 정책의 경우 지정된 포드 객체가 연결할 수 있는 포드 객체
수신 트래픽 제한 예시
이 섹션에서는 샘플 애플리케이션에서 들어오는 트래픽 제한을 만드는 방법을 보여줍니다. 이 예시를 자체 애플리케이션 환경에 맞게 수정합니다.
app=hello
라벨을 사용해서 웹 서버 애플리케이션을 실행하고 이를 클러스터 내부에서 노출합니다.kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \ --port 8080 --expose
app=foo
포드 객체에서만hello-web
포드에 대한 트래픽을 허용하도록NetworkPolicy
를 구성합니다. AWS용 GKE는 이 라벨이 없는 포드 객체에서 들어오는 트래픽과 외부 트래픽, 다른 네임스페이스에 포함된 포드 객체의 트래픽을 차단합니다.다음 매니페스트는
app=hello
라벨이 있는 포드 객체를 선택하고app=foo
라벨이 있는 포드 객체의 트래픽만 허용하도록 인그레스 정책을 지정합니다.이 정책을 클러스터에 적용합니다.
kubectl apply -f hello-allow-from-foo.yaml
인그레스 정책 확인
라벨이
app=foo
인 임시 포드를 실행합니다. 들어오는 트래픽이 허용되는지 확인하려면hello-web:8080
엔드포인트에 요청합니다.kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
포드
app=foo
에서app=hello
포드 객체로의 트래픽이 사용 설정되면 출력은 다음과 같이 표시됩니다.Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
다른 라벨(
app=other
)이 있는 임시 포드를 실행하고 동일한 요청을 수행하여 트래픽이 허용되지 않는지 확인합니다.kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080
출력에서 연결이 응답을 수신하지 않는지 확인합니다.
wget: download timed out
포드 객체에서 나가는 트래픽 제한
들어오는 트래픽과 같은 방식으로 나가는 트래픽을 제한할 수 있습니다.
그러나 hello-web
과 같은 내부 호스트 이름 또는 www.example.com
과 같은 외부 호스트 이름을 쿼리하려면 TCP 및 UDP 프로토콜을 사용하여 포트 53에서 DNS 트래픽을 허용하는 이그레스 정책을 만들어야 합니다.
이그레스 네트워크 정책을 사용 설정하기 위해 DNS 트래픽은 물론 라벨이 app=hello
인 포드 객체에 대한 트래픽만 허용하면서 라벨이 app=foo
인 포드 객체에서 아웃바운드 트래픽을 제어하는 NetworkPolicy
를 배포합니다.
다음 매니페스트는 허용 대상 2개를 사용해서 라벨이 app=foo
인 포드 객체에서 이그레스 트래픽을 제어하는 NetworkPolicy
를 지정합니다.
- 라벨이
app=hello
인 동일 네임스페이스에 있는 포드 객체 - 포트 53의 내부 또는 외부 엔드포인트(UDP 및 TCP)
이 정책을 클러스터에 적용합니다.
kubectl apply -f foo-allow-to-hello.yaml
이그레스 정책 검증
hello-web-2
라는 새 웹 애플리케이션을 배포하고 이를 클러스터에서 내부적으로 노출합니다.kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
app=foo
라벨로 임시 포드를 실행하고 포드가hello-web:8080
에 연결을 설정할 수 있는지 검증합니다.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
포드가 요청에 응답합니다.
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
포드가
hello-web-2:8080
에 연결을 설정할 수 없는지 검증합니다.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080
출력에서 연결이 응답을 수신하지 않는지 확인합니다.
wget: download timed out
포드가
www.example.com
과 같은 외부 웹 사이트에 연결을 설정할 수 없는지 확인합니다.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.com
출력에서 연결이 응답을 수신하지 않는지 확인합니다.
wget: download timed out
삭제
이 튜토리얼에서 만든 리소스를 삭제하려면 다음 명령어를 실행합니다.
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
다음 단계
- Kubernetes 네트워크 정책 문서
- 네트워크 정책 로깅을 사용하여 클러스터의 네트워크 정책에 따라 포드 객체 연결이 허용되거나 거부되는 시점을 기록합니다.