k3d入门指南之在Docker中运行K3s的详细教程
什么是k3d?
k3d是一个小型程序,用于在docker中运行k3s集群。 k3s是经过cncf认证的轻量级kubernetes发行和沙箱项目。它是为资源有限环境设计的,被打包为单个二进制文件,所需ram小于512mb。 要了解有关k3s的更多信息,请查看我们之前的公众号文章及b站上的视频。
k3d借助从k3s仓库构建的docker镜像在安装了docker的任何机器上的docker容器中启动多个k3s节点。 这样,一台物理(或虚拟)机(称为docker host)可以运行多个k3s集群,每个集群同时有多个server和agent节点。
k3d能做什么?
2021年1月,发布k3dv4.0.0,包含以下功能:
- 创建/停止/启动/删除/扩大/缩小k3s集群(和单个节点)
- 通过命令行标志
- 通过配置文件
- 管理可与集群一起使用的容器镜像仓库并与之交互
- 管理集群的kubeconfigs
- 将本地docker daemon中的镜像导入集群中运行的容器运行时中
显然,还有更多的方法,您可以用来对使用过程中的细节进行调整。
k3d的用途是什么?
k3d的主要应用场景是在kubernetes上进行本地开发,因为k3d轻量、简单的特性,在这一场景下几乎不会遇到麻烦和资源使用问题。 开发k3d的初衷是为开发人员提供一个简单的工具,使他们能够在开发环境的机器上运行轻量级的kubernetes集群,从而在类似于生产的环境中获得快速的迭代时间(相对于在本地运行docker-compose与生产中的kubernetes要快得多)。
随着时间的推移,k3d还发展成为一种运维工具,用于在隔离的环境中测试某些kubernetes(或特别是k3s)功能。 例如,使用k3d,您可以轻松地创建多节点集群,在其上部署一些应用程序,轻松停止一个节点并查看kubernetes的反应,还能够将您的应用重新调度到其他节点上。
此外,您可以在持续集成系统中使用k3d来快速启动集群,在其上部署测试堆栈并运行集成测试。完成操作后,您就可以轻松地停用整个集群。无需担心适当的清理和可能的残留。
我们还提供了一个k3d-dind镜像(类似于电影《盗梦空间》中的梦中的梦,我们在容器内的容器中放置了容器。)通过此操作,您可以创建一个运行k3d的docker-in-docker环境,该环境会在docker中生成一个k3s集群。这意味着您只有一个容器(k3d-dind)在您的docker主机上运行,而该容器又在其中运行了整个k3s / kubernetes集群。
如何使用k3d?
1、安装k3d(如需使用也可安装kubectl)
注意:本文介绍内容对版本有要求,请至少使用k3d v4.1.1以上版本
2、可以尝试以下其中一个示例,或使用文档或cli帮助文本找到适合您自己的方式(k3d [command] --help)
“简单”的方式
k3d cluster create
该命令将创建一个带有两个容器的k3s集群:一个kubernetes控制平面节点(server)和一个位于其前面的负载均衡器(serverlb)。 它将它们都放置在专用的docker网络中,并在docker主机上随机选择的免费端口上暴露kubernetes api。 它还在后台创建了一个名为docker的卷,作为镜像导入的准备。
默认情况下,如果不提供name参数,集群将被命名为k3s-default,并且容器将显示为k3d-
k3d等待一切准备就绪,从集群中拉取kubeconfig并将其与默认的kubeconfig合并(通常位于$ home / .kube / config或者kubeconfig环境变量指向的任何路径中)。
不用担心,您也可以调整该行为。
使用kubectl查看您刚创建的用于显示节点的内容:. kubectl get nodes
k3d还为您提供了一些命令来列出您所创建的东西:.k3d cluster | node | registry list
“简单但精妙”的方式
此命令生成带有六个容器的k3s集群:* 1个负载均衡器* 3个server(控制平面节点)* 2个agent(以前为worker节点)
通过--api-port 127.0.0.1:6445,您可以使用k3d将kubernetes api端口(6443内部)映射到127.0.0.1 / localhost的端口6445。这意味着随后将在kubeconfig中包含以下连接字符串:server: https://127.0.0.1:6445以连接到此集群。
该端口将从负载均衡器映射到您的主机系统。请求将从那里被代理到server节点,从而有效地模拟生产环境设置,在该环境中server节点也可能发生故障,并且希望故障转移到另一个server上。
--volume /home/me/mycode:/code@agent[] 绑定将你的本地目录/home/me/mycode挂载到所有([] agent 节点)内部的路径/code。使用索引(0或1)替换*,以便只把它挂载到其中一个节点。
告诉k3d应该将卷安装到哪个节点的规范称为“节点过滤器”,它也用于其他标志,例如端口映射的--port标志。
也就是说,--port '8080:80@loadbalancer'将本地主机的端口8080映射到负载均衡器(serverlb)上的端口80,该负载均衡器可用于将http ingress流量转发到集群。 例如,可以将web应用程序部署到集群(deployment)中,该集群通过一个 ingress(如myapp.k3d.localhost)在外部暴露(service)。
然后(前提是一切都设置为将该域解析为本地主机ip),则可以将浏览器指向http://myapp.k3d.localhost:8080 访问您的应用程序。 然后,流量从您的主机通过docker桥接口流向负载均衡器。 从那里,它被代理到集群,并通过ingress和service传递到您的应用程序pod。
注意:你必须设置一些机制,将myapp.k3d.localhost路由到本地主机ip(127.0.0.1)。
最常见的方法是在你的/etc/hosts文件中使用127.0.0.1
myapp.k3d.localhost的条目(c:\windows\system32\drivers\etc/hosts)。。
但是,这不允许使用通配符(.localhost),因此一段时间后可能会变得有些麻烦,因此您可能需要了解dnsmasq(macos /
unix)或acrylic(windows)之类的工具来减轻负担。 提示:可以在某些系统(至少是linux操作系统,包括suse
linux和opensuse)上安装libnss-myhostname软件包,以将.localhost域自动解析为127.0.0.1,这意味着您不必再手动操作。例如
,如果您希望通过ingress进行测试,则需要在其中设置域。
在此处,需要注意的事是:如果创建多个server节点,则k3s将被分配到--cluster-init标志,这意味着它将k3s的默认内部数据库(默认为sqlite)更改为etcd。
“配置即编码”方式
从k3d v4.0.0(发布于2021年1月)开始,我们支持使用配置文件,来配置一切您以前通过命令行标志所做的代码(不久之后甚至可能支持更多)。在撰写本文时,您可以在repo中找到用于验证配置文件的json模式:
示例配置文件:
假设我们将其另存为/home/me/myk3dcluster.yaml,我们可以使用它来配置新集群
k3d cluster create --config /home/me/myk3dcluster.yaml
注意:您仍然可以设置额外的参数或标志,这些参数或标志将优先于(或将被合并)你在配置文件中定义的任何参数。
k3d还能做什么?
你可以在很多场景下使用k3d,例如:
- 与k3d托管的容器仓库一起创建集群
- 使用集群通过热代码重载进行快速开发
- 将k3d与其他开发工具(例如tilt或skaffold)结合使用
- 两者都可以通过k3d image import利用镜像导入的功能
- 两者都可以利用k3d托管的仓库来加快开发周期
- 在您的ci系统中使用k3d(为此我们提供了poc:)
- 使用社区维护的vscode扩展程序()将其集成到您的
- vscode工作流程中 用它来设置k3s的高可用性
您可以通过使用在此demo repo中准备好的脚本来自己尝试所有这些操作:
https://github.com/iwilltry42/k3d-demo。
thorsten klein
trivago的devops工程师,suse*软件工程师,也是k3d的维护者。
以上就是k3d入门指南之在docker中运行k3s的详细教程的详细内容,更多关于docker中运行k3s的资料请关注其它相关文章!