在本文中,我们将简单了解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. unbutu的dpkg被中断的解决办法

    直接sudo apt update进行重新配置就行

  2. Git修改用户名、邮箱和密码

    $ git config --global --replace-all user.name "要修改的用户名" $ git config --global --replace-al ...

  3. MySQL数据库与python交互

    1.安装引入模块 安装mysql模块 pip install PyMySQL; 文件中引入模块 import pymysql 2.认识Connection对象 用于建立与数据库的连接 创建对象:调用c ...

  4. java例题_13 加上100再加上168的完全平方数问题

    1 /*13 [程序 13 根据条件求数字] 2 题目:一个整数,它加上 100 后是一个完全平方数,再加上 268 又是一个完全平方数,请问该数是多少? 3 程序分析:在 10万以内判断,先将该数加 ...

  5. Mysql之案例分析(一)

    可见性分析 CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGIN ...

  6. [模拟]P1047 校门外的树

    校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,- ...

  7. Dubbo 编解码那些事

    一.背景 笔者在一次维护基础公共组件的过程中,不小心修改了类的包路径.糟糕的是,这个类被各业务在facade中进行了引用.传递.幸运的是,同一个类,在提供者和消费者的包路径不一致,没有引起各业务报错. ...

  8. 【剑指offer】8:跳台阶

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 解题思路: 这种题目多为找规律求通用公式并最终用代码实现. 首先,考 ...

  9. LAMP架构上线动态网站WordPress

    第一步,一键安装LAMP架构所需要的程序 yum install -y httpd mariadb-server php php-mysql 第二步,配置httpd,修改主配置文件/etc/httpd ...

  10. element UI el-autocomplete 带输入建议的输入框

    项目需求:需要用户在输入框中输入公司 全名    但是为了避免用户输入不全   需要做一个带输入建议的输入框 参考:https://www.jianshu.com/p/de922caf337c