[Kubernetes] Giới thiệu và cài đặt Kube-OVN

10 min read

Kube-OVN là một hệ thống mạng tuân thủ CNI, phụ thuộc vào môi trường Kubernetes và mô-đun mạng kernel tương ứng để hoạt động. Chúng ta có thể tham khảo source của Kube-OVN tại github.

Thiết lập môi trường

  • Kernel nên kích hoạt IPv6, nếu các tùy chọn bootstrap của kernel chứa ipv6.disable=1, thì cần đặt thành 0.
  • kube-proxy hoạt động, Kube-OVN có thể truy cập kube-apiserver từ Service ClusterIP.
  • Đảm bảo kubelet đã kích hoạt CNI và tìm cni-bin và cni-conf trong các thư mục mặc định, các tùy chọn bootstrap của kubelet nên chứa –network-plugin=cni –cni-bin-dir=/opt/cni/bin –cni-conf-dir=/etc/cni/net.d.
  • Đảm bảo không có CNI khác được cài đặt hoặc đã được gỡ bỏ, kiểm tra xem có tệp cấu hình nào còn tồn tại trong /etc/cni/net.d/ hay không.

Ports cần được mở

ComponentPortUsage
ovn-central6641/tcp, 6642/tcp, 6643/tcp, 6644/tcpovn-db và ports lắng nghe từ server
ovs-ovnGeneve 6081/udp, STT 7471/tcp, Vxlan 4789/udptunnel ports
kube-ovn-controller10660/tcpmetrics port
kube-ovn-daemon10665/tcpmetrics port
kube-ovn-monitor10661/tcpmetrics port
Ports Need Open

Cài đặt Kube-OVN

Kube-OVN cung cấp một script cài đặt one-click để giúp bạn nhanh chóng cài đặt mạng container Kube-OVN sẵn sàng cho sản xuất, có tính sẵn sàng cao với mạng Overlay mặc định.

Cài đặt bằng Helm Chart được hỗ trợ từ phiên bản Kube-OVN v1.12.0, và triển khai mặc định là mạng Overlay.

Download the installation script

wget https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.12/dist/images/install.sh

Chỉnh sửa các cấu hình

REGISTRY="kubeovn"                     # Image Repo 
VERSION="v1.12.16"                     # Image Tag
POD_CIDR="10.16.0.0/16"                # Default subnet CIDR don't overlay with SVC/NODE/JOIN CIDR
SVC_CIDR="10.96.0.0/12"                # Be consistent with apiserver's service-cluster-ip-range
JOIN_CIDR="100.64.0.0/16"              # Pod/Host communication Subnet CIDR, don't overlay with SVC/NODE/POD CIDR
LABEL="node-role.kubernetes.io/master" # The node label to deploy OVN DB
IFACE=""                               # The name of the host NIC used by the container network, or if empty use the NIC that host Node IP in Kubernetes
TUNNEL_TYPE="geneve"                   # Tunnel protocol,available options: geneve, vxlan or stt. stt requires compilation of ovs kernel module

Cũng có thể sử dụng biểu thức chính quy để tính toán các tên NIC, chẳng hạn như IFACE=enp6s0f0,eth.*

Run the Script bash install.sh

Xoá cluster master node taint

$ kubectl taint node kube-ovn-control-plane node-role.kubernetes.io/control-plane:NoSchedule-
node/kube-ovn-control-plane untainted

Có thể bỏ qua bước này nếu chắc chắn rằng mình không cần lên lịch cho pod tại master node.

Thêm label cho node

$ kubectl label node -lbeta.kubernetes.io/os=linux kubernetes.io/os=linux --overwrite
node/kube-ovn-control-plane not labeled
node/kube-ovn-worker not labeled

$ kubectl label node -lnode-role.kubernetes.io/control-plane kube-ovn/role=master --overwrite
node/kube-ovn-control-plane labeled

$ kubectl label node -lovn.kubernetes.io/ovs_dp_type!=userspace ovn.kubernetes.io/ovs_dp_type=kernel --overwrite
node/kube-ovn-control-plane labeled
node/kube-ovn-worker labeled

Thêm Helm repo

$ helm repo add kubeovn https://kubeovn.github.io/kube-ovn/
"kubeovn" has been added to your repositories

$ helm repo list
NAME            URL
kubeovn         https://kubeovn.github.io/kube-ovn/

$ helm search repo kubeovn
NAME                CHART VERSION   APP VERSION DESCRIPTION
kubeovn/kube-ovn    0.1.0           1.12.0      Helm chart for Kube-OVN

Run helm install để cài đặt Kube-OVN.

# Single master node environment install
$ helm install kube-ovn kubeovn/kube-ovn --set MASTER_NODES=${Node0IP}

# Using the node information above as an example, execute the install command
$ helm install kube-ovn kubeovn/kube-ovn --set MASTER_NODES=172.18.0.3
NAME: kube-ovn
LAST DEPLOYED: Fri Mar 31 12:43:43 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# Highly Available Cluster Installation
$ helm install kube-ovn kubeovn/kube-ovn --set MASTER_NODES=${Node0IP}\,${Node1IP}\,${Node2IP} --set replicaCount=3

Các tham số Node0IP, Node1IP và Node2IP lần lượt là các địa chỉ IP của các cluster master nodes. Đối với các tham số khác, bạn có thể tham khảo các định nghĩa biến trong tệp values.yaml.

Cài đặt Underlay

Theo mặc định, default subnet sử dụng Geneve để đóng gói lưu lượng cross-host và xây dựng một overlay network trên cơ sở hạ tầng.

Trong trường hợp bạn muốn mạng container sử dụng trực tiếp địa chỉ mạng vật lý, bạn có thể thiết lập default subnet của Kube-OVN hoạt động ở chế độ Underlay, điều này cho phép gán trực tiếp tài nguyên địa chỉ trong mạng vật lý cho các container, đạt được hiệu suất và khả năng kết nối tốt hơn với mạng vật lý.

kube-ovn

Hạn chế:

Vì mạng container trong chế độ này sử dụng trực tiếp mạng vật lý để chuyển tiếp gói tin L2, các chức năng L3 như SNAT/EIP, distributed gateway/centralized gateway trong chế độ Overlay không thể được sử dụng. Cách ly mức VPC cũng không khả dụng cho underlay subnet.

So sánh với Macvlan
Chế độ Underlay của Kube-OVN rất giống với Macvlan, với các điểm khác biệt chính về chức năng và hiệu suất như sau:

  1. Macvlan có hiệu suất tốt hơn về thông lượng và độ trễ do đường dẫn kernel ngắn hơn và không yêu cầu OVS để xử lý gói tin.
  2. Kube-OVN cung cấp chức năng arp-proxy thông qua flow tables để giảm thiểu rủi ro bão broadcast arp trên mạng lớn.
  3. Vì Macvlan hoạt động ở tầng dưới của kernel và bỏ qua host netfilter, chức năng Service và NetworkPolicy yêu cầu phát triển thêm. Kube-OVN cung cấp các khả năng Service và NetworkPolicy thông qua OVS flow table.
  4. Chế độ Underlay của Kube-OVN cung cấp các tính năng bổ sung như quản lý địa chỉ, IP cố định và QoS so với Macvlan.

Environment Requirements

Trong chế độ Underlay, OVS sẽ kết nối một NIC của node vào cầu OVS và gửi gói tin trực tiếp qua NIC của node đó, dựa vào các thiết bị mạng bên dưới để thực hiện khả năng chuyển tiếp mức L2/L3. Bạn cần cấu hình gateway, Vlan và chính sách bảo mật tương ứng trên thiết bị mạng bên dưới trước.

  1. Đối với môi trường OpenStack VM, bạn cần tắt PortSecurity trên cổng mạng tương ứng.
  2. Đối với mạng VMware vSwitch, các cài đặt MAC Address Changes, Forged Transmits và Promiscuous Mode Operation nên được đặt ở chế độ cho phép.
  3. Đối với ảo hóa Hyper-V, MAC Address Spoofing nên được kích hoạt trong tính năng nâng cao của VM nic.
  4. Các đám mây công cộng, như AWS, GCE, AliCloud, v.v., không hỗ trợ người dùng định nghĩa Mac, vì vậy không thể hỗ trợ mạng chế độ Underlay. Trong trường hợp này, nếu bạn muốn sử dụng Underlay, nên sử dụng VPC-CNI được cung cấp bởi nhà cung cấp đám mây công cộng tương ứng.
  5. Giao diện mạng được kết nối vào ovs không thể là loại Linux Bridge.

Đối với mạng quản lý và container sử dụng cùng một NIC, Kube-OVN sẽ chuyển địa chỉ Mac, địa chỉ IP, route và MTU của NIC sang cầu OVS tương ứng để hỗ trợ triển khai mạng Underlay trên một NIC. Định dạng tên cầu OVS là br-PROVIDER_NAME, PROVIDER_NAME là tên của ProviderNetwork (Mặc định: provider).

Chỉ định Chế độ Mạng Khi Triển Khai

Chế độ triển khai này thiết lập default subnet ở chế độ Underlay, và tất cả các Pod không chỉ định subnet sẽ chạy trong mạng Underlay theo mặc định.

Download Script

wget https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.12/dist/images/install.sh

Cập nhật cấu hình

ENABLE_ARP_DETECT_IP_CONFLICT # disable vlan arp conflict detection if necessary
NETWORK_TYPE                  # set to vlan
VLAN_INTERFACE_NAME           # set to the NIC that carries the Underlay traffic, e.g. eth1
VLAN_ID                       # The VLAN Tag need to be added,if set 0 no vlan tag will be added
POD_CIDR                      # The Underlay network CIDR, e.g. 192.168.1.0/24
POD_GATEWAY                   # Underlay physic gateway address, e.g. 192.168.1.1
EXCLUDE_IPS                   # Exclude ranges to avoid conflicts between container network and IPs already in use on the physical network, e.g. 192.168.1.1..192.168.1.100
ENABLE_LB                     # If Underlay Subnet needs to visit Service set it to true
EXCHANGE_LINK_NAME            # If swap the names of the OVS bridge and the bridge interface under the default provider-network. Default to false.
LS_DNAT_MOD_DL_DST            # If DNAT translate MAC addresses to accelerate service access. Default to true.

Run the Script bash install.sh

Tạo Mạng Underlay Động thông qua CRD

Cách tiếp cận này tạo động một Underlay subnet mà Pod có thể sử dụng sau khi cài đặt.

Tạo ProviderNetwork ProviderNetwork cung cấp sự trừu tượng hóa của việc ánh xạ NIC của host vào mạng vật lý, thống nhất quản lý các NIC thuộc cùng một mạng, và giải quyết các vấn đề cấu hình trong các môi trường phức tạp với nhiều NIC trên cùng một máy, tên NIC không nhất quán và các mạng Underlay tương ứng không nhất quán.

Tạo ProviderNetwork như sau:

apiVersion: kubeovn.io/v1
kind: ProviderNetwork
metadata:
  name: net1
spec:
  defaultInterface: eth1
  customInterfaces:
    - interface: eth2
      nodes:
        - node1
  excludeNodes:
    - node2

Lưu ý: Độ dài của tên tài nguyên ProviderNetwork không được vượt quá 12 ký tự.

  • defaultInterface: Tên NIC mặc định của node. Khi ProviderNetwork được tạo thành công, một OVS bridge có tên là br-net1 (theo định dạng br-NAME) sẽ được tạo trên mỗi node (trừ các excludeNodes) và NIC của node được chỉ định sẽ được kết nối vào cầu này.
  • customInterfaces: Tùy chọn, bạn có thể chỉ định NIC sẽ được sử dụng cho một node cụ thể.
  • excludeNodes: Tùy chọn, để chỉ định các node không kết nối NIC. Các node trong danh sách này sẽ được gán thẻ net1.provider-network.ovn.kubernetes.io/exclude=true.

Các node khác sẽ được gán các thẻ sau:

KeyValueDescription
net1.provider-network.ovn.kubernetes.io/readytruebridge work finished, ProviderNetwork is ready on this node
net1.provider-network.ovn.kubernetes.io/interfaceeth1The name of the bridged NIC in the node.
net1.provider-network.ovn.kubernetes.io/mtu1500MTU of bridged NIC in node
tags

Nếu một IP đã được cấu hình trên NIC của node, địa chỉ IP và route trên NIC sẽ được chuyển sang OVS bridge tương ứng.

Tạo VLAN

Vlan cung cấp một bản tóm tắt để liên kết Thẻ Vlan và ProviderNetwork.

Tạo một VLAN như sau:

apiVersion: kubeovn.io/v1
kind: Vlan
metadata:
  name: vlan1
spec:
  id: 0
  provider: net1
  • id: VLAN ID/Tag,Kube-OVN will add this Vlan tag to traffic, if set 0, no tag is added.
  • provider: The name of ProviderNetwork. Multiple VLAN can use a same ProviderNetwork.

Tạo Subnet

Liên kết Vlan với một subnet như sau:

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
   name: subnet1
spec:
   protocol: IPv4
   cidrBlock: 172.17.0.0/16
   gateway: 172.17.0.1
   vlan: vlan1

Đơn giản chỉ cần chỉ định giá trị của vlan là tên của VLAN sẽ được sử dụng. Nhiều subnet có thể tham chiếu đến cùng một VLAN.

Tạo Pod

Bạn có thể tạo các container theo cách thông thường, kiểm tra xem địa chỉ IP của container có trong phạm vi được chỉ định không và xem container có thể tương tác với mạng vật lý không.

Logical Gateway

Trong các trường hợp mà không có cổng gateway nào tồn tại trong mạng vật lý, Kube-OVN hỗ trợ việc sử dụng các cổng gateway logic được cấu hình trong subnet trong chế độ Underlay. Để sử dụng tính năng này, hãy đặt spec.logicalGateway thành true cho subnet:

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
   name: subnet1
spec:
   protocol: IPv4
   cidrBlock: 172.17.0.0/16
   gateway: 172.17.0.1
   vlan: vlan1
   logicalGateway: true

Kết nối giữa Mạng Underlay và Overlay

Nếu một cụm có cả các mạng con Underlay và Overlay, theo mặc định, Pods trong mạng con Overlay có thể truy cập vào các IP của Pod trong mạng con Underlay thông qua một cổng gateway sử dụng NAT. Từ quan điểm của các Pods trong mạng con Underlay, các địa chỉ trong mạng con Overlay là bên ngoài và yêu cầu thiết bị vật lý cơ bản để chuyển tiếp, nhưng thiết bị vật lý cơ bản không biết các địa chỉ trong mạng con Overlay và không thể chuyển tiếp. Do đó, các Pods trong mạng con Underlay không thể truy cập trực tiếp vào các Pods trong mạng con Overlay thông qua các IP của Pod.

Nếu bạn cần kích hoạt giao tiếp giữa các mạng Underlay và Overlay, bạn cần đặt u2oInterconnection của subnet thành true. Trong trường hợp này, Kube-OVN sẽ sử dụng một IP Underlay bổ sung để kết nối mạng con Underlay và logical router ovn-cluster, và thiết lập các quy tắc định tuyến tương ứng để kích hoạt giao tiếp. Không giống như cổng gateway logic, giải pháp này chỉ kết nối các mạng Underlay và Overlay trong Kube-OVN, và các lưu lượng khác truy cập Internet vẫn sẽ được chuyển tiếp thông qua cổng gateway vật lý.

Chỉ định IP cổng gateway logic

Sau khi chức năng giao tiếp được kích hoạt, một IP từ mạng con sẽ được chọn ngẫu nhiên làm cổng gateway logic. Nếu bạn cần chỉ định cổng gateway logic của mạng con Underlay, bạn có thể chỉ định trường u2oInterconnectionIP.

Chỉ định VPC tùy chỉnh cho kết nối mạng con Underlay

Theo mặc định, mạng con Underlay sẽ giao tiếp với mạng con Overlay trên VPC mặc định. Nếu bạn muốn chỉ định để giao tiếp với một VPC cụ thể, sau khi đặt u2oInterconnection thành true, chỉ định trường subnet.spec.vpc là tên của VPC.

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Leave a Reply

Your email address will not be published. Required fields are marked *