>  기사  >  백엔드 개발  >  Kubernetes gRPC 로드 밸런싱 분석(L4 대 L7)

Kubernetes gRPC 로드 밸런싱 분석(L4 대 L7)

藏色散人
藏色散人앞으로
2021-11-16 14:53:352290검색

이 기사는 Kubernetes에서 gRPC 로드 밸런싱을 소개하는 go 언어 튜토리얼 칼럼에서 소개되었습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

설치 환경 종속성

  • docker-desktop >= 4.1.1
  • kubernetes >= 1.21.5
  • go >= 1.17
  • protobuf >= 3.17.3
  • ist ioctl >= 1.11.4

Docker Desktop을 다운로드하여 설치하고 내장된 Kubernetes 클러스터를 시작하세요.

# 安装 Gobrew install go# 安装 Protobufbrew install protobuf# 安装 Istiobrew install istioctl
kubectl config use-context docker-desktop
istioctl install -y

프로젝트 주소

github.com/jxlwqq/grpc-lb

풀 코드:

git clone git@github.com:jxlwqq/grpc-lb.gitcd grpc-lb

Makefile 소개

protoc-gen-go 및 protoc-gen-grpc 설치make protoc
명령 지침
초기화 make init 安装 protoc-gen-go 和 protoc-gen-grpc
make protoc 基于 proto 文件,生成 *_pb.go 和 *_grpc.pb.go
make docker-build 构建 docker 镜像
make kube-deploy 在集群中部署服务
make kube-delete 删除服务
make istio-inject

proto 파일을 기반으로 *_pb.go 및 *_grpc.pb를 생성합니다.

make docker-build

Docker 이미지 빌드

make kube-deploy클러스터에 서비스 배포

    make kube-delete
  • Delete service
  • make istio-inject

Inject Istio sidecar

특정 로직은 Makefile을 확인하세요.

L4 vs L7 로드 밸런싱

레이어 4는 IP + 포트를 기반으로 하는 로드 밸런싱이고, 레이어 7은 Kubernetes에 내장된 URL과 같은 애플리케이션 레이어 정보를 기반으로 하는 로드 밸런싱입니다. iptables/ipvs 기반으로 L4만 지원됩니다. 즉, 서비스는 HTTP/1.1 프로토콜을 지원하지만 HTTP/2 프로토콜은 지원하지 않습니다.

Envoy(Istio)는 더욱 다재다능하며 gRPC에서 기본 라우팅 및 로드 밸런싱으로 요청하고 응답하는 모든 HTTP/2 기능을 지원합니다.

Project Architecture

이 프로젝트는 각각 HTTP/RPC 로드 밸런싱을 위한 Service 및 Envoy(Istio) 지원을 테스트합니다.

cmd/server/main.go: HTTP 및 RPC 서비스를 모두 제공하는 서버입니다. 응답 데이터는 서버 컨테이너가 위치한 Pod 이름입니다(Downward API 기준).

cmd/client-http/main.go: HTTP 클라이언트는 HTTP 메서드를 통해 주기적으로 서버 인터페이스를 호출하고 반환 값을 인쇄합니다.

cmd/client-grpc/main.go: gRPC 클라이언트는 RPC를 통해 루프에서 서버 메서드를 원격으로 호출하고 반환 값을 인쇄합니다.

테스트 원칙

서버는 배포 형식으로 Kubernetes 클러스터에 3개의 복사본을 배포합니다. 3개 복사본의 Pod 이름은 다르며 client-http 및 client-grpc는 1초에 한 번씩 서비스를 호출합니다. 터미널을 열고 반환 값을 인쇄합니다. 반환 값에 세 개의 Pod 이름이 모두 있으면 효과적인 로드 밸런싱이 수행되고 있음을 나타내고, 그렇지 않으면 효과적인 로드 밸런싱이 수행되지 않음을 나타냅니다.

서비스 테스트

이미지 빌드:

make docker-build # 构建镜像(构建好的镜像,不 push 到远程仓库中)
이미지 보기:

docker images ls
반환:

REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
grpc-lb/client-grpc   latest    95d32ead8d9b   12 seconds ago   16.6MB
grpc-lb/client-http   latest    dbf0341206f6   22 seconds ago   11.5MB
grpc-lb/server        latest    1ef346785b2a   29 seconds ago   18.2MB
클러스터에 배포:

make kube-deploy  # 在集群中部署服务
포드 보기:

kubectl get pods
반환:

NAME                           READY   STATUS    RESTARTS   AGE
client-grpc-6c565594f4-tdf75   1/1     Running   0          2m48s
client-http-55d95c744d-f7nx4   1/1     Running   0          2m49s
server-7c4bfd74d-29c69         1/1     Running   0          2m51s
server-7c4bfd74d-4btvw         1/1     Running   0          2m51s
server-7c4bfd74d-fk8zf         1/1     Running   0          2m51s
보기 client-http 포드 로그:

export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
반환:

#1: server-7c4bfd74d-4btvw#2: server-7c4bfd74d-4btvw#3: server-7c4bfd74d-29c69#4: server-7c4bfd74d-fk8zf#5: server-7c4bfd74d-fk8zf#6: server-7c4bfd74d-29c69#7: server-7c4bfd74d-fk8zf#8: server-7c4bfd74d-4btvw#9: server-7c4bfd74d-fk8zf
client-grpc 로그 보기 포드:
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"

반환: 🎜
#1: server-7c4bfd74d-fk8zf#2: server-7c4bfd74d-fk8zf#3: server-7c4bfd74d-fk8zf#4: server-7c4bfd74d-fk8zf#5: server-7c4bfd74d-fk8zf#6: server-7c4bfd74d-fk8zf#7: server-7c4bfd74d-fk8zf#8: server-7c4bfd74d-fk8zf#9: server-7c4bfd74d-fk8zf
🎜HTTP 요청은 페이로드를 전달하는 반면 RPC 요청은 유효하지 않은 페이로드를 전달하는 것을 볼 수 있습니다. 짐. 🎜🎜🎜🎜Testing Envoy(Istio)🎜🎜클러스터에 Istio를 배포했지만 자동 주입을 위한 명령 공간이 없어 여기서 수동 주입을 수행합니다. 🎜🎜수동 삽입: 🎜
make istio-inject # 注入 Istio 边车
🎜포드 보기: 🎜
kubectl get pods
🎜반환: 🎜
NAME                           READY   STATUS    RESTARTS   AGE
client-grpc-7864f57779-f6blx   2/2     Running   0          17s
client-http-f8964854c-jclkd    2/2     Running   0          21s
server-7846bd6bb4-bcfws        2/2     Running   0          27s
server-7846bd6bb4-fv29s        2/2     Running   0          40s
server-7846bd6bb4-hzqj6        2/2     Running   0          34s
🎜client-http 포드 로그 보기: 🎜
export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
🎜반환: 🎜
#1: server-7846bd6bb4-hzqj6#2: server-7846bd6bb4-fv29s#3: server-7846bd6bb4-hzqj6#4: server-7846bd6bb4-hzqj6#5: server-7846bd6bb4-hzqj6#6: server-7846bd6bb4-hzqj6#7: server-7846bd6bb4-hzqj6#8: server-7846bd6bb4-bcfws#9: server-7846bd6bb4-fv29s
🎜client-grpc 포드 로그 보기: 🎜
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"
🎜반환: 🎜
#1: server-7846bd6bb4-fv29s#2: server-7846bd6bb4-hzqj6#3: server-7846bd6bb4-fv29s#4: server-7846bd6bb4-bcfws#5: server-7846bd6bb4-fv29s#6: server-7846bd6bb4-hzqj6#7: server-7846bd6bb4-fv29s#8: server-7846bd6bb4-bcfws#9: server-7846bd6bb4-fv29s
🎜HTTP 요청과 RPC 요청 모두 페이로드를 전달하는 것을 볼 수 있습니다. 🎜🎜🎜🎜정리🎜
make kube-delete
istioctl experimental uninstall --purge

위 내용은 Kubernetes gRPC 로드 밸런싱 분석(L4 대 L7)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제