【翻译】Kubernetes Ingress gRPC实例与Dune报价服务

2024-03-08 00:40

本文主要是介绍【翻译】Kubernetes Ingress gRPC实例与Dune报价服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

特邀文章,最初发表在Kong的博客上,作者是Kong的首席开发者倡导者Viktor Gamov

API有各种不同的形状和形式。在本教程中,我将向你展示一个Kubernetes Ingress gRPC实例。我将解释如何将gRPC服务部署到Kubernetes,并使用Kong的Kubernetes Ingress控制器提供对该服务的外部访问。

为了让你对即将上映的根据Frank Herbert的书改编的真人电影《沙丘》有一点期待,我创建了一个提供沙丘语录的Kubernetes服务。这可以说是有史以来最杰出的科幻书之一......你怎么看?让我知道@GAMUSSA在Twitter上。

在我们深入研究代码之前,让我们回顾一下一些基础知识。

gRPC如何与Kong一起工作?

gRPC是一个程序性框架,最初由谷歌在2015年开发。gRPC以HTTP2协议为传输基础,以Protobuf为接口定义语言,近年来被越来越多的人采用。gRPC有一些传统REST API难以企及的能力,比如双向流和高效的二进制编码。

Kong支持TCP流,可以代理任何建立在TCP或TLS之上的协议。我们认为,对gRPC的原生支持会让越来越多的用户群利用Kong来统一管理他们的REST和gRPC服务。


现在我们已经涵盖了基础知识,让我们来看看我的Dune报价服务的Protobuf定义。

Protobuf的定义

我的Protobuf定义包含一个使用两种方法的报价服务。一种方法是在任何gRPC请求上提供一个简单的报价。该方法不需要任何输入参数,所以我们将使用Protobuf的空类型。作为一个返回,它将有一个包含消息字段的报价信息。

而我这里的另一个方法是一个GetQuoteStream方法,它也不需要提供任何参数。在这种情况下,我也使用了一个空类型。但在这种情况下,我将返回这些结果的一个流。

syntax = "proto3"; package io.kong.developer.quoteservice; import "google/protobuf/empty.proto"; option java_multiple_files = true; option java_package = "io.kong.developer.quoteservice"; service QuoteService { rpc GetQuote(google.protobuf.Empty) returns (QuoteMessage) ; rpc GetQuoteStream(google.protobuf.Empty) returns (stream QuoteMessage) ; } message QuoteMessage{ string message = 1; }

我是用Java来生成服务的服务器端实现的。然而,你可以利用这个proto文件,用你使用的任何语言实现这个服务。

Protobuf带有不同语言的各种工具,包括一些支持你选择的语言的代码生成器。


让我们来看看我们的Dune报价服务的部署。

Kubernetes部署回顾

我在部署中使用相同的镜像,但我的活动服务将使用版本3。

--- apiVersion: apps/v1 kind:Deployment metadata: name: dune-quote-service spec: replicas:1 selector: matchLabels: app: dune-quote-service template: metadata: labels: app: dune-quote-service spec: containers: - image: gamussa/reactive-quote-service:0.0.3 imagePullPolicy:Always name: dune-quote-service ports: - containerPort: 9001 env: - name: GRPC_SERVER_PORT value:"9001" - name: GRPC_SERVER_SECURITY_ENABLED value:"true" - name: GRPC_SERVER_SECURITY_CERTIFICATECHAIN value:"file:/mnt/grpc-cert-chain/server.crt" - name: GRPC_SERVER_SECURITY_PRIVATEKEY value:"file:/mnt/grpc-pk/server.key" volumeMounts: - mountPath:/mnt/grpc-cert-chain name: grpc-cert-chain - mountPath:/mnt/grpc-pk name: grpc-pk volumes: - name: grpc-ert-chain secret: secretName: grpc-ert-chain - name: grpc-pk secret: secretName: grpc-pk

我的应用程序将在9001端口上运行GRPC_SERVER。这个端口将提供给服务,以便在我的Kubernetes集群中公开这个端口。

我的服务已经启用了安全功能。而且我确实在gRPC服务器的私钥中提供了一些证书。

         name: dune-quote-service ports: - containerPort: 9001 env: - name: GRPC_SERVER_PORT value:"9001" - name: GRPC_SERVER_SECURITY_ENABLED value:"true" - name: GRPC_SERVER_SECURITY_CERTIFICATECHAIN value:"file:/mnt/grpc-cert-chain/server.crt" - name: GRPC_SERVER_SECURITY_PRIVATEKEY value:"file:/mnt/grpc-pk/server.key"。

我在这个例子中使用了一个自签的TLS证书。你需要使用一个由你在生产用例中信任的认证机构签署的证书。

我创建了这些秘密。之后,我把这些秘密作为文件挂载在我的部署中。

       volumeMounts: - mountPath:/mnt/grpc-cert-chain name: grpc-cert-chain - mountPath:/mnt/grpc-pk 名称:grpc-pk

服务回顾

我的服务将使用9001端口作为我的目标端口。请注意第6行,在那里我有限制:konghq.com/protocol。它将响应gRPC这个协议,因为我的服务已经启用了安全功能,我需要通知我的Kong Gateway我的服务能理解gRPCS协议。

--- apiVersion: v1 kind: Service metadata: annotations: konghq.com/protocol: grpcs name: dune-quote-service labels: app: dune-quote-service spec: ports: - name: grpc port:目标端口:9001 选择器:应用:Dune-quote-service


最后但并非最不重要的是,我需要创建一个接入点。

入口设置

你会看到一些熟悉的东西,比如与我的开源Kong Ingress Controller相对应的ingress.class。现在,我在这里也有一个注释:konghq.com/protocols

--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dune-quote-service annotations: konghq.com/protocols: grpc,grpcs kubernetes.io/ingress.class: kong kubernetes.io/tls-acme:"true" cert-manager.io/cluster-issuer: letsencrypt-prod spec: tls: - secretName: kong.gamov.dev hosts: - kong.gamov.dev rules: - host: kong.gamov.dev http: paths: - pathType:/ pathType:具体实施的后端: 服务: 名称: dune-quote-service 端口: 数量: 9001

这是一个入口配置,允许Kong Gateway了解我们期待什么样的入站客户。在本例中,我们为gRPCS创建这个入口,因为我们期待gRPC客户端连接到该服务。我们正在使用gRPC或gRPCS协议。


在部署Kubernetes服务之前,我们需要设置Kong Ingress Controller和Kubernetes cert-manager。

Ingress控制器和Cert管理器的设置

我已经安装了Kong Ingress Controller。如果你还没有,请跟随我之前的入门教程。

我将我的集群配置为使用cert-manager。我将使用由LetsEncrypt颁发的证书。在Kong的文档中,有一个cert-manager的入门指南,允许你配置Kong的Ingress控制器和你的API网关,以使用自动颁发的TLS证书。

接下来,我们需要遵循Kubernetes cert-manager文档。

然后,我们就可以向认证机构申请TLS证书了。而后,应用程序将使用443端口的TLS与外部客户通信。

这就是为什么我有这个注释,kubernetes.io/tls-acme,为我的集群使用一个自动的证书管理扩展启用。我使用LetsEncrypt服务器的生产版本来接收证书。

kubernetes.io/tls-acme。"true" cert-manager.io/cluster-issuer: letsencrypt-prod

下一件事是配置我的ingress。我需要指定我的入口使用TLS,并为这个域名签发一个证书。这个域名对应于谷歌云平台提供的外部 IP 地址。

spec: tls: - secretName: kong.gamov.dev hosts: - kong.gamov.dev

这是对特定路径的相同配置规则。默认情况下,这将对应于我的Dune Quote服务。

- path:/ pathType:ImplementationSpecific backend: service: name: dune-quote-service port: number: 9001

入站流量将监听gRPC或gRPCS协议。我的Kong Gateway和Dune Quote服务也将使用gRPCS协议,因为我使用gRPCS部署我的服务。

  konghq.com/protocols: grpc,grpcs kubernetes.io/ingress.class: kong kubernetes.io/tls-acme:"true" cert-manager.io/cluster-issuer: letsencrypt-prod

下一件事是配置我的ingress。我需要指定我的入口使用TLS,并为这个域名签发一个证书。这个域名对应于谷歌云平台提供的外部 IP 地址。

spec: tls: - secretName: kong.gamov.dev hosts: - kong.gamov.dev

这是对特定路径的相同配置规则。默认情况下,这将对应于我的Dune Quote服务。

        - path:/ pathType:ImplementationSpecific backend: service: name: dune-quote-service port: number: 9001

入站流量将监听gRPC或gRPCS协议。我的Kong Gateway和Dune Quote服务也将使用gRPCS协议,因为我使用gRPCS部署我的服务。

  konghq.com/protocols: grpc,grpcs kubernetes.io/ingress.class: kong kubernetes.io/tls-acme:"true" cert-manager.io/cluster-issuer: letsencrypt-prod

部署Kubernetes服务

在我们部署之前,我们需要提供两个秘密。

Kubernetes Ingress gRPC example deployment

我们可以用下面的脚本来提供这些秘密。它生成了一个自签名的证书,之后,应用这个证书和密钥作为我的秘密。

#! /usr/bin/env bash openssl req -x509 -nodes -subj "/CN=gamov.dev" -newkey rsa:4096 -sha256 -keyout server.key -out server.crt -days 3650 kubectl create secret generic grpc-cert-chain --from-file=server.crt=server.crt kubectl create secret generic grpc-pk --from-file=server.key=server.key


接下来,让我们重新启动部署并启动我们的服务。

测试服务

一旦我们的服务启动了,我们就可以使用Insomnia来测试服务。

在Insomnia中,让我们上传我们的proto文件。一旦上传,我们将看到两个方法:GetQuote和GetQuoteStream。

Screenshot of Insomnia dashboard, clicking gRPC, unary, body to change proto file

当我们点击GetQuote时,我们从Dune获得一些报价。它起作用了!

Screenshot of Insomnia dashboard, GetQuote service responded 1 response

接下来,让我们通过切换到GetQuoteStream看看流媒体是否工作。当我点击开始时,我的响应包含了来自gRPCS服务器的10个响应。很好!

Screenshot of Insomnia dashboard, GetQuoteStream service responded 10 responses

而我的实现有一个拦截器,它将记录所有对我的服务的调用。

Screenshot of Kubernetes ingress gRPC example service deployed

这就是一个Wrap!

在这篇文章中,我向你展示了如何将gRPC服务部署到Kubernetes,并使用Kong Ingress Controller将其暴露在集群之外。

一旦你完成了这个Kubernetes Ingress gRPC的例子,你可能会发现这些其他的Kubernetes教程很有帮助。

  • 在Kong Konnect上配置一个Kubernetes应用程序
  • 用Kubernetes Ingress Controller管理Docker应用程序
  • 在Kubernetes中实施流量策略

这篇关于【翻译】Kubernetes Ingress gRPC实例与Dune报价服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785386

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务