13.2. 리디렉션 모드에서 송신 라우터 배포
송신 라우터 pod를 배포하여 자체 예약된 소스 IP 주소에서 하나 이상의 대상 IP 주소로 트래픽을 리디렉션할 수 있습니다.
송신 라우터 pod를 추가한 후 예약된 소스 IP 주소를 사용해야 하는 클라이언트 pod는 대상 IP에 직접 연결하는 대신 송신 라우터에 연결하도록 수정해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
프로세스
- 송신 라우터 정의를 생성합니다.
다른 포드에서 송신 라우터 pod의 IP 주소를 찾을 수 있도록 하려면 다음 예제와 같이 송신 라우터를 사용하는 서비스를 만듭니다.
apiVersion: v1 kind: Service metadata: name: egress-1 spec: ports: - name: web-app protocol: TCP port: 8080 type: ClusterIP selector: app: egress-router-cni1 - 1
- 송신 라우터의 레이블을 지정합니다. 표시된 값은 Cluster Network Operator에서 추가하며 구성 불가능합니다.
서비스를 생성한 후 포드가 서비스에 연결할 수 있습니다. 송신 라우터 pod는 트래픽을 대상 IP 주소의 해당 포트로 리디렉션합니다. 이 연결은 예약된 소스 IP 주소에서 시작됩니다.
검증
Cluster Network Operator가 송신 라우터를 시작했는지 확인하려면 다음 절차를 완료합니다.
송신 라우터에 대해 Operator가 생성한 네트워크 연결 정의를 확인합니다.
$ oc get network-attachment-definition egress-router-cni-nad네트워크 연결 정의의 이름은 구성할 수 없습니다.
출력 예
NAME AGE egress-router-cni-nad 18m송신 라우터 pod에 대한 배포를 확인합니다.
$ oc get deployment egress-router-cni-deployment배포 이름은 구성할 수 없습니다.
출력 예
NAME READY UP-TO-DATE AVAILABLE AGE egress-router-cni-deployment 1/1 1 1 18m송신 라우터 pod의 상태를 확인합니다.
$ oc get pods -l app=egress-router-cni출력 예
NAME READY STATUS RESTARTS AGE egress-router-cni-deployment-575465c75c-qkq6m 1/1 Running 0 18m- 송신 라우터 pod의 로그 및 라우팅 테이블을 확인합니다.
송신 라우터 pod에 대한 노드 이름을 가져옵니다.
$ POD_NODENAME=$(oc get pod -l app=egress-router-cni -o jsonpath="{.items[0].spec.nodeName}")대상 노드에서 디버그 세션으로 들어갑니다. 이 단계는
<node_name>-debug라는 디버그 Pod를 인스턴스화합니다.$ oc debug node/$POD_NODENAME디버그 쉘 내에서
/host를 root 디렉터리로 설정합니다. 디버그 Pod는 Pod 내의/host에 호스트의 루트 파일 시스템을 마운트합니다. 루트 디렉터리를/host로 변경하면 호스트의 실행 경로에서 바이너리를 실행할 수 있습니다.# chroot /hostchroot환경 콘솔에서 송신 라우터 로그를 표시합니다.# cat /tmp/egress-router-log출력 예
2021-04-26T12:27:20Z [debug] Called CNI ADD 2021-04-26T12:27:20Z [debug] Gateway: 192.168.12.1 2021-04-26T12:27:20Z [debug] IP Source Addresses: [192.168.12.99/24] 2021-04-26T12:27:20Z [debug] IP Destinations: [80 UDP 10.0.0.99/30 8080 TCP 203.0.113.26/30 80 8443 TCP 203.0.113.27/30 443] 2021-04-26T12:27:20Z [debug] Created macvlan interface 2021-04-26T12:27:20Z [debug] Renamed macvlan to "net1" 2021-04-26T12:27:20Z [debug] Adding route to gateway 192.168.12.1 on macvlan interface 2021-04-26T12:27:20Z [debug] deleted default route {Ifindex: 3 Dst: <nil> Src: <nil> Gw: 10.128.10.1 Flags: [] Table: 254} 2021-04-26T12:27:20Z [debug] Added new default route with gateway 192.168.12.1 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p UDP --dport 80 -j DNAT --to-destination 10.0.0.99 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8080 -j DNAT --to-destination 203.0.113.26:80 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8443 -j DNAT --to-destination 203.0.113.27:443 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat -o net1 -j SNAT --to-source 192.168.12.99로깅 파일 위치 및 로깅 수준은 이 프로세스에 설명된 대로
EgressRouter오브젝트를 생성하여 송신 라우터를 시작할 때 구성되지 않습니다.chroot환경 콘솔에서 컨테이너 ID를 가져옵니다.# crictl ps --name egress-router-cni-pod | awk '{print $1}'출력 예
CONTAINER bac9fae69ddb6컨테이너의 프로세스 ID를 확인합니다. 이 예에서 컨테이너 ID는
bac9fae69ddb6입니다.# crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'출력 예
68857컨테이너의 네트워크 네임스페이스를 입력합니다.
# nsenter -n -t 68857라우팅 테이블을 표시합니다.
# ip route다음 예제 출력에서
net1네트워크 인터페이스가 기본 경로입니다. 클러스터 네트워크의 트래픽은eth0네트워크 인터페이스를 사용합니다.192.168.12.0/24네트워크의 트래픽은net1네트워크 인터페이스를 사용하며 예약된 소스 IP 주소192.168.12.99에서 시작됩니다. 포드는 다른 모든 트래픽을 IP 주소192.168.12.1의 게이트웨이로 라우팅합니다. 서비스 네트워크의 라우팅이 표시되지 않습니다.출력 예
default via 192.168.12.1 dev net1 10.128.10.0/23 dev eth0 proto kernel scope link src 10.128.10.18 192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99 192.168.12.1 dev net1