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
'Openstack' 카테고리의 다른 글
Podman 기반 Opensatck 구성 [2] (Keystone KeyCloak OpenID Connector 구성 ) (0) | 2024.02.17 |
---|---|
Podman 기반 Opensatck 구성 [1] (Kolla-ansible Bobcat/Cephadm Ceph) (0) | 2024.02.17 |
openstack helm을 이용한 kubernetes환경에서 openstack 배포 (0) | 2020.08.02 |
DVR packet flow(FIP:North-south) (0) | 2018.12.01 |
Ansible Cloud(openstack) 모듈을 이용한 볼륨/인스턴스 생성 (0) | 2018.10.21 |