我的工作中很重要的一部分是参加各种各样的技术会议。最近参加的是去年11月的北美KubeCon,在会议的最后一天,所有人都焦头烂额,我也一直机械地向不同的人重复我的自我介绍。后来,我已经十分烦躁,决定逃离人群好好听一场演讲。无意间,我碰上了Darren Shepherd的演讲,他是Rancher的CTO,他的演讲主题是“K3s的背后:构建一个生产级轻量Kubernetes发行版”。我被演讲深深吸引,此后我开始慢慢深入了解K3s。

K3s是由业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs打造的面向物联网和边缘计算的轻量级Kubernetes发行版,它是100%开源的。它拥有小型的二进制文件并且针对ARM进行了优化使得它非常适合我的IoT家庭项目。接着,我开始思考如何让K3s上运行的Kong网关暴露K3s server内的服务。

出乎我意料的是,K3s在默认情况下是带有一个Ingress controller的。虽然默认的proxy/负载均衡器可以工作,但我需要一些插件的功能它并不支持,除非我使用Kong网关。所以,让我们通过一个快速指南来了解如何在Ubuntu中启动K3s,配置它以支持Kubernetes的Kong,并部署一些服务/插件。

配置K3s以部署Kong Ingress Controller

首先,从https://get.k3s.io 使用安装脚本在systemd和基于openrc的系统上将K3s作为一个服务进行安装。但是我们需要添加一些额外的环境变量来配置安装。首先--no-deploy,这一命令可以关掉现有的ingress controller,因为我们想要部署Kong以利用一些插件。其次--write-kubeconfig-mode,它允许写入kubeconfig文件。这对于允许将K3s集群导入Rancher很有用。

$ curl -sfL https://get.k3s.io | sh -s - --no-deploy traefik --write-kubeconfig-mode 644
[INFO] Finding release for channel stable
[INFO] Using v1.18.4+k3s1 as release
[INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v1.18.4+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v1.18.4+k3s1/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Skipping /usr/local/bin/kubectl symlink to k3s, already exists
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s

要检查节点和 pod是否都已启动并运行,使用 k3s kubectl...运行与 kubectl 相同的命令。

$ k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
ubuntu-xenial Ready master 4m38s v1.18.4+k3s1 $ k3s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system metrics-server-7566d596c8-vqqz7 1/1 Running 0 4m30s
kube-system local-path-provisioner-6d59f47c7-tcs2l 1/1 Running 0 4m30s
kube-system coredns-8655855d6-rjzrq 1/1 Running 0 4m30s

在K3s 上安装Kong for Kubernetes

K3s启动并运行后,你可以按照正常的步骤安装Kong for Kubernetes,比如如下所示的manifest:

$ k3s kubectl create -f https://bit.ly/k4k8s
namespace/kong created
customresourcedefinition.apiextensions.k8s.io/kongclusterplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongconsumers.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongcredentials.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongingresses.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/tcpingresses.configuration.konghq.com created
serviceaccount/kong-serviceaccount created
clusterrole.rbac.authorization.k8s.io/kong-ingress-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/kong-ingress-clusterrole-nisa-binding created
service/kong-proxy created
service/kong-validation-webhook created
deployment.apps/ingress-kong created

当Kong proxy和ingress controller安装到K3s server上后,你检查服务应该能看到kong-proxy LoadBalancer的外部IP。

$ k3s kubectl get svc --namespace kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-validation-webhook ClusterIP 10.43.157.178 <none> 443/TCP 61s
kong-proxy LoadBalancer 10.43.63.117 10.0.2.15 80:32427/TCP,443:30563/TCP

运行以下命令,将IP导出为一个变量:

$ PROXY_IP=$(k3s kubectl get services --namespace kong kong-proxy -o jsonpath={.status.loadBalancer.ingress[0].ip})

最后,在我们抛出proxy后的任何服务之前,检查proxy是否有响应:

$ curl -i $PROXY_IP
HTTP/1.1 404 Not Found
Date: Mon, 29 Jun 2020 20:31:16 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 48
X-Kong-Response-Latency: 0
Server: kong/2.0.4 {"message":"no Route matched with those values"}

它应该返回404,因为我们还没有在K3s中添加任何服务。但正如你在请求头(header)中看到的那样,它正在被最新版本的Kong代理,并显示了一些额外的信息,比如响应延迟。

设置你的K3s应用程序以测试Kong Ingress Controller

现在,让我们在K3s中设置一个回显服务器(echo server)应用程序以演示如何使用Kong Ingress Controller:

$ k3s kubectl apply -f https://bit.ly/echo-service
service/echo created
deployment.apps/echo created

接下来,创建一个ingress规则以代理之前创建的echo-server:

$ echo "
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo
spec:
rules:
- http:
paths:
- path: /foo
backend:
serviceName: echo
servicePort: 80
" | k3s kubectl apply -f -
ingress.extensions/demo created

测试Ingress 规则:

$ curl -i $PROXY_IP/foo
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Mon, 29 Jun 2020 20:31:07 GMT
Server: echoserver
X-Kong-Upstream-Latency: 0
X-Kong-Proxy-Latency: 1
Via: kong/2.0.4 Hostname: echo-78b867555-jkhhl Pod Information:
node name: ubuntu-xenial
pod name: echo-78b867555-jkhhl
pod namespace: default
pod IP: 10.42.0.7
<-- clipped -->

如果一切都部署正确,你应该看到以上响应。这验证了Kong可以正确路由流量到运行在Kubernetes中的应用程序。

使用Kong Ingress安装一个速率限制插件

Kong Ingress允许插件在服务级别上执行,也就是说,每当一个请求被发送到一个特定的K3s服务时,无论它来自哪个Ingress路径,Kong都会执行一个插件。你也可以在Ingress路径上附加插件。但在下面的步骤中,我将使用限制速率插件来限制IP在任何一个特定的服务上发出过多的请求。

创建一个KongPlugin资源:

$ echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: rl-by-ip
config:
minute: 5
limit_by: ip
policy: local
plugin: rate-limiting
" | k3s kubectl apply -f -
kongplugin.configuration.konghq.com/rl-by-ip created

接下来,在需要限制速率的K3s服务上应用konghq.com/plugins注释。

$ k3s kubectl patch svc echo -p '{"metadata":{"annotations":{"konghq.com/plugins": "rl-by-ip\n"}}}'
service/echo patched

现在,任何发送到这项服务的请求都将受到Kong执行的速率限制的保护:

$ curl -I $PROXY_IP/foo
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Connection: keep-alive
Date: Mon, 29 Jun 2020 20:35:40 GMT
Server: echoserver
X-RateLimit-Remaining-Minute: 4
X-RateLimit-Limit-Minute: 5
RateLimit-Remaining: 4
RateLimit-Limit: 5
RateLimit-Reset: 20
X-Kong-Upstream-Latency: 5
X-Kong-Proxy-Latency: 2
Via: kong/2.0.4

从这一个小小的实践可以看出来,K3s其实拥有无限可能,因为你可以将任何插件添加到任何Ingress路径或服务上。你可以从Kong Hub上找到所有插件。在家庭自动化项目中,这十分方便,你还可以利用树莓派来运行K3s,并通过各类插件赋予K3s更多可能。

在K3s上使用Kong网关插件,开启K3s的无限可能!的更多相关文章

  1. API网关之Kong网关简介

    1. Kong简介 那么,Kong是一个什么东东呢?它是一个开源的API网关,或者你可以认为它是一个针对API的一个管理工具.你可以在那些上游service之上,额外去实现一些功能.Kong是开源的, ...

  2. k8s实践 - 如何优雅地给kong网关配置证书和插件。

    前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...

  3. kong网关命令(一)

    上次在虚拟机里安装kong网关后,因为版本(1.4)太高,目前Kong Dashboard无法支持, 后续发现Git上有个开源工具Kong admin ui,下载源码并部署到NGINX. 但是发现使用 ...

  4. 大文件上传组件webupload插件

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  5. 使用KONG网关实现接口迁移的灰度验证

    在我们对一个API站点进行微服务化的过程中,使用KONG网关可以实现以下几个效果: 1. 业务线无感知,其实内部已经被Kong转到其他站点上执行了,这对业务线特别友好. 2. 可以实现租户级/接口级灰 ...

  6. kong网关: service+route+upstream

    对于刚开始学习kong网关,总是一脑子浆糊迷迷糊糊.虽然已经安装好,但却不知道接下来如何下手, 因为包含项太多:service.routes.upstream.consumer.plugins等等.一 ...

  7. MacOs下安装Kong网关

    写在前面: 持续记录一下自己在解决api网关kong上的各种问题. 1.关于Kong网关 这是官网地址:https://konghq.com/ 2.通过brew安装postgres 因为kong的数据 ...

  8. Kong网关安装之Docker版(2)

    1.安装kong管理工具:konga或者kong-dashboard,这里选择konga 拉取konga镜像: sudo docker pull pantsel/konga:0.14.4 初始化kon ...

  9. 手把手教你玩转 Gitea|使用 Helm 在 K3s 上安装 Gitea

    前言 在前面的文章中,演示了如何用 Docker 镜像和 Windows 二进制包来安装运行 Gitea.今天是玩转 Gitea 系列的使用 Helm 在 K3s 上安装 Gitea. 关于 Gite ...

随机推荐

  1. 分布式ID生成服务,真的有必要搞一个

    目录 阐述背景 Leaf snowflake 模式介绍 Leaf segment 模式介绍 Leaf 改造支持RPC 阐述背景 不吹嘘,不夸张,项目中用到ID生成的场景确实挺多.比如业务要做幂等的时候 ...

  2. SpringBoot + Spring Cloud Consul 服务注册和发现

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  3. Statezhong shiyong redux props

    在构造方法中使用props给state赋值不允许, 原因需要检查

  4. 12天,这本《重学Java设计模式》PDF书籍下载量9k,新增粉丝1400人,Github上全球推荐榜!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言

  5. Spring boot 基础整理(一)

    环境准备 (1)JDK 环境必须是 1.8 及以上(2)后面要使用到 Maven 管理工具 3.2.5 及以上版本,所以会先介绍 Maven 的安装与配置(3)开发工具建议使用 IDEA,也可以 My ...

  6. 性能分析(2)- 应用程序 CPU 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 其中一台用作 Web 服务器,来模拟 ...

  7. PHP is_executable() 函数

    定义和用法 is_executable() 函数检查指定的文件是否可执行. 如果文件可执行,该函数返回 TRUE. 语法 is_executable(file) 参数 描述 file 必需.规定要检查 ...

  8. PHP fscanf() 函数

    定义和用法 fscanf() 函数根据指定的格式对来自打开的文件的输入进行解析. 语法 fscanf(file,format,mixed) 参数 描述 file 必需.规定要检查的文件. format ...

  9. Linux的VMWare下Centos7的三种网络配置过程(网络二)

    Linux之VMWare下Centos7的三种网络配置过程 环境:虚拟软件:VMWare 14.0客户机:windows 10虚拟机:centos 7 VMware三种网络连接方式 Bridge(桥接 ...

  10. 数据结构C语言实现----快速排序

     快速排序算法 首先看下面这个例子: 我们取第一个元素为基准元素: 之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一 ...