非容器应用与K8s工作负载的服务网格化实践-3 基于ASM的POD和VM互访实践-HTTP协议篇

简介: 非容器应用的网格化需要前一篇讲述的WorkloadEntry配置,同时需要本篇讲述的sidecar配置。前者让kubernetes容器内的POD可以找到VM中的应用,后者让VM中的应用可以找到POD。

非容器应用的网格化需要前一篇讲述的WorkloadEntry配置,同时需要本篇讲述的sidecar配置。前者让kubernetes容器内的POD可以找到VM中的应用,后者让VM中的应用可以找到POD。(注:本系列的重点是流量转移,但VM网格化后不止具备流量管理能力。)

1 搭建实验环境

示例实验需要一个ack集群和3个ecs节点。在ack集群中,包含hello1和hello3版本为en的POD,3个ecs节点各启动一个hello2 app,每个app对应一个版本(en/fr/es)的hello容器。请求从hello1 POD到VM中的hello2 app,再到hello3 POD。在此基础上,我们希望路由到hello2 en/fr/es的流量比例为:30%:60%:10%。

3-1-http-reciprocal-demo.png

示例(http_reciprocal_demo)包含如下元素:

  • hello1 deployment(镜像http_springboot_v1)
  • hello3 deployment(镜像http_springboot_v1)
  • hello2 docker containers(镜像http_springboot_v1/http_springboot_v2/http_springboot_v3)
  • 入口网关:istio-ingressgateway
  • 入口流量配置:gateway/virtualservice
  • hello1流量配置:hello1 service(/hello1 virtualservice/hello1 destinationrule)
  • hello2流量配置:hello2 service/hello2 virtualservice/hello2 destinationrule
  • hello3流量配置:hello3 service(/hello3 virtualservice/hello3 destinationrule)
  • hello2 serviceentry/hello2 workloadentry

启动hello2应用

sh vm/ssh1.sh

docker run \
--rm \
--network host \
--name http_v1 \
-e HTTP_HELLO_BACKEND=hello3-svc.http-reciprocal-hello.svc.cluster.local \
registry.cn-beijing.aliyuncs.com/asm_repo/http_springboot_v1:1.0.1
sh vm/ssh2.sh

docker run \
--rm \
--network host \
--name http_v2 \
-e HTTP_HELLO_BACKEND=hello3-svc.http-reciprocal-hello.svc.cluster.local \
registry.cn-beijing.aliyuncs.com/asm_repo/http_springboot_v2:1.0.1
sh vm/ssh3.sh

docker run \
--rm \
--network host \
--name http_v3 \
-e HTTP_HELLO_BACKEND=hello3-svc.http-reciprocal-hello.svc.cluster.local \
registry.cn-beijing.aliyuncs.com/asm_repo/http_springboot_v3:1.0.1

启动hello1/hello3 POD

ack.deploy.sh

k apply -f data_plane/http-reciprocal-hello-all.yaml

k -n http-reciprocal-hello get pod,svc
NAME                                 READY   STATUS    RESTARTS   AGE
pod/hello1-deploy-6c857bc499-f658r   2/2     Running   0          2m7s
pod/hello3-deploy-f57bb9db7-lzvg8    2/2     Running   0          2m7s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/hello1-svc   ClusterIP   172.19.8.178   <none>        8004/TCP   2m7s
service/hello3-svc   ClusterIP   172.19.3.17    <none>        8001/TCP   6s

配置WorkloadEntry等设施

asm.deploy.sh/asm_traffic_shift.sh

aliyun servicemesh AddVmAppToMesh \
  --ServiceMeshId "$MESH_ID" \
  --Namespace external-hello \
  --ServiceName hello2-svc \
  --Ips "$VM_PRI_1","$VM_PRI_2","$VM_PRI_3" \
  --Ports http:8001 \
  --Labels app=hello-workload
  
m apply -f control_plane/http-reciprocal-hello-all.yaml

m -n http-reciprocal-hello get serviceentry,workloadentry
NAME                                                         AGE
serviceentry.networking.istio.io/mesh-expansion-hello2-svc   73s

NAME                                                            AGE
workloadentry.networking.istio.io/mesh-expansion-hello2-svc-1   73s
workloadentry.networking.istio.io/mesh-expansion-hello2-svc-2   73s
workloadentry.networking.istio.io/mesh-expansion-hello2-svc-3   73s

m -n http-reciprocal-hello get gateway,virtualservice,destinationrule
NAME                                        AGE
gateway.networking.istio.io/hello-gateway   2m25s

NAME                                            AGE
virtualservice.networking.istio.io/gateway-vs   2m25s
virtualservice.networking.istio.io/hello2-vs    2m25s

NAME                                            AGE
destinationrule.networking.istio.io/hello2-dr   2m25s

为WorkloadEntry添加version标签

分别为3个WorkloadEntry添加version:v1/version:v2/version:v3标签,示意如下。

spec:
  address: 192.168.0.170
  labels:
    app: hello-workload
    version: v1

为VM添加hello3 DNS

为虚拟机节点添加hello3 service的clusterIp

hello3_svc_ip=$(k get svc hello3-svc -n hybrid-hello -o jsonpath='{.spec.clusterIP}')
echo "$hello3_svc_ip hello3-svc.http-reciprocal-hello.svc.cluster.local" > dns_record

VMS=("$VM_PUB_1" "$VM_PUB_2" "$VM_PUB_3")
for vm in "${VMS[@]}"; do
  ssh root@"$vm" "cat >> /etc/hosts" < dns_record
done
rm -rf dns_record

验证虚拟机对hello3 POD和hello3 service的访问

for vm in "${VMS[@]}"; do
  hello3_pod_ip=$(k get pod -l app=hello3-deploy -n http-reciprocal-hello -o jsonpath={.items[*].status.podIP})
  echo "Test access to hello3 pod on $vm"
  ssh root@"$vm" "curl -s $hello3_pod_ip:8001/hello/pod_testing_msg"
  echo
  echo "Test access to hello3 service on $vm"
  ssh root@"$vm" "curl -s hello3-svc.trace-hello.svc.cluster.local:8001/hello/svc_testing_msg"
  echo
done

2 KUBE验证-POD和VM互访

完成实验环境搭建后,我们首先验证POD和VM互访。

首先,我们从hello1 POD中分别直接向3个VM中的应用发起请求,验证hello2 app是否可以访问到hello3 POD

hello1_pod=$(k get pod -l app=hello1-deploy -n http-reciprocal-hello -o jsonpath={.items..metadata.name})
echo "Test access vm ip directly"
VMS=("$VM_PRI_1" "$VM_PRI_2" "$VM_PRI_3")
for vm in "${VMS[@]}"; do
  k exec "$hello1_pod" -c hello-v1-deploy -n http-reciprocal-hello -- curl -s "$vm":8001/hello/eric
  echo
done

验证结果如下,我们期待3个hello2 app均能返回下游hello3的信息,证明VM已经完全网格化。hello2 app通过sidecar找到了hello3 svc对应的POD ip,并完成请求。

Test access vm ip directly
Hello eric(192.168.0.170)<-Hello eric(172.18.1.36)
Bonjour eric(192.168.0.171)<-Hello eric(172.18.1.36)
Hola eric(192.168.0.172)<-Hello eric(172.18.1.36)

直接访问hello2 app所在ecs节点的ip验证通过后,我们再从hello1 POD中向hello2 svc发起请求,验证hello1 POD到hello2 VM是否生效。这其实是在回归前一篇介绍的WorkloadEntry是否生效。

echo "Test access hello2-svc"
k exec "$hello1_pod" -c hello-v1-deploy -n http-reciprocal-hello \
-- curl -s hello2-svc.http-reciprocal-hello.svc.cluster.local:8001/hello/eric

验证结果如下,我们期待hello1 POD通过ServiceEntry和WorkloadEntry找到相应的VM。

Test access hello2-svc
Hello eric(192.168.0.170)<-Hello eric(172.18.1.36)

最后我们在hello1 POD中验证全链路:

echo "Test access hello1-svc"
k exec "$hello1_pod" -c hello-v1-deploy -n http-reciprocal-hello \
-- curl -s hello1-svc.http-reciprocal-hello.svc.cluster.local:8004/hello/eric

Test access hello1-svc
Hello eric(172.18.0.230)<-Bonjour eric(192.168.0.171)<-Hello eric(172.18.1.36)

3 MESH验证-全链路流量转移

物理链路验证完毕,我们再来验证逻辑链路,即流量转移的配比是否生效。

这个验证我们从本地向服务网格入口网关发起。首先确认本示例对外暴露的8004 端口已经在IstioGateway在配置好,然后获取istio-ingressgateway的ip,并通过ip发起请求。脚本示意如下:

m get IstioGateway -n istio-system -o jsonpath='{.items[0].spec.ports[?(@.name=="http-reciprocal")]}'

map[name:http-reciprocal port:8004 targetPort:8004]
IP=$(k -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
for i in {1..100}; do
  resp=$(curl -s "$IP":8004/hello/eric)
  echo "$resp" >>test_traffic_shift_result
done

echo "expected 30%(Hello eric)-60%(Bonjour eric)-10%(Hola eric):"
sort test_traffic_shift_result | grep -v "^[[:space:]]*$"| uniq -c | sort -nrk1

验证结果如下:

Test route n a loop
expected 30%(Hello eric)-60%(Bonjour eric)-10%(Hola eric):
  61 Hello eric(172.18.0.230)<-Bonjour eric(192.168.0.171)<-Hello eric(172.18.1.36)
  28 Hello eric(172.18.0.230)<-Hello eric(192.168.0.170)<-Hello eric(172.18.1.36)
  11 Hello eric(172.18.0.230)<-Hola eric(192.168.0.172)<-Hello eric(172.18.1.36)

到此,POD和VM互访的http协议流量管理验证完毕。

本篇示例完整演示了非容器应用网格化过程中的一个比较经典的场景。覆盖到从istio-ingressgateway到deployment、workloadentry等各种CRD的配置,较完整地展示了POD和VM互访中遇到的各技术点的配置。在有了http协议的基础后,下一篇我们使用grpc代替http再次验证,并着重关注grpc的长链接特性。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
2855 3
|
10月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
285 18
|
10月前
|
网络安全 开发者
如何解决HTTPS协议在WordPress升级后对网站不兼容的问题
以上就是解决WordPress升级后HTTPS协议对网站的不兼容问题的方法。希望能把这个棘手的问题看成是学校的管理问题一样来应对,将复杂的技术问题变得更加有趣和形象,并寻觅出解决问题的方式。希望你的网站能在新的学期得到更好的发展!
268 19
|
10月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
964 20
|
8月前
|
Web App开发 缓存 数据安全/隐私保护
Django全栈实战:HTTP状态码与业务状态码的分层设计与实战应用
HTTP状态码是服务器响应请求的3位数字代码,分为1xx(信息)、2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误)。业务状态码则用于描述具体业务逻辑结果,常在响应体中返回。二者在前后端交互中有不同用途和处理方式。本文还介绍了如何在Django项目中设计并使用业务状态码。
636 0
|
10月前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
434 1
|
网络协议 安全 网络安全
HTTP与HTTPS协议入门
HTTP协议是互联网的基石,HTTPS则是其安全版本。HTTP基于TCP/IP协议,属于应用层协议,不涉及数据包传输细节,主要规定客户端与服务器的通信格式,默认端口为80。
606 25
HTTP与HTTPS协议入门
|
11月前
|
安全 网络安全 数据安全/隐私保护
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
605 3
|
12月前
|
API
已经设置好连接器工厂的HTTP连接器,不会在表单控件里取值应用
这是一个关于通过天眼查API获取企业数据的需求介绍。已实现HTTP连接器调用并成功返回数据,但问题在于如何设计表单:使用单行文本输入企业名称后,触发API查询,将返回的相关数据自动填充到指定的单行文本中,期待高手提供解决方案。
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
916 3

相关产品

  • 容器服务Kubernetes版