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
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