Skip to content

Quick Start

English | 简体中文

Kind 是一个使用 Docker 容器节点运行本地 Kubernetes 集群的工具。Spiderpool 提供了安装 Kind 集群的脚本,您可以使用它来部署符合您需求的集群,进行 Spiderpool 的测试与体验。

先决条件

  • 获取 Spiderpool 稳定版本的代码到本地主机上,并进入 Spiderpool 工程的根目录。

    ~# LATEST_RELEASE_VERISON=$(curl -s https://api.github.com/repos/spidernet-io/spiderpool/releases | grep '"tag_name":' | grep -v rc | grep -Eo "([0-9]+\.[0-9]+\.[0-9])" | sort -r | head -n 1)
    ~# curl -Lo /tmp/$LATEST_RELEASE_VERISON.tar.gz https://github.com/spidernet-io/spiderpool/archive/refs/tags/v$LATEST_RELEASE_VERISON.tar.gz
    ~# tar -xvf /tmp/$LATEST_RELEASE_VERISON.tar.gz -C /tmp/
    ~# cd /tmp/spiderpool-$LATEST_RELEASE_VERISON
    
  • 执行 make dev-doctor,检查本地主机上的开发工具是否满足部署 Kind 集群与 Spiderpool 的条件。

    构建 Spiderpool 环境需要具备 Kubectl、Kind、Docker、Helm、yq 工具。如果你的本机上缺少,请运行 test/scripts/install-tools.sh 来安装它们。

快速启动

如果您在中国大陆,安装时可以额外指定参数 -e E2E_CHINA_IMAGE_REGISTRY=true ,以帮助您更快的拉取镜像。

在该场景下,你可以通过简易运维,即可让应用可分配到固定的 Underlay IP 地址,同时 Pod 能够通过 Pod IP、clusterIP、nodePort 等方式通信。具体可参考 一个或多个 underlay CNI 协同

如下命令将创建一个 Macvlan 的单 CNI 集群,其中,通过 kube-proxy 实施 service 解析

~# make setup_singleCni_macvlan

在这个场景下,你可以体验 Pod 具备双 CNI 网卡的效果。具体可参考 underlay CNI 和 overlay CNI 协同

如下命令将创建一个 Calico 为 main CNI ,并搭配 Spiderpool 为 POD 接入第二张 underlay 网卡,其中 Calico 基于 iptables datapath 工作,基于 kube-proxy 实现 service 解析。

~# make setup_dualCni_calico

在这个场景下,你可以体验 Pod 具备双 CNI 网卡的效果。具体可参考 underlay CNI 和 overlay CNI 协同

如下命令将创建一个 Cilium 为 main CNI ,并搭配 Spiderpool 为 POD 接入第二张 underlay 网卡,其中开启了 Cilium 的 eBPF 加速,并关闭了 kube-proxy 组件,基于 eBPF 实现 service 解析。

确认操作系统 Kernel 版本号是是否 >= 4.9.17,内核过低时将会导致安装失败,推荐 Kernel 5.10+ 。

~# make setup_dualCni_cilium

验证安装

在 Spiderpool 工程的根目录下执行如下命令,为 kubectl 配置 Kind 集群的 KUBECONFIG。

~# export KUBECONFIG=$(pwd)/test/.cluster/spider/.kube/config

您可以看到类似如下的内容输出:

~# kubectl get nodes
NAME                   STATUS   ROLES           AGE     VERSION
spider-control-plane   Ready    control-plane   2m29s   v1.26.2
spider-worker          Ready    <none>          2m58s   v1.26.2

~# kubectl get po -n kube-system | grep spiderpool
NAME                                           READY   STATUS      RESTARTS   AGE                                
spiderpool-agent-4dr97                         1/1     Running     0          3m
spiderpool-agent-4fkm4                         1/1     Running     0          3m
spiderpool-controller-7864477fc7-c5dk4         1/1     Running     0          3m
spiderpool-controller-7864477fc7-wpgjn         1/1     Running     0          3m
spiderpool-init                                0/1     Completed   0          3m

Spiderpool 提供的快速安装 Kind 集群脚本会自动为您创建一个应用,以验证您的 Kind 集群是否能够正常工作,以下是应用的运行状态:

~# kubectl get po -l app=test-pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE            NOMINATED NODE   READINESS GATES
test-pod-856f9689d-876nm   1/1     Running   0          5m34s   172.18.40.63   spider-worker   <none>           <none>

部署应用

通过上述检查,Kind 集群一切正常。在本章节,将介绍在不同的环境下,如何去使用 Spiderpool 。

Spiderpool 提供了 Spidermultusconfig CR 来自动管理 Multus NetworkAttachmentDefinition CR ,实现了对开源项目 Multus CNI 配置管理的扩展。

获取集群的 Spidermultusconfig CR 与 IPPool CR。

~# kubectl get spidermultusconfigs.spiderpool.spidernet.io -A
NAMESPACE     NAME              AGE
kube-system   macvlan-vlan0     1h
kube-system   macvlan-vlan100   1h
kube-system   macvlan-vlan200   1h

~# kubectl get spiderippool
NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT   DEFAULT
default-v4-ippool   4         172.18.0.0/16             5                    253              true      
default-v6-ippool   6         fc00:f853:ccd:e793::/64   5                    253              true      
...

创建应用,以下命令会创建 1 个副本 Deployment,其中:

  • v1.multus-cni.io/default-network:通过它指定 Spidermultusconfig CR: kube-system/macvlan-vlan0,并通过该配置为应用创建一张由 Macvlan 配置网络的默认网卡 (eth0) 。

  • ipam.spidernet.io/ippool:用于指定 Spiderpool 的 IP 池,Spiderpool 会自动在该池中选择 IP 与应用的默认网卡形成绑定。

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
      annotations:
        ipam.spidernet.io/ippool: |-
          {      
            "ipv4": ["default-v4-ippool"],
            "ipv6": ["default-v6-ippool"]
          }
        v1.multus-cni.io/default-network: kube-system/macvlan-vlan0
    spec:
      containers:
      - name: test-app
        image: alpine
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/sh"
        args:
        - "-c"
        - "sleep infinity"
EOF

验证应用创建成功。

~# kubectl get po -owide
NAME                        READY   STATUS    RESTARTS   AGE    IP              NODE            NOMINATED NODE   READINESS GATES
test-app-7fdbb59666-4k5m7   1/1     Running       0          9s    172.18.40.223   spider-worker   <none>           <none>

~# kubectl exec -ti test-app-7fdbb59666-4k5m7 -- ip a
...
3: eth0@if339: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 0a:96:54:6f:76:b4 brd ff:ff:ff:ff:ff:ff
    inet 172.18.40.223/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
4: veth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 4a:8b:09:d9:4c:0a brd ff:ff:ff:ff:ff:ff

获取集群的 Spidermultusconfig CR 与 IPPool CR

~# kubectl get spidermultusconfigs.spiderpool.spidernet.io -A
NAMESPACE     NAME              AGE
kube-system   calico            3m11s
kube-system   macvlan-vlan0     2m20s
kube-system   macvlan-vlan100   2m19s
kube-system   macvlan-vlan200   2m19s

~# kubectl get spiderippool
NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT   DEFAULT
default-v4-ippool   4         172.18.0.0/16             1                    253              true
default-v6-ippool   6         fc00:f853:ccd:e793::/64   1                    253              true
...

创建应用,以下命令会创建一个具备两张网卡的 Deployment 应用,其中:

  • 默认网卡(eth0)由集群缺省 CNI Calico 配置。

  • k8s.v1.cni.cncf.io/networks:通过该注解额外为应用额外再创建一张由 Macvlan 配置网络的网卡 (net1) 。

  • ipam.spidernet.io/ippools:用于指定 Spiderpool 的 IP 池,Spiderpool 会自动在该池中选择 IP 与应用的 net1 网卡形成绑定。

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
      annotations:
        ipam.spidernet.io/ippools: |-
          [{
            "interface": "net1",
            "ipv4": ["default-v4-ippool"],
            "ipv6": ["default-v6-ippool"]
          }]
        k8s.v1.cni.cncf.io/networks: kube-system/macvlan-vlan0
    spec:
      containers:
      - name: test-app
        image: alpine
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/sh"
        args:
        - "-c"
        - "sleep infinity"
EOF

验证应用创建成功

~# kubectl get po -owide
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE            NOMINATED NODE   READINESS GATES
test-app-86dd478b-bv6rm   1/1     Running   0          12s   10.243.104.211   spider-worker   <none>           <none>

~# kubectl exec -ti test-app-7fdbb59666-4k5m7 -- ip a
...
4: eth0@if148: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1480 qdisc noqueue state UP qlen 1000
    link/ether 1a:1e:e1:f3:f9:4b brd ff:ff:ff:ff:ff:ff
    inet 10.243.104.211/32 scope global eth0
5: net1@if347: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 56:b4:3d:a6:d2:d1 brd ff:ff:ff:ff:ff:ff
    inet 172.18.40.154/16 brd 172.18.255.255 scope global net1

获取集群的 Spidermultusconfig CR 与 IPPool CR

~# kubectl get spidermultusconfigs.spiderpool.spidernet.io -A
NAMESPACE     NAME              AGE
kube-system   cilium            5m32s
kube-system   macvlan-vlan0     5m12s
kube-system   macvlan-vlan100   5m17s
kube-system   macvlan-vlan200   5m18s

~# kubectl get spiderippool
NAME                VERSION   SUBNET                    ALLOCATED-IP-COUNT   TOTAL-IP-COUNT   DEFAULT
default-v4-ippool   4         172.18.0.0/16             1                    253              true
default-v6-ippool   6         fc00:f853:ccd:e793::/64   1                    253              true
...

创建应用,以下命令会创建一个具备两张网卡的 Deployment 应用,其中:

  • 默认网卡(eth0)由集群缺省 CNI Cilium 配置。

  • k8s.v1.cni.cncf.io/networks:通过该注解额外为应用额外再创建一张由 Macvlan 配置网络的网卡 (net1) 。

  • ipam.spidernet.io/ippools:用于指定 Spiderpool 的 IP 池,Spiderpool 会自动在该池中选择 IP 与应用的 net1 网卡形成绑定。

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
      annotations:
        ipam.spidernet.io/ippools: |-
          [{
            "interface": "net1",
            "ipv4": ["default-v4-ippool"],
            "ipv6": ["default-v6-ippool"]
          }]
        k8s.v1.cni.cncf.io/networks: kube-system/macvlan-vlan0
    spec:
      containers:
      - name: test-app
        image: alpine
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/sh"
        args:
        - "-c"
        - "sleep infinity"
EOF

验证应用创建成功

~# kubectl get po -owide
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE            NOMINATED NODE   READINESS GATES
test-app-86dd478b-ml8d9   1/1     Running   0          58s   10.244.102.212   spider-worker   <none>           <none>

~# kubectl exec -ti test-app-7fdbb59666-4k5m7 -- ip a
...
4: eth0@if148: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1480 qdisc noqueue state UP qlen 1000
    link/ether 26:f1:88:f9:7d:d7 brd ff:ff:ff:ff:ff:ff
    inet 10.244.102.212/32 scope global eth0
5: net1@if347: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether ca:71:99:ec:ec:28 brd ff:ff:ff:ff:ff:ff
    inet 172.18.40.228/16 brd 172.18.255.255 scope global net1

现在您可以基于 Kind 测试与体验 Spiderpool 的更多功能

卸载

  • 卸载 Kind 集群

    执行 make clean 卸载 Kind 集群。

  • 删除测试镜像

    ~# docker rmi -f $(docker images | grep spiderpool | awk '{print $3}')
    ~# docker rmi -f $(docker images | grep multus | awk '{print $3}')