您现在的位置是:首页 >技术交流 >Kind 挂载LocalPath到Node再由Pod访问网站首页技术交流
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的内容,具体事项如下:
- Kind挂载LocalPath到Node;
- 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
2、Kind的集群创建配置文件是否能够动态传参?
1. 先自己看文档找解决办法
首先仔细阅读了官方文档,没有关于动态传参的说明,那就去Github问问呗
2. 寻求外部帮助
Issue: 如何动态传参对配置进行进行配置呢?
最后得到结论:
不支持,也不打算支持。
3. 方案确定
其实通过2的确认后,接下来就是我们如何自己动态生成配置文件了,那办法就有很多,我们可以根据所处的不同的集成、测试环境分别给出方案;这里通过shell动态输出配置文件,
PROJECT_DIR=$(pwd)
cat <<EOF > "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
4、通过Kind命令创建K8S集群
kind create cluster --config=tools/hack/cluster.conf
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
总结
针对开源技术产品的使用问题,首先读官方文档,然后在社区找帮助,参与开源项目的都是一群很nice的小伙伴!