Kubernetes生产实践系列之十九:ServiceMesh之使用Ingress Nginx暴露Kubernetes上的gRPC服务

本文详细介绍了如何在Kubernetes中使用Ingress Nginx暴露并访问gRPC服务,包括部署gRPC服务、配置TLS、通过Ingress访问以及通过API访问的方式,重点讲解了Ingress Nginx对gRPC服务的支持和长连接的实现。
摘要由CSDN通过智能技术生成

一、前言

Ingress Nginx支持gRPC服务的暴露,低于0.21的版本使用如下的annotation支持gRPC:

nginx.ingress.kubernetes.io/grpc-backend: "true"

0.21版本以上使用如下annotation支持gRPC:

nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

本文基于Ingress Ngixn版本0.30.0(quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0)进行部署和测试

转载自https://blog.csdn.net/cloudvtech

二、部署gRPC服务

2.1 服务端代码和镜像构建

server.go 

package main

import (
	"context"
	"fmt"
	"os/signal"

	"log"
	"net"
	"os"

	"github.com/javiramos1/grpcapi"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

type grpcServer struct{}

func (*grpcServer) GrpcService(ctx context.Context, req *grpcapi.GrpcRequest) (*grpcapi.GrpcResponse, error) {
	fmt.Printf("grpcServer %v\n", req)
	name, _ := os.Hostname()

	input := req.GetInput()
	result := "Got input " + input + " server host: " + name
	res := &grpcapi.GrpcResponse{
		Response: result,
	}
	return res, nil
}

func main() {
	fmt.Println("Starting Server...")

	log.SetFlags(log.LstdFlags | log.Lshortfile)

	hostname := os.Getenv("SVC_HOST_NAME")

	if len(hostname) <= 0 {
		hostname = "0.0.0.0"
	}

	port := os.Getenv("SVC_PORT")

	if len(port) <= 0 {
		port = "50051"
	}

	lis, err := net.Listen("tcp", hostname+":"+port)
	if err != nil {
		log.Fatalf("Failed to listen: %v", err)
	}

	opts := []grpc.ServerOption{}
	s := grpc.NewServer(opts...)
	grpcapi.RegisterGrpcServiceServer(s, &grpcServer{})

	// reflection service on gRPC server.
	reflection.Register(s)

	go func() {
		fmt.Println("Server running on ", (hostname + ":" + port))
		if err := s.Serve(lis); err != nil {
			log.Fatalf("failed to serve: %v", err)
		}
	}()

	// Wait for Control C to exit
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, os.Interrupt)

	// Block until a signal is received
	<-ch
	fmt.Println("Stopping the server")
	s.Stop()
	fmt.Println("Closing the listener")
	lis.Close()
	fmt.Println("Server Shutdown")

}

 

Dockerfile

FROM iron/go
WORKDIR /app

ADD grpc_server /app/

CMD [ "./grpc_server" ]

构建binary和镜像:

CGO_ENABLED=0 GOOS=linux go build -o grpc_server -ldflags "-s -w -X 'main.build=$(git rev-parse --short HEAD)' -X 'main.buildDate=$(date --rfc-3339=seconds)'" -a -installsuffix cgo server.go
docker build -t myregistry.com/grpc_server .
docker push myregistry.comgrpc_server

2.2 部署gRPC服务

apiVersion: v1
kind: Service
metadata:
  name: grpcserver
spec:
  ports:
  - port: 50051
    protocol: TCP
    targetPort: 50051
  selector:
    run: grpcserver
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: grpcserver
  name: grpcserver
spec:
  replicas: 2
  selector:
    matchLabels:
      run: grpcserver
  template:
    metadata:
      labels:
        run: grpcserver
    spec:
      containers:
      - image: myregistry.com/grpc_server:latest
        name: grpcserver
        ports:
        - containerPort: 50051

包含两个replica和一个cluster service:

 

 

转载自https://blog.csdn.net/cloudvtech

 

三、通过Ingress Nginx暴露gRPC服务

参考文档:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值