• Kind 挂载LocalPath到Node再由Pod访问


    Kind Extra Mounts LocalPath To Pod MountPath

    大家好,我是无羡,大家也可以叫我Hinsteny·Hisoka.

    今天在这里,我想带大家一起通过实践Kind文件挂载这件事情,给大家分享一下自己遇到开源技术产品的使用问题时,用怎样的思路和方式去解决会比较高效且正确!


    背景

    参与云原生网关Higress项目的过程中,领到了一个能够支持在本地对WasmPlugin直接进行e2e测试的任务。

    tips: Higress是阿里牵头开源的一款新一代云原生网关产品,而且其支持WasmPlugin对其能力进行扩展;

    分析

    1、解析技术问题

    这里不讨论Higress和WasmPlugin相关的内容,对上面的任务进行概括,即为:
    在本地使用Kind创建一个k8s集群,然后再将本地构建出来的WasmPlugin挂载到Higress的gateway-Pod上面,这样就能直接访问Higress-gateway,对WasmPlugin的能力进行验证。

    2、再进一步细分

    由于我们知道使用Kind创建的k8s集群中的Node是一个虚拟的Docker-Container,即Pod都是部署在这个虚拟Node上的,因此我们需要先将LocalPath挂载到虚拟Node上,然后Pod再挂载Node上的Path,才能实际访问到LocalPath的内容,具体事项如下:

    1. Kind挂载LocalPath到Node;
    2. k8s挂载Node上的Path到Pod;

    实践

    1、Kind Extra Mounts

    参考Kind官方文档–Extra Mounts,因此我的配置文件如下,

    # cluster.conf
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
      kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-labels: "ingress-ready=true"
      extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP
      extraMounts:
        # 这里不能写死,需要动态指定,因为每个人的本地路径不一样
        - hostPath: /Users/h/workspace/project/higress/plugins
          containerPath: /opt/plugins
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2、Kind的集群创建配置文件是否能够动态传参?

    1. 先自己看文档找解决办法

    首先仔细阅读了官方文档,没有关于动态传参的说明,那就去Github问问呗

    2. 寻求外部帮助

    Issue: 如何动态传参对配置进行进行配置呢?
    最后得到结论:
    不支持,也不打算支持。

    3. 方案确定

    其实通过2的确认后,接下来就是我们如何自己动态生成配置文件了,那办法就有很多,我们可以根据所处的不同的集成、测试环境分别给出方案;这里通过shell动态输出配置文件,

    PROJECT_DIR=$(pwd)
    
    cat < "tools/hack/cluster.conf"
    
    # cluster.conf
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
      kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-labels: "ingress-ready=true"
      extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP
      extraMounts:
        - hostPath: ${PROJECT_DIR}/plugins
          containerPath: /opt/plugins
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    4、通过Kind命令创建K8S集群

    kind create cluster --config=tools/hack/cluster.conf
    
    • 1

    5、Pod volumes hostPath

    Pod的Storage方案有很多,继续看K8S官方文档-- volumes;

    上面我们将本地的plugins目录,已经挂载到了Node的’/opt/plugins’,那Pod的就更简单了,如下

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: registry.k8s.io/test-webserver
        name: test-container
        volumeMounts:
        # directory location on pod
        - mountPath: /opt/pod/plugins
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          # directory location on host--Node
          path: /opt/plugins
          # this field is optional
          type: Directory
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    总结

    针对开源技术产品的使用问题,首先读官方文档,然后在社区找帮助,参与开源项目的都是一群很nice的小伙伴!

  • 相关阅读:
    TDengine:无模式写入行协议的四种方式
    PHP Zip File 函数
    10分钟设置免费海外远程桌面
    为什么 CSS flex 布局中没有 `justify-items` 和 `justify-self`?
    JavaScript AJAX操作
    33.高等数学
    python添加命令行参数
    SIP中继与VoIP:有何不同?
    web:[RoarCTF 2019]Easy Calc
    SpringBoot--参数校验--@Validated--使用/实例
  • 原文地址:https://blog.csdn.net/HinstenyHisoka/article/details/131139264