• k3s 上的 kube-ovn 轻度体验


    kube-ovn 从名字不难看出其是一款云原生的网络产品,将 SDN 等能力带入云原生领域。让 ovn/ovs 的使用更容易,屏蔽了复杂度,降低了使用的难度,并与云原生进行了结合。

    借助 OVS/OVN 在 SDN 领域成熟的能力,Kube-OVN 将网络虚拟化的丰富功能带入云原生领域。目前已支持子网管理, 静态 IP 分配,分布式/集中式网关,Underlay/Overlay 混合网络, VPC 多租户网络,跨集群互联网络,QoS 管理, 多网卡管理,ACL 网络控制,流量镜像,ARM 支持, Windows 支持等诸多功能。

    安装 k3s

    参考官方的准备工作文档,操作系统使用 Ubuntu 20.04 以及 k3s v1.23.8+k3s2。

    在安装之前确保 /etc/cni/net.d/ 目录内容为空,不为空则清空其下的所有文件。kube-ovn 本身通过实现 cni 来管理网络。

    在安装 k3s 需要禁用 k3s 默认的网络策略控制器和flannel 的后端(默认是 VXLAN):

    export INSTALL_K3S_VERSION=v1.23.8+k3s1
    curl -sfL https://get.k3s.io | sh -s - --flannel-backend=none --disable-network-policy --disable=traefik --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config
    
    • 1
    • 2

    为了节省资源,我也禁用了 traefik Ingress 控制器。

    此时检查 pod 会发现都处于 Pending 状态,这是因为还没安装 CNI。

    kubectl get po -A
    NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
    kube-system   local-path-provisioner-6c79684f77-llvhk   0/1     Pending   0          11s
    kube-system   metrics-server-7cd5fcb6b7-kxm5j           0/1     Pending   0          11s
    kube-system   coredns-d76bd69b-jd6gm                    0/1     Pending   0          11s
    
    • 1
    • 2
    • 3
    • 4
    • 5

    检查 node 提示 container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

    接下来就是安装 kube-ovn 了。

    安装 kube-ovn

    kube-ovn 的安装使用官方提供一键安装脚本:

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

    查看脚本中的配置:

    REGISTRY="kubeovn"                     # 镜像仓库地址
    VERSION="v1.10.6"                      # 镜像版本/Tag
    POD_CIDR="10.16.0.0/16"                # 默认子网 CIDR 不要和 SVC/NODE/JOIN CIDR 重叠
    SVC_CIDR="10.96.0.0/12"                # 需要和 apiserver 的 service-cluster-ip-range 保持一致
    JOIN_CIDR="100.64.0.0/16"              # Pod 和主机通信网络 CIDR,不要和 SVC/NODE/POD CIDR 重叠 
    LABEL="node-role.kubernetes.io/master" # 部署 OVN DB 节点的标签
    IFACE=""                               # 容器网络所使用的的宿主机网卡名,如果为空则使用 Kubernetes 中的 Node IP 所在网卡
    TUNNEL_TYPE="geneve"                   # 隧道封装协议,可选 geneve, vxlan 或 stt,stt 需要单独编译 ovs 内核模块
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    k3s 的默认 POD 和 SVC CIDR 分别是:10.42.0.0/1610.43.0.0/16,可以在安装时通过参数 --cluster-cidr--service-cidr 分别进行设置。上面,安装 k3s 时使用了的默认配置,因此需要修改 install.sh 中的配置

    POD_CIDR="10.42.0.0/16"
    POD_GATEWAY="10.42.0.1"
    SVC_CIDR="10.43.0.0/12"
    
    • 1
    • 2
    • 3

    修改之后,运行脚本安装:

    bash install.sh
    
    • 1

    确认所有 pod 启动并运行:

    kubectl get po -A
    NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
    kube-system   ovs-ovn-trqk5                             1/1     Running   0          2m37s
    kube-system   kube-ovn-monitor-5f8f5dbfc-plfrq          1/1     Running   0          108s
    kube-system   kube-ovn-controller-67bbd54575-2n87d      1/1     Running   0          108s
    kube-system   ovn-central-644fbb8467-xtrjc              1/1     Running   0          2m37s
    kube-system   kube-ovn-cni-glcfw                        1/1     Running   0          108s
    kube-system   kube-ovn-pinger-2k72d                     1/1     Running   0          71s
    kube-system   local-path-provisioner-6c79684f77-jh2zh   1/1     Running   0          71s
    kube-system   coredns-d76bd69b-w28rg                    1/1     Running   0          37s
    kube-system   metrics-server-7cd5fcb6b7-8jgdm           1/1     Running   0          36s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    检查 kube-system 下的 DaemonSet 类型应用,运行在各个 node 上负责 ovs/ovn、CNI 和网络检查 ping。

    kubectl get ds -n kube-system
    NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    ovs-ovn           1         1         1       1            1           kubernetes.io/os=linux   3m14s
    kube-ovn-cni      1         1         1       1            1           kubernetes.io/os=linux   2m25s
    kube-ovn-pinger   1         1         1       1            1           kubernetes.io/os=linux   2m25s
    
    • 1
    • 2
    • 3
    • 4
    • 5

    至此 kube-ovn 就安装完成了,下面简单体验下 kube-ovn 的功能。

    体验

    子网

    前面介绍 kube-ovn 安装时提到了子网,子网 是 kube-ovn 的核心概念。

    Kube-OVN 会以子网来组织 IP 和网络配置,每个 Namespace 可以归属于特定的子网, Namespace 下的 Pod 会自动从所属的子网中获取 IP 并共享子网的网络配置(CIDR,网关类型,访问控制,NAT控制等)。

    我们部署一个 pod,可以看到 k3s 从 kube-ovn 的默认子网中分配 IP 地址。所有没有设置子网的 namespace 的 pod IP 地址都位于该网段。

    kubectl run pipy --image flomesh/pipy:latest -n default
    
    kubectl get po -o wide -n default
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
    pipy   1/1     Running   0          41s   10.42.0.10   ubuntu-dev1   <none>           <none>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们手动创建一个 namespace 和新的子网:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      creationTimestamp: null
      name: another
    ---
    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
      name: another-subnet
    spec:
      protocol: IPv4
      cidrBlock: 10.66.0.0/16
      excludeIps:
      - 10.66.0.1
      gateway: 10.66.0.1
      gatewayType: distributed
      natOutgoing: true
      namespaces:
      - another
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    接下来验证一下,在 another namespace 下创建新的 pod:

    kubectl run curl --image rancher/curl --command sleep 1d -n another
    
    kubectl get po -o wide -n another
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
    curl   1/1     Running   0          14s   10.66.0.11   ubuntu-dev1   <none>           <none>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以看到 pod curl 从新的子网中获取了 IP 地址,试着访问之前创建的 pod:

    kubectl exec -it curl -n another -- curl -i 10.42.0.10:8080
    HTTP/1.1 200 OK
    content-length: 11
    connection: keep-alive
    
    Hi, there!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    不同的子网有什么用呢?试想这样的场景,有两个 namespace anotherdefault。要禁止 annother 中的 pod 对 default 中pod 的访问,第一时间想到的是 Kubernetes 的 Network Policy,或者借助其他的应用,比如之前介绍的 使用 Cilium 增强 Kubernetes 网络安全(也是网络内核层的实现),或者服务网格的访问控制

    但现在既然用 kube-ovn,可以使用 ovn 的 ACL 规则。

    子网 ACL

    接下来,更新默认子网的设置,添加 ACL 规则:

    kubectl apply -f - <<EOF
    apiVersion: kubeovn.io/v1
    kind: Subnet
    metadata:
      name: ovn-default
    spec:
      cidrBlock: 10.42.0.0/16
      default: true
      excludeIps:
      - 10.42.0.1
      gateway: 10.42.0.1
      gatewayType: distributed
      natOutgoing: true
      protocol: IPv4
      provider: ovn
      vpc: ovn-cluster
      acls:
      - action: drop
        direction: from-lport
        match: ip4.src == 10.66.0.0/16 && ip
        priority: 1002    
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    这段 ACL 规则表示:丢弃(action: drop)来自(direction: from-lport10.66.0.0/16 网段(match: ip4.src == 10.66.0.0/16 && ip)的包,更多规则说明参考 ACL 规则文档

    此时再次访问,但是这回加上连接超时,因为不想等太久:

    kubectl exec -it curl -n another -- curl -i --connect-timeout 5 10.42.0.10:8080
    curl: (28) Connection timed out after 5000 milliseconds
    command terminated with exit code 28
    
    • 1
    • 2
    • 3

    another namespace 下的 pod 无法访问到 default 下的 pod,符合预期。

    总结

    这篇仅仅展示了 kube-ovn 很基础的功能,基于 ovs/ovn 的强大能力,kube-ovn 还提供了其他更强大的功能,有兴趣的同学可以去参考官方的使用指南

    貌似应该要好好看看 ovs/ovn 了。

    关注"云原生指北"微信公众号
    (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

  • 相关阅读:
    关于如何快速学好,学懂Linux内核。内含学习路线
    c++ - 第9节 - vector类
    热烈祝贺〖金融之路CapLab官方中文社群②群〗成员数突破1,600人!
    CentOS:root密码修改
    海思和Sigmastar ISP开发异同点
    scanpy filter总结
    Agent AI智能体的未来发展及其潜力
    Elasticsearch_第一章_ elasticsearch基础
    Ubuntu server 24 (Linux) 普通用户不能sudo 也不能使用root登录 忘记root密码 修复解决方案
    小程序“超级入口”出现了
  • 原文地址:https://blog.csdn.net/hanfengzxh/article/details/126725740