24.4. ovnkube-trace를 사용하여 Openflow 추적
OVN 및 OVS 트래픽 흐름은 ovnkube-trace
라는 단일 유틸리티로 시뮬레이션할 수 있습니다. ovnkube-trace
유틸리티는 ovn-trace
,ovs-appctl ofproto/trace
및 ovn-detrace
를 실행하고 해당 정보를 단일 출력에서 연관시킵니다.
전용 컨테이너에서 ovnkube-trace
바이너리를 실행할 수 있습니다. OpenShift Container Platform 4.7 이후 릴리스의 경우 바이너리를 로컬 호스트에 복사하고 해당 호스트에서 실행할 수도 있습니다.
Quay 이미지의 바이너리는 현재 듀얼 IP 스택 또는 IPv6 전용 환경에서 작동하지 않습니다. 이러한 환경의 경우 소스에서 빌드해야 합니다.
24.4.1. 로컬 호스트에 ovnkube-trace 설치
ovnkube-trace
툴은 OVN-Kubernetes 구동 OpenShift Container Platform 클러스터의 포인트 간 임의의 UDP 또는 TCP 트래픽의 패킷 시뮬레이션을 추적합니다. ovnkube-trace
바이너리를 로컬 호스트에 복사하여 클러스터에 대해 실행할 수 있도록 합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다.
프로세스
다음 명령을 사용하여 pod 변수를 생성합니다.
$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-master -o name | head -1 | awk -F '/' '{print $NF}')
로컬 호스트에서 다음 명령을 실행하여
ovnkube-master
Pod에서 바이너리를 복사합니다.$ oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace ovnkube-trace
다음 명령을 실행하여
ovnkube-trace
를 실행할 수 있도록 설정합니다.$ chmod +x ovnkube-trace
다음 명령을 실행하여
ovnkube-trace
에서 사용 가능한 옵션을 표시합니다.$ ./ovnkube-trace -help
예상 출력
I0111 15:05:27.973305 204872 ovs.go:90] Maximum command line arguments set to: 191102 Usage of ./ovnkube-trace: -dst string dest: destination pod name -dst-ip string destination IP address (meant for tests to external targets) -dst-namespace string k8s namespace of dest pod (default "default") -dst-port string dst-port: destination port (default "80") -kubeconfig string absolute path to the kubeconfig file -loglevel string loglevel: klog level (default "0") -ovn-config-namespace string namespace used by ovn-config itself -service string service: destination service name -skip-detrace skip ovn-detrace command -src string src: source pod name -src-namespace string k8s namespace of source pod (default "default") -tcp use tcp transport protocol -udp use udp transport protocol
지원되는 명령줄 인수는 네임스페이스, 포드, 서비스와 같은 친숙한 Kubernetes 구조이므로 MAC 주소, 대상 노드의 IP 주소 또는 ICMP 유형을 찾을 필요가 없습니다.
로그 수준은 다음과 같습니다.
- 0 (최소 출력)
- 2 ( 추적 명령 결과를 보여주는 더 자세한 출력)
- 5 (디버그 출력)
24.4.2. ovnkube-trace 실행
ovn-trace
를 실행하여 OVN 논리 네트워크 내에서 패킷 전달을 시뮬레이션합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. -
로컬 호스트에
ovnkube-trace
가 설치되어 있어야 합니다.
예: 배포된 Pod에서 DNS 확인이 작동하는지 테스트
이 예에서는 배포된 포드에서 클러스터에서 실행되는 코어 DNS Pod로 DNS 확인을 테스트하는 방법을 보여줍니다.
프로세스
다음 명령을 입력하여 default 네임스페이스에서 웹 서비스를 시작합니다.
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
openshift-dns
네임스페이스에서 실행 중인 Pod를 나열합니다.oc get pods -n openshift-dns
출력 예
NAME READY STATUS RESTARTS AGE dns-default-467qw 2/2 Running 0 49m dns-default-6prvx 2/2 Running 0 53m dns-default-fkqr8 2/2 Running 0 53m dns-default-qv2rg 2/2 Running 0 49m dns-default-s29vr 2/2 Running 0 49m dns-default-vdsbn 2/2 Running 0 53m node-resolver-6thtt 1/1 Running 0 53m node-resolver-7ksdn 1/1 Running 0 49m node-resolver-8sthh 1/1 Running 0 53m node-resolver-c5ksw 1/1 Running 0 50m node-resolver-gbvdp 1/1 Running 0 53m node-resolver-sxhkd 1/1 Running 0 50m
다음
ovn-kube-trace
명령을 실행하여 DNS 확인이 작동하는지 확인합니다.$ ./ovnkube-trace \ -src-namespace default \ 1 -src web \ 2 -dst-namespace openshift-dns \ 3 -dst dns-default-467qw \ 4 -udp -dst-port 53 \ 5 -loglevel 0 6
예상 출력
I0116 10:19:35.601303 17900 ovs.go:90] Maximum command line arguments set to: 191102 ovn-trace source pod to destination pod indicates success from web to dns-default-467qw ovn-trace destination pod to source pod indicates success from dns-default-467qw to web ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-467qw ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-467qw to web ovn-detrace source pod to destination pod indicates success from web to dns-default-467qw ovn-detrace destination pod to source pod indicates success from dns-default-467qw to web
ou nameserver는 배포된 포드에서 DNS 포트로의 성공을 나타내며, 다른 방향으로도 성공적으로 진행되었음을 나타냅니다. 따라서 내 웹 Pod가 코어 DNS에서 dns 확인을 수행하려는 경우 UDP 포트 53에서 양방향 트래픽이 지원됩니다.
예를 들어 작동하지 않았으며 ovn-trace
, ovs-appctl ofproto/trace
및 ovn-detrace
를 가져오고자 하는 경우 더 많은 디버그 유형 정보가 2로 증가한 후 다음과 같이 명령을 다시 실행합니다.
$ ./ovnkube-trace \ -src-namespace default \ -src web \ -dst-namespace openshift-dns \ -dst dns-default-467qw \ -udp -dst-port 53 \ -loglevel 2
이 증가한 로그 수준의 출력은 여기에 나열하기에 너무 많습니다. 실패 상황에서 이 명령의 출력은 해당 트래픽을 삭제하는 흐름을 보여줍니다.
예: 디버그 출력을 사용하여 구성된 기본 거부 확인
이 예제에서는 Ingress 기본 거부 정책에서 트래픽을 차단하는 디버그 출력을 사용하여 식별할 수 있는 방법을 보여줍니다.
프로세스
모든 네임스페이스의 모든 Pod의 수신을
거부하는 거부별
정책을 정의하는 다음 YAML을 생성합니다.deny-by-default.yaml
파일에 YAML을 저장합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: default spec: podSelector: {} ingress: []
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f deny-by-default.yaml
출력 예
networkpolicy.networking.k8s.io/deny-by-default created
다음 명령을 입력하여
default
네임스페이스에서 웹 서비스를 시작합니다.$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
다음 명령을 실행하여
prod
네임스페이스를 생성합니다.$ oc create namespace prod
다음 명령을 실행하여
prod
네임스페이스에 레이블을 지정합니다.$ oc label namespace/prod purpose=production
다음 명령을 실행하여
prod
네임스페이스에l
pine 이미지를 배포하고 쉘을 시작합니다.$ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
- 다른 터미널 세션을 엽니다.
이 새 터미널 세션에서
ovn-trace
를 실행하여기본
네임스페이스에서 실행되는 네임스페이스prod
및 대상 Pod에서 실행되는 소스 Podtest-6459
간 통신 실패를 확인합니다.$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 0
예상 출력
I0116 14:20:47.380775 50822 ovs.go:90] Maximum command line arguments set to: 191102 ovn-trace source pod to destination pod indicates failure from test-6459 to web
다음 명령을 실행하여 실패 이유를 노출하려면 로그 수준을 2로 늘립니다.
$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 2
예상 출력
ct_lb_mark /* default (use --ct to customize) */ ------------------------------------------------ 3. ls_out_acl_hint (northd.c:6092): !ct.new && ct.est && !ct.rpl && ct_mark.blocked == 0, priority 4, uuid 32d45ad4 reg0[8] = 1; reg0[10] = 1; next; 4. ls_out_acl (northd.c:6435): reg0[10] == 1 && (outport == @a16982411286042166782_ingressDefaultDeny), priority 2000, uuid f730a887 1 ct_commit { ct_mark.blocked = 1; };
- 1
- 기본 거부 정책이 설정되어 있기 때문에 Ingress 트래픽이 차단됩니다.
특정 네임스페이스의 모든 Pod에서 레이블
purpose=production
을 사용하여 트래픽을 허용하는 정책을 생성합니다.web-allow-prod.yaml
파일에 YAML을 저장합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod namespace: default spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-prod.yaml
ovnkube-trace
를 실행하여 다음 명령을 입력하여 트래픽이 허용되는지 확인합니다.$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 0
예상 출력
I0116 14:25:44.055207 51695 ovs.go:90] Maximum command line arguments set to: 191102 ovn-trace source pod to destination pod indicates success from test-6459 to web ovn-trace destination pod to source pod indicates success from web to test-6459 ovs-appctl ofproto/trace source pod to destination pod indicates success from test-6459 to web ovs-appctl ofproto/trace destination pod to source pod indicates success from web to test-6459 ovn-detrace source pod to destination pod indicates success from test-6459 to web ovn-detrace destination pod to source pod indicates success from web to test-6459
열린 쉘에서 다음 명령을 실행합니다.
wget -qO- --timeout=2 http://web.default
예상 출력
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>