본문 바로가기
Openstack

openstack instance and kubernetes pod communication using ovs

 openstack helm으로 구성된 openstack과 kubernetes  pod네트워크를 간단하게 표현하였다. 각 worker노드 (compute)에는 instance와 pod들이 있으며 pod는 calico와 같은 cni를 이용하여 별도의 네트워크를 통하여 다른 pod들 간의 네트워크가 연결되며 필요한 경우 외부와 통신한다. 반면, instance는 provider network를 사용하지 않고 vxlan , vlan 등과 같이 tenant network로 구성할 경우 해당 instance에 있는 tunnel interface로 다른 instance들 간의 통신을 할 것이고 외부로 통신하기 위해서는 qrouter가 있는 호스트를 거쳐 통신하게 된다. 즉, pod와 instance 간의 통신은 외부 l3를 거쳐서만 가능한 구조이다.

 

아래의 방법은 openstack상에서 neutron을 이용하여 port를 생성하고 해당 port를 worker노드에 ovs 브릿지인 br-int에 연결하여 instance와 pod가 통신하는 방법에 대하여 이야기하려고 한다.

 

openstack 에는 사전에  selfservice 이름의 vxlan를 사용하는 tenant network가 있으며, 20.20.1.0/24 대역대로 할당되어 사용 중이다.

[root@cy-deploy ~]# openstack network list -c Name
+-------------+
| Name        |
+-------------+
| selfservice |
| lb-mgmt-net |
| provider    |
+-------------+
[root@cy-deploy ~]# openstack subnet list -c Subnet -c  Name
+----------------+----------------+
| Name           | Subnet         |
+----------------+----------------+
| lb-mgmt-subnet | 172.31.0.0/24  |
| selfservice    | 20.20.1.0/24   |
| provider       | 192.168.0.0/16 |
+----------------+----------------+

 

worker 노드에 neutron에서 관리되는 port에서 사용할 security group을  생성한다.

[root@cy-deploy ~]# openstack security group create con-pod
[root@cy-deploy ~]# openstack   security group rule create --ingress --protocol icmp  con-pod
[root@cy-deploy ~]# openstack   security group rule create --ingress --protocol  tcp  con-pod
[root@cy-deploy ~]# openstack   security group rule create --ingress --protocol  udp  con-pod

 

아래와 같이 3개의 worker노드가 있으며, 이중 각각 호스트 이름으로 포트를 생성해야 한다.

[root@cy-deploy ~]# kubectl  get node
NAME                STATUS   ROLES    AGE     VERSION
cy-master001   Ready    master   2d21h   v1.16.8
cy-master002   Ready    master   2d21h   v1.16.8
cy-master003   Ready    master   2d21h   v1.16.8
cy-worker001   Ready    <none>   2d21h   v1.16.8
cy-worker002   Ready    <none>   2d21h   v1.16.8
cy-worker003   Ready    <none>   2d21h   v1.16.8

 

테스트를 위하여 cy-worker003 노드에서 사용할 port만 생성한다. 그리고, 출력된 port의 id를 이용하여 생성된 port의 mac주소와 ip를 확인한다.

[root@cy-deploy ~]# openstack port create --security-group con-pod  --host=cy-worker003  -c id -f value --network selfservice  20.20.20.33 selfservice-port-worker003
400ecd69-fe9c-418f-985f-27798f2c4afb
[root@cy-deploy ~]# openstack port show 400ecd69-fe9c-418f-985f-27798f2c4afb -c fixed_ips -c mac_address
+-------------+--------------------------------------------------------------------------+
| Field       | Value                                                                    |
+-------------+--------------------------------------------------------------------------+
| fixed_ips   | ip_address='20.20.1.5', subnet_id='c24ebd33-dacf-48ab-95da-c01514aeb703' |
| mac_address | fa:16:3e:e8:f5:92                                                        |
+-------------+--------------------------------------------------------------------------+

이제 worker003 노드에서 ovs-vsctl명령을 이용하여 br-int에 위에서 생성한 포트의 mac주소로 o-cy0 포트를 추가해준다.

[root@cy-worker003 ~]# ovs-vsctl -- --may-exist add-port br-int o-cy0 \
-- set Interface o-cy0 type=internal \
-- set Interface o-cy0 external-ids:iface-status=active \
-- set Interface o-cy0 external-ids:attached-mac=fa:16:3e:e8:f5:92   \
-- set Interface o-cy0 external-ids:iface-id=400ecd69-fe9c-418f-985f-27798f2c4afb \
-- set Interface o-cy0 external-ids:skip_cleanup=true

[root@cy-worker003 ~]# ovs-vsctl show
...
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        Port "tap61c0d965-c7"
            tag: 5
            Interface "tap61c0d965-c7"
        Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}
        Port "o-cy0"
            tag: 6
            Interface "o-cy0"
                type: internal
        Port patch-tun
...

인스턴스의  mac 주소를 이용하여 neutron dhcp를 이용하여 ip를 할당받는 것처럼 동일하게 노드에 mac주소를 설정한 뒤 dhcp를 통하여 생성하였던 port의 ip를 할당받는다.

[root@cy-worker003 ~]# ip link set dev o-cy0 address fa:16:3e:e8:f5:92 
[root@cy-worker003 ~]#  cat > /tmp/dhclient.conf <<EOF
request subnet-mask,broadcast-address,interface-mtu;
do-forward-updates false;
EOF

[root@cy-worker003 ~]#  dhclient -v o-cy0 -cf /tmp/dhclient.conf

[root@cy-worker003 ~]# ifconfig  o-cy0
o-cy0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 20.20.1.5  netmask 255.255.255.0  broadcast 20.20.1.255
        inet6 fe80::c06a:dfff:febd:e3a  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:e8:f5:92  txqueuelen 1000  (Ethernet)
        RX packets 235  bytes 13132 (12.8 KiB)
        RX errors 0  dropped 194  overruns 0  frame 0
        TX packets 24  bytes 5228 (5.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@cy-worker003 ~]# route -n | grep 20.20.1
20.20.1.0       0.0.0.0         255.255.255.0   U     0      0        0 o-cy0

tenant network로 worker노드에서 직접 통신되는 것을 확인할 수 있다.

[root@cy-deploy ~]# openstack server list
+--------------------------------------+----------------------------------------------+--------+---------------------------------------------------+---------------+------------+
| ID                                   | Name                                         | Status | Networks                                          | Image         | Flavor     |
+--------------------------------------+----------------------------------------------+--------+---------------------------------------------------+---------------+------------+
| 04a1aab6-6a82-499d-8f90-6a83a35950f0 | amphora-554d99a8-a174-497e-8acd-417694f03ce8 | ACTIVE | lb-mgmt-net=172.31.0.140; selfservice=20.20.1.201 | amphora-image | m1.amphora |
| de46b5fb-15b8-462a-bc6c-4c856d6ff876 | amphora-f019bdd5-25b3-47d1-ab85-bdabe10847a7 | ACTIVE | lb-mgmt-net=172.31.0.173; selfservice=20.20.1.100 | amphora-image | m1.amphora |
| 6d23325f-0cb4-478d-b077-9735c9a97f99 | cirros-test002                               | ACTIVE | selfservice=20.20.1.152, 192.168.202.223          | cirros        | m1.tiny    |
| 7016e44b-7d02-49cd-9bec-c07826f80e78 | cirros-test001                               | ACTIVE | selfservice=20.20.1.98, 192.168.202.214           | cirros        | m1.tiny    |
+--------------------------------------+----------------------------------------------+--------+---------------------------------------------------+---------------+------------+


[root@cy-worker003 ~]# ping -c 3 20.20.1.98
PING 20.20.1.98 (20.20.1.98) 56(84) bytes of data.
64 bytes from 20.20.1.98: icmp_seq=1 ttl=64 time=4.55 ms
64 bytes from 20.20.1.98: icmp_seq=2 ttl=64 time=2.06 ms
64 bytes from 20.20.1.98: icmp_seq=3 ttl=64 time=1.19 ms

--- 20.20.1.98 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.194/2.604/4.555/1.425 ms
[root@cy-worker003 ~]#

생성한 port의 상태가 active로 변경된 것을 확인할 수 있다.

[root@cy-deploy ~]# openstack port show 400ecd69-fe9c-418f-985f-27798f2c4afb -c status
+--------+--------+ㅅ
| Field  | Value  |
+--------+--------+
| status | ACTIVE |
+--------+--------+

이제 해당 노드에 있는 pod에서 vm으로 ping test를 진행한다.

[root@cy-deploy ~]# kubectl  get pod -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP              NODE                NOMINATED NODE   READINESS GATES
test-j64nr   1/1     Running   0          15s   10.234.52.2     cy-worker001   <none>           <none>
test-lqqwq   1/1     Running   0          15s   10.234.44.2     cy-worker003   <none>           <none>
test-mnqwk   1/1     Running   0          15s   10.234.58.171   cy-master002   <none>           <none>
test-qb5cw   1/1     Running   0          15s   10.234.49.2     cy-worker002   <none>           <none>
test-x54fp   1/1     Running   0          15s   10.234.8.244    cy-master003   <none>           <none>
test-xz669   1/1     Running   0          15s   10.234.33.231   cy-master001   <none>           <none>
[root@cy-deploy ~]# kubectl  exec -it test-lqqwq -- ping -c 3 20.20.1.98
PING 20.20.1.98 (20.20.1.98): 56 data bytes
64 bytes from 20.20.1.98: seq=0 ttl=63 time=4.871 ms
64 bytes from 20.20.1.98: seq=1 ttl=63 time=2.247 ms
64 bytes from 20.20.1.98: seq=2 ttl=63 time=1.692 ms

물론, 해당 인터페이스가 설정 안 된 노드에서는 통신이 안된다.

[root@cy-deploy ~]# kubectl  exec -it test-j64nr -- ping -c 3 20.20.1.98
PING 20.20.1.98 (20.20.1.98): 56 data bytes​
반응형