概述

一般情况下,我们的系统对外暴露HTTP/HTTPS的接口,内部使用rpc(GRPC)通讯,这时GRPC在服务之间通过service访问,本地调试时通过service nodePort方式调用。

但随着业务壮大,需要跨集群的GRPC通讯,或者pod数量太多、nodePort端口管理混乱时,就可以考虑用ingress来统一管理和暴露GRPC服务了。

本文详细介绍如何在kubernetes用ingress负载grpc服务。

  • 首先需要特别留意:ingress-nginx不支持负载明文的grpc(这个官方居然没明说,巨坑,详情请自行搜索github上的issues),所以只能在443端口上用TLS来负载。

搭建

生成公私钥

前面说了ingress只支持在443端口上负载加密的grpc,所以在正式搭建前需要准备一组公私钥。

这里我们可以自行生成一组普通的公私钥,下面的命令将在当前目录生成一组公私钥文件:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout grpcs.key -out grpcs.crt -subj "/CN=*.grpcs.aurayou/O=grpcs.aurayou"
$ ls
grpcs.crt grpcs.key

参数说明:

  • grpcs.key: 私钥文件名
  • grpcs.crt: 公钥文件名
  • .grpcs.aurayou: 域名后缀,后续所有使用此公私钥对的域名必须以.grpcs.aurayou为后缀

创建secret

将刚才生成的公私钥对导入k8s secret,创建名为grpcs-secret的secret:

$ kubectl create secret tls grpcs-secret --key grpcs.key --cert grpcs.crt
$ kube get secret
NAME TYPE DATA AGE
default-token-bhp5l kubernetes.io/service-account-token 3 88d
grpcs-secret kubernetes.io/tls 2 6h

创建ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: data-product
namespace: aurayou
spec:
rules:
- host: data-product.grpcs.aurayou
http:
paths:
- backend:
serviceName: data-product
servicePort: 50051
tls:
- secretName: grpcs-secret
hosts:
- data-product.grpcs.aurayou

参数说明:

  • 启用nginx:kubernetes.io/ingress.class: "nginx"
  • 启用TLS,下面两项2选1:
  • 由nginx负责tls,服务内部还是用明文传输:nginx.ingress.kubernetes.io/ssl-redirect: "true"、nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  • 由服务自行实现TLS,nginx只负责路由:nginx.ingress.kubernetes.io/backend-protocol: "GRPCS"
  • 域名:rules.host、tls.hosts这两个是该grpc服务的ingress域名,可以自定义,但必须以前面生成公私钥对时使用的后缀结尾
  • 服务: grpc服务的服务名和端口由rules.http.backend配置
  • 公私钥: tls.secretName指向前面创建的grpcs-secret

注意:ingress-nginx的搭建,最好使用官方的yaml文件,自定义的配置可能会有冲突之处。

访问

前面已经搭建好了grpc服务的ingress,外部服务访问该ingress时,需要加载刚才生成的公钥文件,golang代码关键点:

  • 访问明文的服务时,选项使用grpc.WithInsecure()
  • 访问加密的ingress时,选项使用grpc.WithTransportCredentials,并用credentials.NewClientTLSFromFile加载前面生成的公钥并指定需要访问的域名
	tcp_port := viper.GetString("server.tcp.port")
tcp_host := viper.GetString("server.tcp.host") tcp_address := tcp_host + tcp_port var dailOpts []grpc.DialOption
if tcp_port == ":443" {
// 走ingress 443端口,加密传输
// NewClientTLSFromFile()函数的参数1是前面生成的公钥文件,参数2是待访问的域名
creds, err := credentials.NewClientTLSFromFile("./grpcs.crt", "data-product.grpcs.aurayou")
if err != nil {
log.Fatalf("Failed to create TLS credentials %v", err)
}
dailOpts = append(dailOpts, grpc.WithTransportCredentials(creds))
} else {
// 访问明文的集群内部服务
dailOpts = append(dailOpts, grpc.WithInsecure())
} // Set up a connection to the server.
conn, err := grpc.Dial(tcp_address, dailOpts...)
if err != nil {
log.Fatalf("did not connect: %v", err)
}

[干货]kubenertes ingress负载grpc的更多相关文章

  1. 确实,k8s的时代,ingress负载用traefik比nginx方便啊

    参考文档: https://mritd.me/2016/12/06/try-traefik-on-kubernetes/#13ingress 由于微服务架构以及 Docker 技术和 kubernet ...

  2. k8s Ingress和ingress控制器

    ingress架构图简介 我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制 ...

  3. Kubernetes基于haproxy实现ingress服务暴露

    HAproxy Ingress控制器 HAproxy Ingress简介 HAProxy Ingress watches in the k8s cluster and how it builds HA ...

  4. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

  5. Swarm基于多主机容器网络 - overlay networks 梳理

    前面介绍了Docker管理工具-Swarm部署记录,下面重点说下Swarm基于多主机容器通信的覆盖网络 在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks) ...

  6. Docker三剑客之Docker Swarm

    一.什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/s ...

  7. Swarm使用原生的overlay网络

    一.Swarm Overlay Network Swarm有Service的概念.一个Service是指使用相同镜像.同时运行的多个容器,多个容器同时一起对外提供服务,多个容器之间负载均衡.每个Ser ...

  8. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

  9. Swarm容器集群管理(超详细)

    一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...

随机推荐

  1. 2. chromium开发工具--gclient

    1.gclient简介 gclient是谷歌开发的一套跨平台git仓库管理工具,用来将多个git仓库组成一个solution进行管理.总体上,其核心功能是根据一个Solution的DEPS文件所定义的 ...

  2. hbase配置hdfs的HA之后需要修改的路径

    hbase-site.xml中配置了hdfs的一个路径 <property> <name>hbase.rootdir</name> <value>hdf ...

  3. 17-numpy笔记-莫烦pandas-5

    代码 import pandas as pd import numpy as np left=pd.DataFrame({'key':['K0','K1','K2','K3'], 'A':['A0', ...

  4. 【使用篇二】SpringBoot服务端数据校验(8)

    对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证.为什么这么说呢? ...

  5. .NET中线程同步的几种方法

    lock.Monitor: lock是Monitor的语法糖 [MethodImpl(MethodImplOptions.Synchronized)]: 特性标记一个方法是需要被同步的,最终实现的效果 ...

  6. 迪杰斯特拉算法完整代码(Java)

    package com.rao.graph; import java.util.*; /** * @author Srao * @className Dijkstra * @date 2019/12/ ...

  7. arduino雨滴传感器

    https://blog.csdn.net/yichu5074/article/details/81074055 功能介绍:接上5V电源,电源指示灯亮,感应板上没有水滴时,DO输出为高电平,开关指示灯 ...

  8. 2.GO-可变参数函数、匿名函数和函数变量

    2.1.可变参数函数 可变参数指参数的个数可以是任意个 可变参数必须在参数列表最后的位置,在参数名和类型之间添加三个点表示可变参数函数 声明函数时,在函数体把可变参数当作切片使用即可 package ...

  9. [LeetCode] 839. Similar String Groups 相似字符串组

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

  10. [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...