在本文中,我们将简单了解k3d,这是一款可让您在安装了Docker的任何地方运行一次性Kubernetes集群的工具,此外在本文中我们还将探讨在使用k3d中可能会出现的一切问题。

什么是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- k3s-default-serverlb和k3d-k3s-default-server-0

k3d等待一切准备就绪,从集群中拉取Kubeconfig并将其与默认的Kubeconfig合并(通常位于$ HOME / .kube / config或者KUBECONFIG环境变量指向的任何路径中)。

不用担心,您也可以调整该行为。

使用kubectl查看您刚创建的用于显示节点的内容:. kubectl get nodes

k3d还为您提供了一些命令来列出您所创建的东西:.k3d cluster | node | registry list

“简单但精妙”的方式

k3d cluster create mycluster --api-port 127.0.0.1:6445 --servers 3 --agents 2 --volume '/home/me/mycode:/code@agent[*]' --port '8080:80@loadbalancer'

此命令生成带有六个容器的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模式:

https://github.com/rancher/k3d/blob/092f26a4e27eaf9d3a5bc32b249f897f448bc1ce/pkg/config/v1alpha2/schema.json

示例配置文件:

# k3d configuration file, saved as e.g. /home/me/myk3dcluster.yaml
apiVersion: k3d.io/v1alpha2 # this will change in the future as we make everything more stable
kind: Simple # internally, we also have a Cluster config, which is not yet available externally
name: mycluster # name that you want to give to your cluster (will still be prefixed with `k3d-`)
servers: 1 # same as `--servers 1`
agents: 2 # same as `--agents 2`
kubeAPI: # same as `--api-port 127.0.0.1:6445`
hostIP: "127.0.0.1"
hostPort: "6445"
ports:
- port: 8080:80 # same as `--port 8080:80@loadbalancer
nodeFilters:
- loadbalancer
options:
k3d: # k3d runtime settings
wait: true # wait for cluster to be usable before returining; same as `--wait` (default: true)
timeout: "60s" # wait timeout before aborting; same as `--timeout 60s`
k3s: # options passed on to K3s itself
extraServerArgs: # additional arguments passed to the `k3s server` command
- --tls-san=my.host.domain
extraAgentArgs: [] # addditional arguments passed to the `k3s agent` command
kubeconfig:
updateDefaultKubeconfig: true # add new cluster to your default Kubeconfig; same as `--kubeconfig-update-default` (default: true)
switchCurrentContext: true # also set current-context to the new cluster's context; same as `--kubeconfig-switch-context` (default: true)

假设我们将其另存为/home/me/myk3dcluster.yaml,我们可以使用它来配置新集群

k3d cluster create --config /home/me/myk3dcluster.yaml

注意:您仍然可以设置额外的参数或标志,这些参数或标志将优先于(或将被合并)你在配置文件中定义的任何参数。

k3d还能做什么?

你可以在很多场景下使用k3d,例如:

您可以通过使用在此demo repo中准备好的脚本来自己尝试所有这些操作:

https://github.com/iwilltry42/k3d-demo。

THORSTEN KLEIN

trivago的DevOps工程师,SUSE自由软件工程师,也是k3d的维护者。

k3d入门指南:在Docker中运行K3s的更多相关文章

  1. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  2. .NET Core Web 应用部署到 Docker 中运行

    环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...

  3. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  4. 在Docker中运行torch版的neural style

    相关的代码都在Github上,请参见我的Github,https://github.com/lijingpeng/deep-learning-notes 敬请多多关注哈~~~ 在Docker中运行to ...

  5. ASP.NET Core 网站在Docker中运行

    Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...

  6. 在Docker中运行EOS(MAC版)

    在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河.记录如下: 安装依赖 Docker 版本 17.05或者更高 tes ...

  7. 在docker中运行jenkins实现代码自动发布到测试服务器

    在docker中运行jenkins 用的镜像是apline版:lts-alpine,并设置正确的时区. docker run --name jenkins_master -d \ -p 8081:80 ...

  8. 在Docker中运行纸壳CMS并配置使用MySql

    纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...

  9. 在docker中运行elasticsearch时go程序无法连接到节点

    错误信息: panic: no active connection found: no Elasticsearch node available 在docker中运行es时,默认启动sniffing  ...

随机推荐

  1. HTML5中window.postMessage,在两个页面之间的数据传递

    HTML5中window.postMessage,在两个页面之间的数据传递 2015年11月3日 8536次浏览 关于postMessage window.postMessage虽然说是html5的功 ...

  2. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  3. python常见错误和异常

    1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...

  4. P1739_表达式括号匹配(JAVA语言)

    思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...

  5. P1089_津津的储蓄计划(JAVA语言)

    package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...

  6. Dcoker-搭建日志监控系统

    项目中常用集中日志收集工具 Logstash Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 优 ...

  7. 【转载】C# get 与set的一些说明

    转载 在面向对象编程(OOP)中,是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象 ...

  8. Linux保护机制和绕过方式

    Linux保护机制和绕过方式 CANNARY(栈保护) ​ 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.用C ...

  9. linux编译安装Apache

    1 前言 编译安装Apache HTTP Server,目前最新的版本为2.4.41,做好apr,apr-util,pcre的安装后编译安装即可. 2 准备工作 三个:apr,apr-util,pcr ...

  10. kubectl cp 从k8s pod 中 拷贝 文件到本地

    请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...