简述

K8S 如火如荼的发展着,越来越多人想学习和了解 K8S,但是由于 K8S 的入门曲线较高很多人望而却步。

然而随着 K8S 生态的蓬勃发展,社区也呈现了越来越多的部署方案,光针对生产可用的环境就有好几种部署方案,对于用来测试和学习环境也同样提供了好几种简单可用的方案。

今天我们来介绍一种用于测试、学习环境快速搭建 K8S 环境的方案:Kind。

Kind 的官网是:https://kind.sigs.k8s.io/

那么 Kind 相比于 Minikube 有什么优势呢?

基于 Docker 而不是虚拟化

运行架构图如下:



Kind 不是打包一个虚拟化镜像,而是直接讲 K8S 组件运行在 Docker。带来了什么好处呢?

  1. 不需要运行 GuestOS 占用资源更低。
  2. 不基于虚拟化技术,可以在 VM 中使用。
  3. 文件更小,更利于移植。

支持多节点 K8S 集群和 HA

Kind 支持多角色的节点部署,你可以通过配置文件控制你需要几个 Master 节点,几个 Worker 节点,以更好的模拟生产中的实际环境。

安装 Kind

Kind 的安装非常简单,只有一个二进制文件,如果大家嫌麻烦,可以直接去 GitHub releases 上下载二进制文件即可。

下面的安装方式来自 Kind 文档 https://kind.sigs.k8s.io/docs/user/quick-start/

macOS / Linux

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.8.1/kind-$(uname)-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

macOS / Linux 使用 Homebrew

brew install kind

Windows

curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.8.1/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

Windows 使用 Chocolatey

choco install kind

创建 K8S 集群

如果你在 macOS 或 Windows 中使用 Docker 那么至少需要设置 Docker VM 的内存至 6GB,Kind 建议设置为 8GB。

不是不基于虚拟化技术吗?为什么还有 Docker VM?

因为 Docker 其实只支持 Linux,macOS 和 Windwos 是基于虚拟化技术创建了一个 Linux VM。在 Linux 系统上则不存在这些问题。

最简单的情况,我们使用一条命令就能创建出一个单节点的 K8S 环境

kind create cluster

可是呢,默认配置有几个限制大多数情况是不满足实际需要的,默认配置的主要限制如下:

  1. APIServer 只监听了 127.0.0.1,也就意味着在 Kind 的本机环境之外无法访问 APIServer
  2. 由于国内的网络情况关系,Docker Hub 镜像站经常无法访问或超时,会导致无法拉取镜像或拉取镜像非常的慢

这边提供一个配置文件来解除上诉的限制:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
apiServerAddress: "<API_SERVER_ADDRESS>"
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["http://f1361db2.m.daocloud.io"]

API_SERVER_ADDRESS 配置局域网 IP 或想监听的 IP

http://f1361db2.m.daocloud.io 配置 Docker Hub 加速镜像站点

更多的配置(多节点,节点中运行的 K8S 组件版本,APIServer 监听端口,Pod、Service 子网,kubeProxy 模式,端口映射,本地卷持久化)可以查看 Kind 的文档

https://kind.sigs.k8s.io/docs/user/configuration/

创建完成效果如下:

如果长时间卡在 Ensuring node image (kindest/node:v1.18.2) 这个步骤,可以使用 docker pull kindest/node:v1.18.2 来得到镜像拉取进度条。

复制集群配置文件

Kind 创建集群完成后会将集群的访问配置写入到 ~/.kube/config 中,可以复制或加入到有 kubectl 工具的环境中。

切换 kubectl 集群上下文

kubectl cluster-info --context kind-kind

如何访问 K8S 中的 IP

我们在 K8S 中部署应用程序,一般有 4 种方式访问他们。

  1. 直接访问 PodIP
  2. 通过 Service 的 ClusterIP 访问
  3. 通过 Service 的 NodePort 访问
  4. 通过 Ingress Service NodePort 访问

其中方式 1、2 需要访问客户端在 K8S 网络环境内。方式 3、4 其实是一种,通过机器的端口映射来触达应用。

个人觉得直接访问 IP+端口更为方便,这边不对 Ingress 做过多的介绍,大家可以看 Kind 关于 Ingress 的文档。

https://kind.sigs.k8s.io/docs/user/ingress/

这边介绍通过 kubectl port-forward 端口转发的方式访问 K8S 中的应用。

部署一个 Nginx Deployment 和 Service

yaml 如下:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-tcp
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
kubectl create nginx.yaml
kubectl port-forward service/nginx 8080:80

效果如下

可以看到我们将本地的 8080 转发到了 nginx service 的 80 端口,这时访问本地的 8080 端口就可以访问到 service nginx 的 80 端口。

常见问题

Kind 能在一台机器上创建多个 K8S 集群吗?

可以的,kind create cluster 提供了 --name 参数,可以为 K8S 集群设置名称。

但是要注意 API Server 的监听地址/端口不能重复或被占用。

怎么设置指定的 K8S 版本?

kind create cluster 提供了 --image 参数,可以设置 kindest/node 镜像的版本,一般与 K8S 发布的版本一一对应,具体提供了哪些版本可以去 DockerHub 上查看。

https://hub.docker.com/r/kindest/node/tags

这个功能很酷,在做兼容性测试的时候可以创建一个目标版本的集群进行测试,真是不要太方便。

我的应用镜像没有发布到镜像库如何在 K8S 中使用?

可以通过如下几种方式:

  1. kind load
  2. 本地镜像库
  3. 私有镜像库

一般来说可以通过 kind load 将客户机上的镜像加载到 K8S 环境中去。例如将本机的 nginx 镜像加载到 Kind 的 K8S 环境中。

kind load docker-image nginx nginx

甚至可以为镜像起别名

kind load docker-image nginx nginx:test

具体使用方式可以访问 cli 的帮助

kind load -h
kind load docker-image -h
kind load image-archive -h

Kind 的本地镜像库使用方式见文档:https://kind.sigs.k8s.io/docs/user/local-registry/

私有镜像库使用方式见文档:https://kind.sigs.k8s.io/docs/user/private-registries/

还有其它问题?

还有遇到其它问题,欢迎给我留言。

比Minikube更快,使用Kind快速创建K8S学习环境的更多相关文章

  1. ML-Agents(二)创建一个学习环境

    ML-Agents(二)创建一个学习环境 一.前言 上一节我们讲了如何配置ML-Agents环境,这一节我们创建一个示例,主要利用Reinforcement Learning(强化学习). 如上图,本 ...

  2. AWS EKS 创建k8s生产环境实例

    #AWS EKS 创建k8s生产环境实例 在AWS部署海外节点, 图简单使用web控制台创建VPC和k8s集群出错(k8s), 使用cli命令行工具创建成功 本实例为复盘, 记录aws命令行工具创建e ...

  3. 教你如何用Docker快速搭建深度学习环境

    本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...

  4. 如何使用 Kind 快速创建 K8s 集群?

    作者|段超 来源|尔达 Erda 公众号 ​ 导读:Erda 作为一站式云原生 PaaS 平台,现已面向广大开发者完成 70w+ 核心代码全部开源!在 Erda 开源的同时,我们计划编写<基于 ...

  5. Create-React-App创建antd-mobile开发环境

    Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详细文档可前往链接:Create-React-App文 ...

  6. 在.NET中快速创建一个5GB、10GB或更大的空文件

    对于通过UDP进行打文件传输的朋友应该首先会考虑到一个问题,那就是由于UDP并不会根据先来先到原则进行发送,也许你发送端发送的时候是以包1和包2的顺序传输的,但接收端可能以包2和包1 的顺序来进行接收 ...

  7. 【快学springboot】1.快速创建springboot项目

    若图片查看异常,请前往掘金查看:https://juejin.im/post/5d00e793f265da1b614ff10b 使用spring initialize工具快速创建springboot项 ...

  8. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  9. CSS 和 JS 动画哪个更快

    基于Javascript的动画暗中同CSS过渡效果一样,甚至更加快,这怎么可能呢?而Adobe和Google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢? 本文逐一遍览了基于Javas ...

随机推荐

  1. Java实现 LeetCode 513 找树左下角的值

    513. 找树左下角的值 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输 ...

  2. hackrf 输出功率测试

    使用PortaPack H1的话筒发射功能测试: 144M :8dbm 430M:6dbm 950M:6dbm 1545.42M:0.5dbm 7.42M:18.5dbm 14.2M:16.3dbm

  3. ProxySQL简介原理及读写分离应用

    MySQL-ProxySQL中间件简介 同类型产品 MySQL Route:是现在MySQL官方Oracle公司发布出来的一个中间件. Atlas:是由奇虎360公发的基于MySQL协议的数据库中间件 ...

  4. 关于EF的五种状态

    最近半个多月没更新原因是在赶项目...在做项目的时候就会发现自己很多问题,也有很多东西要记录,今天就记录一下对ef新的认识. 也就是关于ef的五种状态管理. Unchanged(持久态) Midifi ...

  5. MongoDB知识点总结

    一:MongoDB 概述    一.NoSQL 简介 1. 概念:NoSQL(Not Only SQL的缩写),指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数 ...

  6. 关于mysql auto-increment

    创建表语句如下mysql> show create table Tautoincrement\G *************************** 1. row ************* ...

  7. 03.Java的前世今生

    C&C++ 1972年C诞生 ◆贴近硬件,运行极快,效率极高. ◆操作系统,编译器,数据库,网络系统等 ◆指针和内存管理 1982年C++诞生 ◆面向对象 ◆兼容C ◆图形领域.游戏等 背景 ...

  8. [转] C++中的namespace

    点击阅读原文 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都 ...

  9. @atcoder - AGC024F@ Simple Subsequence Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定由若干长度 <= N 的 01 字符串组成的集合 S. ...

  10. TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)

    TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.它使用梯度自动更新用变量定义的张量.本节将使用 TensorFlow 优化器来训练网络. 前面章节中,我们定 ...