Kết nối mạng trong Virtual Kubelet (Openstack Zun)

Giới thiệu

Như đã nói trong bài viết trước, các pods (capsule) được tạo K8S tạo trên Virtual Kubelet không sử dụng mạng của K8S mà sử dụng mạng của Neutron với project được khai báo biến môi trường.

Thế nên, những pod (capsule) đó hoàn toàn có thể kết nối mạng với các VM được tạo bởi Openstack.

Thế nhưng như ta đã biết, ta cũng cần phải có node kubernetes master để schedule vào VK. Vậy trong trường hợp ta muốn sử dụng hệ thống mà pod vừa được tạo trên node K8S, vừa được tạo trên VK (node Compute Openstack), ta sẽ cần thêm hỗ trợ từ Kuryr-Kubernetes (https://docs.openstack.org/kuryr-kubernetes/latest/)

Kuryr-Kubernetes

Kuryr-kubernetes cho phép cụm K8S sử dụng mạng của Neutron, từ đó các pod có thể thông mạng với VM và các capsule.

Cài đặt: https://docs.openstack.org/kuryr-kubernetes/latest/installation/index.html

Để thử nghiệm ta labs sử dụng mô hình như sau:

Mô hình

demo

Mô tả:

VM/Pod gắn vào mạng nào thì sử dụng mạng đó.

VM/Pod đứng cùng hàng dọc với node nào thì được tạo trên node đó.

Nét liền là mạng vật lý.

Nét đứt là mạng tạo bởi neutron.

Các trường hợp labs

Ta có sử dụng 4 trường hợp kết nối sau:

  • VM (node2) và pod_VK(node1)

  • pod_VK(node1) và pod_VK(node2)

  • pod_kubelet và VM

  • pod_VK và pod_kubelợp

Kết nối 2 pod VK trên 2 node compute khác nhau

Ta triển khai 2 pod_VK trên 2 node compute.

Pod_VK được tạo bởi containerd chứ không phải docker thế nên cần cri-tools để truy cập được vào pod.

cri-tools: https://github.com/kubernetes-sigs/cri-tools

Đồng thời từ node pod ở node này ta ping thử sang pod ở node còn lại

root@worker1:~# crictl -r unix:///var/run/containerd/containerd.sock ps
CONTAINER           IMAGE               CREATED             STATE               NAME                                                                      ATTEMPT             POD ID
ca91b2afea795       nginx:1.14.2        31 minutes ago      Running             capsule-default-nginx-deployment-virtual-admin-77cf5845f5-mq59d-zeta-11   0                   e9ba6b9769a3a
root@worker1:~# crictl -r unix:///var/run/containerd/containerd.sock exec -it ca91b2afea795 sh
# ping ^C
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.10.10.56  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::f816:3eff:fea7:cd10  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:a7:cd:10  txqueuelen 1000  (Ethernet)
        RX packets 16305  bytes 27046669 (25.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9296  bytes 634907 (620.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ping 10.10.10.27
PING 10.10.10.27 (10.10.10.27) 56(84) bytes of data.
64 bytes from 10.10.10.27: icmp_seq=1 ttl=64 time=16.5 ms
64 bytes from 10.10.10.27: icmp_seq=2 ttl=64 time=1.38 ms
64 bytes from 10.10.10.27: icmp_seq=3 ttl=64 time=1.98 ms
64 bytes from 10.10.10.27: icmp_seq=4 ttl=64 time=1.03 ms
^C
--- 10.10.10.27 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.038/5.245/16.573/6.549 ms
root@worker2:~# crictl -r unix:///var/run/containerd/containerd.sock ps
CONTAINER           IMAGE               CREATED             STATE               NAME                                                                      ATTEMPT             POD ID
7a296ffcf7ee6       nginx:1.14.2        41 minutes ago      Running             capsule-default-nginx-deployment-virtual-slef-77cf5845f5-kmrg8-theta-20   0                   2e9d3b1ffe1df
root@worker2:~# crictl -r unix:///var/run/containerd/containerd.sock exec -it 7a296ffcf7ee6 sh
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.10.10.27  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::f816:3eff:feba:2965  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:ba:29:65  txqueuelen 1000  (Ethernet)
        RX packets 17151  bytes 27108767 (25.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9415  bytes 643452 (628.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ping 10.10.10.56
PING 10.10.10.56 (10.10.10.56) 56(84) bytes of data.
64 bytes from 10.10.10.56: icmp_seq=1 ttl=64 time=2.60 ms
64 bytes from 10.10.10.56: icmp_seq=2 ttl=64 time=1.01 ms
64 bytes from 10.10.10.56: icmp_seq=3 ttl=64 time=0.985 ms
64 bytes from 10.10.10.56: icmp_seq=4 ttl=64 time=1.16 ms
c^C
--- 10.10.10.56 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.985/1.442/2.607/0.676 ms
#

Ta có thể thấy cả 2 chiều đều thông mạng với nhau.

Kết nối giữa pod VK và VM trên 2 node compute khác nhau

Ta sang node compute2 console vào VM vừa tạo và ping thử đến pod ở node compute1.

root@worker2:~# virsh console instance-00000006
Connected to domain instance-00000006
Escape character is ^]

login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
selfservice-instance2c login: cirros
Password:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
$ ping 10.10.10.56
PING 10.10.10.56 (10.10.10.56): 56 data bytes
64 bytes from 10.10.10.56: seq=0 ttl=64 time=3.432 ms
64 bytes from 10.10.10.56: seq=1 ttl=64 time=0.831 ms
64 bytes from 10.10.10.56: seq=2 ttl=64 time=1.151 ms
64 bytes from 10.10.10.56: seq=3 ttl=64 time=1.970 ms
^C
--- 10.10.10.56 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.831/1.846/3.432 ms
$ ifconfig
eth0      Link encap:Ethernet  HWaddr FA:16:3E:D2:28:E5  
          inet addr:10.10.10.245  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::f816:3eff:fed2:28e5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:276 errors:0 dropped:0 overruns:0 frame:0
          TX packets:139 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23530 (22.9 KiB)  TX bytes:13196 (12.8 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

$

Ở pod trong node compute1 ta cũng ping thử lại với VM ở node compute2

# ping 10.10.10.245
PING 10.10.10.245 (10.10.10.245) 56(84) bytes of data.
64 bytes from 10.10.10.245: icmp_seq=1 ttl=64 time=2.16 ms
64 bytes from 10.10.10.245: icmp_seq=2 ttl=64 time=0.965 ms
64 bytes from 10.10.10.245: icmp_seq=3 ttl=64 time=1.14 ms
64 bytes from 10.10.10.245: icmp_seq=4 ttl=64 time=1.93 ms
^C
--- 10.10.10.245 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.965/1.552/2.167/0.510 ms
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.10.10.56  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::f816:3eff:fea7:cd10  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:a7:cd:10  txqueuelen 1000  (Ethernet)
        RX packets 16331  bytes 27048713 (25.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9322  bytes 636951 (622.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ta có thể thấy giữa VM và pod cũng thông mạng với nhau.

Kết nối giữa pod-kubelet và VM

Với kuryr-kubernetes, ta có thể cho pod sử dụng cùng mạng với mạng được tạo bởi openstack neutron.

Ta thử ping đến pod từ VM

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:5c:0e:b1 brd ff:ff:ff:ff:ff:ff
    inet 10.1.3.117/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe5c:eb1/64 scope link
       valid_lft forever preferred_lft forever
$ ping 10.1.2.67
PING 10.1.2.67 (10.1.2.67): 56 data bytes
64 bytes from 10.1.2.67: seq=0 ttl=64 time=4.967 ms
64 bytes from 10.1.2.67: seq=1 ttl=64 time=1.675 ms
64 bytes from 10.1.2.67: seq=2 ttl=64 time=1.086 ms
64 bytes from 10.1.2.67: seq=3 ttl=64 time=2.049 ms
^C
--- 10.1.2.67 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 1.086/2.444/4.967 ms

Ta tạo 1 pod mới sử dụng image cirros

root@k8s-master:~# kubectl get pod -o wide
NAME                                             READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
cirros-deployment-worker-75ffdf847-vrds7         1/1     Running   0          3m58s   10.1.2.87     k8s-worker        <none>           <none>
nginx-deployment-virtual-slef-77cf5845f5-kmrg8   1/1     Running   0          3h24m   10.10.10.27   virtual-kubelet   <none>           <none>
nginx-deployment-worker-57d9684bf8-gsfth         1/1     Running   0          50m     10.1.2.67     k8s-worker        <none>           <none>

Ta truy cập vào pod và ping thử lại VM

root@k8s-master:~# kubectl exec -it cirros-deployment-worker-75ffdf847-vrds7  sh
/ # ping 10.1.3.117
PING 10.1.3.117 (10.1.3.117): 56 data bytes
64 bytes from 10.1.3.117: seq=0 ttl=64 time=2.982 ms
64 bytes from 10.1.3.117: seq=1 ttl=64 time=1.540 ms
64 bytes from 10.1.3.117: seq=2 ttl=64 time=1.011 ms
64 bytes from 10.1.3.117: seq=3 ttl=64 time=0.827 ms
^C
--- 10.1.3.117 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.827/1.590/2.982 ms
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue qlen 1000
    link/ether fa:16:3e:86:63:29 brd ff:ff:ff:ff:ff:ff
    inet 10.1.2.87/16 scope global eth0
       valid_lft forever preferred_lft forever
/ #

Ta có thể thấy pod tạo bơi kubelet và VM thông với nhau.

Kết nối giữa pod tạo bởi kubelet và virtual kubelet

Ta tạo 1 pod (VK) trên dải mạng của cho pod của kubernetes

root@k8s-master:~# kubectl get pod -o wide
NAME                                              READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
cirros-deployment-worker-75ffdf847-vrds7          1/1     Running   0          29m     10.1.2.87     k8s-worker        <none>           <none>
nginx-deployment-virtual-admin-77cf5845f5-5dg2v   1/1     Running   0          9m55s   10.1.1.173    virtual-kubelet   <none>           <none>
nginx-deployment-virtual-slef-77cf5845f5-kmrg8    1/1     Running   0          3h50m   10.10.10.27   virtual-kubelet   <none>           <none>
nginx-deployment-worker-57d9684bf8-gsfth          1/1     Running   0          76m     10.1.2.67     k8s-worker        <none>           <none>

Ta truy cập vào node compute2, truy cập vào pod

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.1.1.173  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::f816:3eff:fec1:1b68  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:c1:1b:68  txqueuelen 1000  (Ethernet)
        RX packets 10399  bytes 16046109 (15.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6207  bytes 446993 (436.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ping 10.1.2.87
PING 10.1.2.87 (10.1.2.87) 56(84) bytes of data.
64 bytes from 10.1.2.87: icmp_seq=1 ttl=64 time=3.71 ms
64 bytes from 10.1.2.87: icmp_seq=2 ttl=64 time=1.25 ms
64 bytes from 10.1.2.87: icmp_seq=3 ttl=64 time=0.795 ms
64 bytes from 10.1.2.87: icmp_seq=4 ttl=64 time=1.21 ms
^C
--- 10.1.2.87 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3017ms
rtt min/avg/max/mdev = 0.795/1.743/3.710/1.150 ms
#
# ping 10.1.2.67
PING 10.1.2.67 (10.1.2.67) 56(84) bytes of data.
64 bytes from 10.1.2.67: icmp_seq=1 ttl=64 time=1.62 ms
64 bytes from 10.1.2.67: icmp_seq=2 ttl=64 time=1.03 ms
64 bytes from 10.1.2.67: icmp_seq=3 ttl=64 time=1.63 ms
64 bytes from 10.1.2.67: icmp_seq=4 ttl=64 time=1.52 ms
^C
--- 10.1.2.67 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.032/1.454/1.635/0.252 ms
#

Ta có thấy được từ pod tạo bởi (VK) cũng thông mạng đến pod tạo bởi kubelet thường.

Openstack Loadbalancer được tạo khi expose service

Như sơ đồ ở trên, ta thấy rằng k có pod/VM nào sử dụng dải service, dải đó dành riêng cho những loadbalancer (Openstack Octavia) dùng cho service của Kubernetes.

Khi ta expose service

root@k8s-master:~# kubectl get pod -o wide
NAME                                              READY   STATUS    RESTARTS   AGE    IP            NODE              NOMINATED NODE   READINESS GATES
cirros-deployment-worker-75ffdf847-vrds7          1/1     Running   0          43m    10.1.2.87     k8s-worker        <none>           <none>
nginx-deployment-virtual-admin-77cf5845f5-5dg2v   1/1     Running   0          23m    10.1.1.173    virtual-kubelet   <none>           <none>
nginx-deployment-virtual-slef-77cf5845f5-kmrg8    1/1     Running   0          4h3m   10.10.10.27   virtual-kubelet   <none>           <none>
nginx-deployment-worker-57d9684bf8-gsfth          1/1     Running   0          89m    10.1.2.67     k8s-worker        <none>           <none>
root@k8s-master:~# kubectl expose deployment nginx-deployment-
nginx-deployment-virtual-admin  nginx-deployment-virtual-slef   nginx-deployment-worker
root@k8s-master:~# kubectl expose deployment nginx-deployment-worker
service/nginx-deployment-worker exposed
root@k8s-master:~# kubectl get svc
NAME                             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes                       ClusterIP   10.2.0.1       <none>        443/TCP   4h44m
nginx-deployment-virtual-admin   ClusterIP   10.2.154.91    <none>        80/TCP    24s
nginx-deployment-worker          ClusterIP   10.2.182.210   <none>        80/TCP    3s
root@k8s-master:~# kubectl edit svc nginx-deployment-worker
service/nginx-deployment-worker edited
root@k8s-master:~# kubectl edit svc nginx-deployment-virtual-admin
service/nginx-deployment-virtual-admin edited
root@k8s-master:~# kubectl get svc
NAME                             TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes                       ClusterIP      10.2.0.1       <none>        443/TCP        4h48m
nginx-deployment-virtual-admin   LoadBalancer   10.2.154.91    <pending>     80:31012/TCP   4m22s
nginx-deployment-worker          LoadBalancer   10.2.182.210   <pending>     80:30066/TCP   4m1s

Loadbalancer được tạo và gọi đến

[root@controller ~(kubernetes)]$ openstack loadbalancer list
+--------------------------------------+----------------------------------------+----------------------------------+--------------+---------------------+----------+
| id                                   | name                                   | project_id                       | vip_address  | provisioning_status | provider |
+--------------------------------------+----------------------------------------+----------------------------------+--------------+---------------------+----------+
| 96be6376-3eed-4822-a3e1-9deba4b37918 | kube-system/kube-dns                   | 623f7793c0974c50a932c4e6b7145b95 | 10.2.0.10    | PENDING_CREATE      | amphora  |
| 879c7bd0-43d5-41c3-9868-c9cfd5168687 | default/nginx-deployment-virtual-admin | 623f7793c0974c50a932c4e6b7145b95 | 10.2.154.91  | ACTIVE              | amphora  |
| 8733211d-9c49-40e5-8952-180aa7621bde | default/nginx-deployment-worker        | 623f7793c0974c50a932c4e6b7145b95 | 10.2.182.210 | PENDING_UPDATE      | amphora  |
+--------------------------------------+----------------------------------------+----------------------------------+--------------+---------------------+----------+
[root@controller ~(kubernetes)]$ curl 10.2.154.91
^Ccu


[root@controller ~(kubernetes)]$ cu
^C
[root@controller ~(kubernetes)]$ curl 10.2.154.91
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>
[root@controller ~(kubernetes)]$ curl 10.2.182.210
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>

Kết luận

Vậy với Openstack Zun và Kuryr-Kubernetes, ta có thể có 1 hệ thống Cloud Openstack kết hợp với K8S và cả Nodeless

Show Comments