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

Gateway API 与 Ingress:Kubernetes 网络的未来 随着 Kubernetes 成为部署云原生应用程序的实际编排平台,网络和流量管理在管理对服务和基础设施的访问方面已成为关键挑战。Kubernetes 的核心 Ingress 资源解决了基本的第 7 层(L7)路由需求,但在灵活性、功能和标准化方面存在局限性。作为 Ingress 的后继者,Gateway API 项目引入了一套新的可移植网络管理资源,这是对传统 Ingress 功能的超越。 阅读详情

一、前言

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.youkuaiyun.com/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.youkuaiyun.com/cloudvtech

 

三、通过Ingress Nginx暴露gRPC服务

参考文档:

https://kubernetes.github.io/ingress-nginx/examples/grpc/

3.1 Ingress Nginx暴露gRPC服务的TLS要求

Ingress Nginx暴露gRPC服务的时候,暂时只支持TLS(HTTPS)的方式,而不能通过普通HTTP方式,所以我们要配置TLS secret

生成key

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout sslforingress.key -out sslforingress.pem -subj "/CN=grpc.test.com"

生成secret

kubectl create secret tls grpcserver-secret  --cert sslforingress.pem --key sslforingress.key -n grpcserver

3.2 部署Ingress

暴露的地址是 grpc.test.com:443

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: grpcserver
  namespace: grpcserver
spec:
  rules:
    - host: grpc.test.com
      http:
        paths:
          - backend:
              serviceName: grpcserver
              servicePort: 50051
  tls:
# This secret must exist beforehand
# The cert must also contain the subj-name grpc.test.com
# https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/PREREQUISITES.md#tls-certificates
    - secretName: grpcserver-secret
      hosts:
        - grpc.test.com

nginx.conf生成的内容:

 

        ## start server grpc.test.com                                   
        server {                                                                                     
                server_name grpc.test.com ;                                                            
                                                                                                                           
                listen 80  ;                                                                                               
                listen [::]:80  ;                                                                                          
                listen 443  ssl http2 ;                                                                                    
                listen [::]:443  ssl http2 ;                                                                               
                                                                                                                           
                set $proxy_upstream_name "-";                                                                              
                                                                                                                           
                ssl_certificate_by_lua_block {                                                                             
                        certificate.call()                                                                                 
                }

                location / {                                                  
                                                                                                     
                        set $namespace      "grpcserver";             
                        set $ingress_name   "grpcserver";                                      
                        set $service_name   "grpcserver";                   
                        set $service_port   "50051";                                                 
                        set $location_path  "/";                                                

        ... ...
                        # Allow websocket connections                                                
                        grpc_set_header                        Upgrade           $http_upgrade;      
                                                                                                     
                        grpc_set_header                        Connection        $connection_upgrade;
                                                                                   
                        grpc_set_header X-Request-ID           $req_id;            
                        grpc_set_header X-Real-IP              $remote_addr;       
                                                                                   
                        grpc_set_header X-Forwarded-For        $remote_addr;       
                                                                                       
                        grpc_set_header X-Forwarded-Host       $best_http_host;        
                        grpc_set_header X-Forwarded-Port       $pass_port;             
                        grpc_set_header X-Forwarded-Proto      $pass_access_scheme;                  
                                                                                                     
                        grpc_set_header X-Scheme               $pass_access_scheme;                  
                                                                                                     
                        # Pass the original X-Forwarded-For                                          
                        grpc_set_header X-Original-Forwarded-For $http_x_forwarded_for;              
                                                                                                     
                        # mitigate HTTPoxy Vulnerability                                             
                        # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
                        grpc_set_header Proxy                  "";    
                                                                    
                        # Custom headers to proxied server           
        
        ... ...
                
                }                                            
                                                              
        }                                                            
        ## end server grpc.test.com                

转载自https://blog.youkuaiyun.com/cloudvtech

 

四、通过Ingress Nginx访问gRPC服务

4.1 安装grpcurl

https://github.com/fullstorydev/grpcurl

go get github.com/fullstorydev/grpcurl
go install github.com/fullstorydev/grpcurl/cmd/grpcurl

运行之后在go的PATH里面会有grpcurl的binary,将grpcurl拷贝到/usr/local/bin

4.2 通过grpcurl访问Kubernetes的gRPC服务

查看服务暴露的gRPC方法:

grpcurl -insecure grpc.test.com:443 list
greet.GrpcService
grpc.reflection.v1alpha.ServerReflection

调用服务:

[root@k8s-node-01 ~]# grpcurl  -insecure grpc.test.com:443 greet.GrpcService/grpcService
{
  "response": "Got input  server host: grpcserver-5bfd56f94b-bc6fg"
}
[root@k8s-node-01 ~]# grpcurl  -insecure grpc.test.com:443 greet.GrpcService/grpcService
{
  "response": "Got input  server host: grpcserver-5bfd56f94b-w7frq"
}

可以看到服务在两个节点之间轮转

五、通过API访问Ingress Nginx暴露的gRPC服务

5.1 访问基于TLS的gRPC服务

建立连接的时候加上如下代码,可以忽略SSL证书的有效性:

        config := &tls.Config{

                InsecureSkipVerify: true,

        }

        cc, err := grpc.Dial(hostname+":"+port, grpc.WithTransportCredentials(credentials.NewTLS(config)))

5.2 通过短连接访问gRPC服务

client_short_connection.go

package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/javiramos1/grpcapi"
	"google.golang.org/grpc"
        "google.golang.org/grpc/credentials"
        "crypto/tls"
)

func main() {

	fmt.Println("Starting client...")

	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"
	}

	config := &tls.Config{
    		InsecureSkipVerify: true,
	}
	cc, err := grpc.Dial(hostname+":"+port, grpc.WithTransportCredentials(credentials.NewTLS(config)))


	if err != nil {
		log.Fatalf("could not connect: %v", err)
	}
	defer cc.Close()

	c := grpcapi.NewGrpcServiceClient(cc)
	fmt.Printf("Created client: %f", c)
		callService(c)

}

func callService(c grpcapi.GrpcServiceClient) {
	fmt.Println("callService...")
	req := &grpcapi.GrpcRequest{
		Input: "test",
	}
	res, err := c.GrpcService(context.Background(), req)
	if err != nil {
		log.Fatalf("error while calling gRPC: %v", err)
	}
	log.Printf("Response from Service: %v", res.Response)
}

编译:

CGO_ENABLED=0 GOOS=linux go build -o grpc_client_short_connection -ldflags "-s -w -X 'main.build=$(git rev-parse --short HEAD)' -X 'main.buildDate=$(date --rfc-3339=seconds)'" -a -installsuffix cgo client.go

运行:

export SVC_HOST_NAME=grpc.test.com
export SVC_PORT=443

while true; do ./grpc_client_short_connection; sleep 1;done

2020/05/12 13:21:39 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:40 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
2020/05/12 13:21:41 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
2020/05/12 13:21:42 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:43 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:44 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
2020/05/12 13:21:45 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:46 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:47 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
2020/05/12 13:21:48 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
2020/05/12 13:21:49 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
2020/05/12 13:21:50 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg

同时可以看到系统存在大量端口被短连接占用之后等待关闭:

netstat -anp | grep 443 -w
tcp        0      0 172.3.0.11:41984        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41948        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41910        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41974        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41934        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41970        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41928        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41912        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41940        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41942        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41976        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41994        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41980        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41988        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41998        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41916        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41978        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41924        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41922        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41996        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41986        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41962        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41906        172.2.2.11:443          TIME_WAIT   -                   
tcp        0      0 172.3.0.11:41960        172.2.2.11:443          TIME_WAIT   -       

 

5.3 通过长连接访问gRPC服务

client_longlive_connection.go

package main

import (
	"context"
	"fmt"
	"log"
	"os"
        "time"
	"github.com/javiramos1/grpcapi"
	"google.golang.org/grpc"
        "google.golang.org/grpc/credentials"
        "crypto/tls"
)

func main() {

	fmt.Println("Starting client...")

	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"
	}

	config := &tls.Config{
    		InsecureSkipVerify: true,
	}
	cc, err := grpc.Dial(hostname+":"+port, grpc.WithTransportCredentials(credentials.NewTLS(config)))


	if err != nil {
		log.Fatalf("could not connect: %v", err)
	}
	defer cc.Close()

	c := grpcapi.NewGrpcServiceClient(cc)
	fmt.Printf("Created client: %f", c)
        for i := 1; i <= 100; i++ {
		callService(c)
      		time.Sleep(2000 * time.Millisecond)
        }

}

func callService(c grpcapi.GrpcServiceClient) {
	fmt.Println("callService...")
	req := &grpcapi.GrpcRequest{
		Input: "test",
	}
	res, err := c.GrpcService(context.Background(), req)
	if err != nil {
		log.Fatalf("error while calling gRPC: %v", err)
	}
	log.Printf("Response from Service: %v", res.Response)
}

编译并运行:

CGO_ENABLED=0 GOOS=linux go build -o grpc_client_longlive_connection -ldflags "-s -w -X 'main.build=$(git rev-parse --short HEAD)' -X 'main.buildDate=$(date --rfc-3339=seconds)'" -a -installsuffix cgo client.go

export SVC_HOST_NAME=grpc.test.com
export SVC_PORT=443

./grpc_client_longlive 
2020/05/12 13:40:06 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
callService...
2020/05/12 13:40:08 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
callService...
2020/05/12 13:40:10 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
callService...
2020/05/12 13:40:12 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
callService...
2020/05/12 13:40:14 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
callService...
2020/05/12 13:40:16 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
callService...
2020/05/12 13:40:18 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
callService...
2020/05/12 13:40:20 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq
callService...
2020/05/12 13:40:22 Response from Service: Got input test server host: grpcserver-5bfd56f94b-bc6fg
callService...
2020/05/12 13:40:24 Response from Service: Got input test server host: grpcserver-5bfd56f94b-w7frq

整个运行过程中只有一个到443端口的长连接:

这说明客户端到Ingress Nginx建立了gRPC长连接,而Ingress Nginx解码了七层gRPC数据包并进行负载均衡到gRPC 服务的两个replica POD

转载自https://blog.youkuaiyun.com/cloudvtech

K3S替代TKE:轻量Kubernetes在边缘与中小场景的落地实践 Kubernetes作为云原生基础设施的核心编排引擎,其部署形态需适配多样化环境——从公有云托管集群到边缘设备、老旧服务器及资源受限场景。K3S并非K8s的功能阉割版,而是面向无人值守、低资源、高定制需求重构的认证发行版,通过一体化二进制、内置SQLite存储与原生Traefik/Nginx Ingress支持,显著降低运维复杂度。相比TKE等托管服务在Ingress深度配置、网络可见性与成本粒度上的抽象约束,K3S以声明式CRD和全栈可控性,支撑WebSocket、gRPC、Header灰度等生产级流量治 阅读详情

相关推荐

机器学习模型服务化:从Notebook到高可用生产环境的实战路径

机器学习模型服务化是将训练好的模型转化为稳定、可观测、可伸缩的在线服务的关键过程。其核心在于突破‘本地跑通’与‘生产可用’之间的鸿沟,涉及模型部署、服务契约设计、并发处理、资源隔离与全链路监控等系统性工程实践。基于FastAPI、Docker、Kubernetes和Prometheus的技术栈,不仅能解决冷启动、内存泄漏、特征依赖耦合等高频痛点,更能支撑灰度发布、熔断降级与影子流量等高阶稳定性能力。本文聚焦真实场景下的可复用架构分层(接入层/服务层/模型层)与实操细节(Dockerfile优化、Uvicor

weixin_34013044的博客 452

nginx-ingress配置(注解)

ingress-nginx配置(注解) 注解 您可以将这些Kubernetes批注添加到特定的Ingress对象,以自定义其行为。 小费 注释键和值只能是字符串。其他类型,如布尔或数值必须被引用,即"true","false","100"。 注意 可以使用--annotations-prefix命令行参数更改注释前缀 ,但默认值为nginx.ingress.kubernetes.io,如下表所述。 Nametype nginx.ingress.kubernetes.io/app-rootstring

weixin_44692256的博客 2万+

从Notebook到生产环境:机器学习模型部署的工程化实践

机器学习模型部署(ML Deployment)是将训练完成的模型转化为稳定、可观测、可维护的服务的关键环节,其核心在于 bridging the gap between experimentation and production。它涉及模型序列化、预处理流水线解耦、资源约束下的内存与GPU管理、标准化服务接口(Model Serving)以及端到端可观测性建设。不同于算法调优,这一阶段更强调确定性、契约化与故障自愈能力,技术价值体现在服务可用性(SLA)、推理延迟、特征一致性与快速回滚机制上。典型应用场景

weixin_30267785的博客 310

如何通过 Nginx Ingress 快速解决 gRPC 长连接负载不均衡问题

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !背景当前推荐引擎服务集群的外部访问入口及负载均衡使用的是阿里云的SLB,然而其负载均衡,由于grpc长连接的缘故,表现不尽如人意,尽管加了定时重连的相关配置,多个pod依然会有旱的旱死,涝的涝死的情况.刚好新建的k8s集群版模型服务这种情况也比较明显,所以相关的优化就被提上了日程.听说新版的nginx-ingress...

easylife206的专栏 2090

【信息科学与工程学】【通信工程】第七十六篇 网络解决方案设计03

继续围绕智算中心相关的组网设计、光路设计、波分设计、OTN设备、交换机设备、组网拓扑、网络操作系统、业务区/管理区/存储区、光设计、租户设计、电磁设计、队列设计、QoS设计、调度设计、组合设计等领域。: 若Tpxe​=2min,Tos_install​=5min,Tagent​=0.5min,Tconfig​=0.5min,则Tready​=8min。: 若N=2000,Ms​=2,Nstorage​=128,Mss​=2,则Nip​=2000×2+128×2=4256,需要/20子网。

weixin_49199313的博客 204

【信息科学与工程学】【解决方案】【通信工程】第三百四十四篇 公有云网络工程 1001 示例

​GPU部署原则​:通用AI服务:共享GPU池 + 时间片调度敏感计算任务:租户独占GPU(通过PCIe透传)​私有化部署​:提供Air Gap模式安装包(支持完全离线)关键数据本地化存储,仅同步元数据​租户隔离​:金融/政府租户:物理隔离(专属节点+独立数据库)普通企业租户:逻辑隔离(命名空间+服务网格策略)​安全增强​:租户操作审计日志强制上链(区块链存证)敏感字段客户端加密(避免服务端接触明文)

weixin_49199313的博客 3404

Kubernetes Ingress-nginx跨域配置

Kubernetes Ingress-nginx跨域配置

weixin_39518516的博客 1181

【信息科学与工程学】计算机科学与技术——第二百二十五篇 架构设计 03 云原生架构02

启用HPA Controller Partial Cache(只缓存必要字段)、调整Informer Resync Period减少内存、启用Controller Memory Limit、监控Informer Cache内存。: 设置HPA stabilizationWindowSeconds大于CA扩容时间、启用CA scale-down-delay-after-add、使用PriorityBased策略优先保留Pod、监控HPA-CA震荡频率。模型并行allreduce需5TB/s→满足;

weixin_49199313的博客 351

Ingress访问后端K8s pod如果需要https的配置

Ingress的扩展也有好多种 如果用的是nginx ingress,需要在ingress上添加annotations kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: HTTPS 如果用的是kong ingress扩展,需要在service层添加annotations kind: Service metadata: annotations: konghq.

shirley_zx的专栏 1348

【信息科学与工程学】【数据中心】 第二十三篇【智算中心】DDC网络-满足大规模训练、推理、存储区网络(Roce2组网)-01

设计维度目标值设计原则实现手段评估指标性能目标​端到端延迟<10ms低延迟优先RDMA优化,拓扑扁平化延迟分布,p99延迟可用性目标​99.99%可用性冗余设计多路径,设备冗余MTBF,MTTR吞吐目标​核心交换>10Tbps无阻塞交换大带宽核心,Clos架构对分带宽扩展性目标​线性扩展至1000节点模块化设计标准Pod架构扩展成本函数安全目标​零信任架构纵深防御微分段,加密传输安全事件数能效目标​PUE<1.2绿色计算高效设备,智能调度能效比(W/IOPS) 2. 物理拓扑设计 2.1 数据中心物理

weixin_49199313的博客 559

【信息科学与工程学】【数据中心】 第七篇 智算中心CLOS组网整体设计

区域主要功能网络要求技术选型安全等级可用性要求训练区​大规模AI模型训练,分布式计算超高带宽(100G+),超低延迟(<1ms),无损网络RoCEv2,PFC,DCQCN,多路径P4(最高)99.99%推理区​实时AI推理,模型服务低延迟(<10ms),高可用,弹性扩展智能负载均衡,服务网格,容器网络P3(高)99.999%公共服务区​统一认证,API网关,数据服务多租户隔离,安全防护,弹性带宽VXLAN,EVPN,微隔离P3(高)99.99%存储区​高性能存储,数据湖超高带宽,低延迟,高IOPSNVMe-

weixin_49199313的博客 1370

使用k8s Ingress暴露gRPC服务

Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress;前两种估计都应该很熟悉,下面详细的了解下这个 Ingress Ingress由两部分组成:Ingress Controller 和 Ingress 服务。 参考:https://www.jianshu.com/p/189fab1845c5 ...

2400

【2025最新】Multisim 14.3超详细安装步骤 【附安装包+永久+汉化】|Multisim 14.3

嗨,小伙伴们!是不是一直在找可靠的multisim下载安装教程?今天就给大家带来超详细的2025年Multisim 14.3安装全攻略!这款电路仿真神器绝对是学电子、做电路设计的必备工具!很多朋友后台留言说安装时各种报错、汉化失败,所以我决定出一期零基础、保姆级的教程,从下载到安装再到汉化,全部一步到位搞定!按照我的步骤来,包你顺利安装不出错!!!通过本教程,相信大家已经成功安装并配置好了Multisim 14.3。这款电路仿真神器能帮你设计和测试各种电路,从简单的LED闪烁到复杂的信号处理电路都不在话下。

pythonpapaxia的博客 8万+

Kubernetes生产实践系列之十八:ServiceMesh之在Kubernetes中对gRPC流量进行负载均衡

一、前言 转载自https://blog.youkuaiyun.com/cloudvtec

cloudvtech的博客 979

STM32 IAP跳转后APP卡死?别慌,手把手教你修复HAL_RCC_OscConfig时钟配置冲突

本文深入分析了STM32 IAP跳转后APP在HAL_RCC_OscConfig函数中卡死的问题,揭示了PLL时钟配置冲突的根本原因。通过详细的代码示例和分步解决方案,指导开发者正确处理STM32F1/F4系列的时钟系统二次初始化问题,确保IAP+APP架构的稳定运行。

weixin_28685287的博客 365

增益调度控制 —— 理论、案例与交互式 GUI 实现

本文详细介绍了增益调度控制的基本原理、数学模型及公式推导,探讨了该方法在适应非线性系统和大范围工作条件下的优势与局限。通过航空飞行控制、发动机推力控制以及化工过程控制三个典型案例,我们展示了如何利用调度变量动态调整控制增益,从而使得控制系统在各个工作点均能达到优良性能。为帮助工程师和研究者更直观地理解并验证增益调度控制的实际效果,本文提供了一套基于 Python 与 PyQt6 的交互式 GUI 控制系统代码。用户不仅可以实时查看仿真数据,还能通过在线调节参数直观体验调度控制的优势。

闲人编程的博客 1480

ingress七层与四层转发详解与生产实战配置

通过合理配置和调优,结合七层和四层转发的优势,可以构建高性能、高可用、安全的 Kubernetes 服务网络,满足生产环境的复杂需求。在实际部署中,建议根据业务特性选择合适的转发方式,并进行充分的测试和监控。

sre救赎之路 1033

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5264

Vorssaint 免费 macOS 菜单栏工具:52 个模块各管一块,全塞进一个图标

菜单栏上一排小图标,一个管音量,一个管剪贴板,一个管监控——各占一格,后台各跑各的。Vorssaint 把它们收进同一个图标:免费、开源、模块化,52 个功能各自独立开关,不用的干脆不装,全部本地运行。它需要 Apple Silicon 的 Mac 和 macOS 14(Sonoma)或更新版本,风扇控制仍是 Beta。 [![Vorssaint 菜单栏工具主面板:52 个功能模块可独立启停](

gitblog_00220的博客 299

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 698

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4313

Kubernetes的service mesh – 第五部分:DogFood环境,Ingress和Edge路由

概述 在这篇文章中,我们将向您展示如何使用Linkerd实现的Service Mesh来处理Kubernetes上的入口流量,在Service Mesh中的每个实例上分发流量。我们还将通过一个完整的例子来介绍Linkerd的高级路由功能:如何将特定的请求路由到较新版本的应用实例上,比如用于内部测试的、预发布的应用版本。 这篇文章是关于使用Linkerd...

weixin_34217711的博客 137

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8366

尚硅谷云原生实战学习笔记

尚硅谷云原生实战学习笔记,学吧,学无止境。

李英俊小朋友 1666

Lion优化器试验笔记

Lion优化器试验笔记

jacke121的专栏 845

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

云原生网络架构与实践:构建高效的网络系统

云原生网络是专为云原生环境设计的网络架构,它充分利用云平台的弹性、可扩展性和自动化管理能力,提供高性能、高可用、安全的网络服务。云原生网络架构与实践是现代企业云原生转型的重要组成部分,它能够帮助企业构建高效、可靠、安全的网络系统,提高应用性能和服务可靠性。从技术原理到实践落地,构建一个成功的云原生网络系统需要综合考虑多个因素。源码之下,没有秘密。理解云原生网络的底层原理是做好实践的基础Show me the benchmark, then we talk. 所有设计都需要通过实际测试验证。

guoyizhongxing的博客 4313

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: Kubernetes生产实践系列之十八:ServiceMesh之在Kubernetes中对gRPC流量进行负载均衡
下一篇: Kubernetes生产实践系列之二十:ServiceMesh之通过ambassador对部署在Kubernetes的gRPC服务进行负载均衡
cloudvtech
博客等级 码龄9年 533粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值