23.4. ovnkube-trace を使用した Openflow のトレース
OVN と OVS のトラフィックフローは、ovnkube-trace という単一のユーティリティーでシミュレートできます。ovnkube-trace ユーティリティーは、ovn-trace、ovs-appctl ofproto/trace、および ovn-detrace を実行し、その情報を 1 つの出力に関連付けます。
専用コンテナーから ovnkube-trace バイナリーを実行できます。OpenShift Container Platform 4.7 以降のリリースでは、バイナリーをローカルホストにコピーして、そのホストから実行することもできます。
現在、Quay イメージのバイナリーは、デュアル IP スタックまたは IPv6 のみの環境では機能しません。これらの環境では、ソースからビルドする必要があります。
23.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}')$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-master -o name | head -1 | awk -F '/' '{print $NF}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow ローカルホストで次のコマンドを実行して、
ovnkube-masterPod からバイナリーをコピーします。oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace ovnkube-trace
$ oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace ovnkube-traceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
ovnkube-traceを実行可能にします。chmod +x ovnkube-trace
$ chmod +x ovnkube-traceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
ovnkube-traceで使用可能なオプションを表示します。./ovnkube-trace -help
$ ./ovnkube-trace -helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サポートされているコマンドライン引数は、namespace、Pod、サービスなど、よく知られた Kubernetes コンストラクトであるため、MAC アドレス、宛先ノードの IP アドレス、または ICMP タイプを見つける必要はありません。
ログレベルは次のとおりです。
- 0 (最小出力)
- 2 (トレースコマンドの結果を示すより詳細な出力)
- 5 (デバッグ出力)
23.4.2. ovnkube-trace の実行 リンクのコピーリンクがクリップボードにコピーされました!
ovn-trace を実行して、OVN 論理ネットワーク内のパケット転送をシミュレートします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 -
ローカルホストに
ovnkube-traceがインストールされている。
例: デプロイされた Pod からの DNS 解決が機能することをテストする
この例は、デプロイされた Pod からクラスターで実行されるコア DNS Pod への DNS 解決をテストする方法を示しています。
手順
次のコマンドを入力して、default namespace で Web サービスを開始します。
oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80Copy to Clipboard Copied! Toggle word wrap Toggle overflow openshift-dnsnamespace で実行されている Pod を一覧表示します。oc get pods -n openshift-dns
oc get pods -n openshift-dnsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
ovn-kube-traceコマンドを実行して、DNS 解決が機能していることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力は、デプロイされた Pod から DNS ポートへの解決が成功し、その反対方向への解決も成功したことを示しています。つまり、Web Pod がコア DNS からの DNS 解決を行う場合に、UDP ポート 53 で双方向のトラフィックがサポートされていることがわかります。
たとえば、これが機能せず、ovn-trace、ovs-appctl ofproto/trace と ovn-detrace、およびその他のデバッグタイプ情報を取得したい場合は、ログレベルを 2 に上げて、次のようにコマンドを再度実行します。
このログレベルの出力は多すぎるため、ここにはリストできません。障害状況では、このコマンドの出力は、どのフローがそのトラフィックを破棄しているかを示します。たとえば、Egress または Ingress ネットワークポリシーが、そのトラフィックを許可しないクラスターで設定されている場合などがあります。
例: デバッグ出力を使用して設定済みのデフォルトの拒否を確認する
この例は、デバッグ出力を使用して、デフォルトの Ingress 拒否ポリシーがトラフィックをブロックしていることを特定する方法を示しています。
手順
すべての namespace におけるすべての Pod からの Ingress を拒否する
deny-by-defaultポリシーを定義する次の YAML を作成します。YAML をdeny-by-default.yamlファイルに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、ポリシーを適用します。
oc apply -f deny-by-default.yaml
$ oc apply -f deny-by-default.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
networkpolicy.networking.k8s.io/deny-by-default created
networkpolicy.networking.k8s.io/deny-by-default createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、
defaultnamespace で Web サービスを開始します。oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
prodnamespace を作成します。oc create namespace prod
$ oc create namespace prodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
prodnamespace にラベルを付けます。oc label namespace/prod purpose=production
$ oc label namespace/prod purpose=productionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
alpineイメージをprodnamespace にデプロイし、シェルを開始します。oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
$ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- shCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 別のターミナルセッションを開きます。
この新しいターミナルセッションで
ovn-traceを実行して、namespaceprodで実行されているソース Podtest-6459とdefaultnamespace で実行されている宛先 Pod 間の通信の失敗を確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
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
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 webCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ログレベルを 2 に上げて、失敗の理由を明らかにします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- デフォルトの拒否ポリシーが設定されているため、ingress トラフィックがブロックされています。
ラベルが
Purpose=productionの特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML をweb-allow-prod.yamlファイルに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、ポリシーを適用します。
oc apply -f web-allow-prod.yaml
$ oc apply -f web-allow-prod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、
ovnkube-traceを実行し、トラフィックが許可されていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 開いているシェルで次のコマンドを実行します。
wget -qO- --timeout=2 http://web.default
wget -qO- --timeout=2 http://web.defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow