K3s+Ambassador,强大的轻量级K8S解决方案
作者简介
Kubernetes为微服务提供了一个强大的网络模式。该模式的主要部分之一是每个pod都有自己的IP地址,在集群内可以寻址。因此,每个Kubernetes集群通常有一个扁平的虚拟网络,使得外部host不能够直接访问。那意味着从集群外部的客户端路由流量到部署在集群内的服务需要进行一些额外的工作。对于路由流量到Kubernetes集群内部有各种策略,其中最常的方法是使用ingress controller。
Ingress Controllers
Ingress controller路由来自集群外部的流量,并负责将流量路由到集群内部的各个服务中。Ingress controller的名称来源与它可以处理Ingress资源,这是一种特殊类型的Kubernetes资源,它指定了这些路由规则。
Ingress controller构建在诸如HAProxy、NGINX、Traefik以及Envoy Proxy等代理上。Envoy Proxy起初由Lyft编写和部署,但发展至今已经成为CNCF的其中一个项目,数十家企业都对其做了贡献,包括亚马逊、Airbnb、Google、Pinterest以及VMware。
K3s、Rancher以及Ambassador
K3s是一个轻量级Kubernetes发行版,可以运行在资源有限环境,例如IoT或边缘设备以及部署笔记本上。对于将容器构建在Kubernetes上的团队来说,Rancher是一个完整的软件堆栈。无论是K3s还是Rancher均支持各类功能不同的Ingress controller。
在本文中,我们将了解如何在K3s上部署Ambassador。Ambassador是基于Envoy Proxy构建的开源Ingress controller和API网关。Ambassador向Kubernetes用户公开了许多Envoy Proxy的核心功能,包括零宕机重载、高级流量管理、服务网格集成(支持Consul、Linkerd和Istio)、可观察性、TLS终止和灵活的API用于速率限制和认证。Ambassador已经进行了诸多调整,以便在Kubernetes上获得最大的性能,并能够以最少的资源运行。
部署带有Ambassador的K3s
默认情况下,K3s将Traefik作为ingress controller。要使用Ambassador和Envoy Proxy需要按照以下步骤操作(这些步骤假设你已经安装好了K3s,如果你尚未安装请根据先快速指南进行安装:
https://rancher.com/docs/k3s/latest/en/quick-start/)
1、 使用--disable treafik选项启动K3s。你可以通过编辑/etc/systemd/system/k3s.service进行此操作并且编辑ExecStart行:
ExecStart=/usr/local/bin/k3s \
server \
--disable traefik \
2、 重启K3s
sudo systemctl daemon-reload
sudo systemctl restart k3s.service
3、 通过应用标准的Ambassador Kubernetes manifest安装Ambassador(Ambassador也支持Helm安装:
https://www.getambassador.io/docs/latest/topics/install/helm/)
kubectl apply -f https://www.getambassador.io/yaml/ambassador/ambassador-crds.yaml
kubectl apply -f https://www.getambassador.io/yaml/ambassador/ambassador-rbac.yaml
kubectl apply -f https://www.getambassador.io/yaml/ambassador/ambassador-service.yaml
4、 现在我们将部署一个简单的服务。保存以下Kubernetes YAML到文件中,称为quote.yaml.
---
apiVersion: v1
kind: Service
metadata:
name: quote
spec:
ports:
name: http
port: 80
targetPort: 8080
selector:
app: quote
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: quote
spec:
replicas: 1
selector:
matchLabels:
app: quote
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: quote
spec:
containers:
name: backend
image: docker.io/datawire/quote:0.4.1
ports:
name: http
containerPort: 8080
5、 部署quote服务到K3s:kubectl apply -f quote.yaml
6、 Ambassador支持标准的Kubernetes ingress资源进行路由。Ingress资源是单体对象,既包括Ingress本身的配置(如TLS配置),也包括路由。然而,官方的ingress标准相当有限,所以大多数Ambassador用户都依赖Mapping,Mapping是Ambassador特有的自定义资源定义。Mapping资源与Ambassador的部署完全解耦,使得Mapping资源只是用来描述请求路由。将下面的YAML配置保存到一个名为quote-mapping.yaml的文件中。
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
name: quote-backend
spec:
prefix: /give-me-a-quote/
service: quote
7、 应用配置到集群:
kubectl apply -f quote-mapping.yaml
8、 获取Ambassador LoadBalancer 服务的IP地址:
sudo kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1
443/TCP 60m NodePort 10.43.134.74
8877:31032/TCP 5m15s ambassador LoadBalancer 10.43.61.86 10.128.0.111 80:31347/TCP 89s
quote ClusterIP 10.43.129.249
80/TCP 31s
9、 复制IP地址并测试配置:
curl http://
$ curl 10.128.0.111/give-me-a-quote/
{
"server": "harmonious-strawberry-z6onbsu2",
"quote": "A small mercy is nothing at all?",
"time": "2020-07-15T13:59:50.716712445Z"
}
恭喜你!你已经成功使用Ambassador来路由一个HTTP请求到quote服务。
总 结
Ambassador提供了一套丰富的功能,包括认证、速率限制和丰富的协议支持(如TCP、WebSockets、gRPC、HTTP)。Ambassador还拥有一套经过测试的与其他云原生基础设施的集成,如监控系统和服务网格。K3s和Ambassador一起使用是一个强大的轻量级Kubernetes解决方案,非常适用于开发和生产。
推荐阅读
扫码添加k3s中文社区助手
加入官方中文技术社区
官网:https://k3s.io