当前位置: 首页 > news >正文

使用Service发布前后端应用程序

使用Service发布前后端应用程序

文章目录

  • 使用Service发布前后端应用程序
    • @[toc]
    • 一、创建并发布后端应用程序
    • 二、创建并发布前端应用程序
    • 三、通过前端发送流量进行测试

部署前端(Frontend)微服务和后端(Backend)微服务是比较常见的应用场景。使用Service就可以在Kubernetes集群中实现这种部署,本例以nginx作为前端应用程序,Tomcat作为后端应用程序,分别创建两个Service,前端Service对外发布,前端的Pod通过后端Service的域名连接后端

一、创建并发布后端应用程序

将请求从前端发送到后端的关键是后端Service。为简化实验,本例的后端应用程序选择基本的Tomcat服务器。

(1)使用Deployment部署该应用程序

[root@master ~]# vim backend-deploy.yaml
[root@master ~]# cat backend-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: backend
spec:selector:matchLabels:                      # 多标签选择器app: webapptier: backendreplicas: 3template:metadata:labels:app: webapptier: backendspec:containers:                     # 容器运行Tomcat服务器- name: tomcatimage: tomcat:8.0-alpineports:- containerPort: 8080

(2)执行创建Deployment

[root@master ~]# kubectl apply -f backend-deploy.yaml 
deployment.apps/backend created

(3)使用Service发布该应用程序

[root@master ~]# vim backend-service.yaml
[root@master ~]# cat  backend-service.yaml
apiVersion: v1
kind: Service
metadata:name: webapp
spec:selector:                 # 组合多标签选择器来选择目标Podapp: webapptier: backendports:- protocol: TCPport: 80targetPort: 8080

(4)执行创建Service

[root@master ~]# kubectl apply -f backend-service.yaml 
service/webapp created

(5)查看Service详细信息

[root@master ~]# kubectl get pods
NAME                      READY   STATUS              RESTARTS   AGE
backend-5c94c696c-2jb4g   1/1     Running             0          11m
backend-5c94c696c-8hmvv   0/1     ContainerCreating   0          11m
backend-5c94c696c-pw4mj   1/1     Running             0          11m
[root@master ~]# kubectl describe service webapp
Name:              webapp
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=webapp,tier=backend
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.107.1.140
IPs:               10.107.1.140
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.166.135:8080,10.244.166.136:8080
Session Affinity:  None
Events:            <none>

至此,名为webapp的Service可以将请求流量发送到后端服务的2个副本上。Service用于发送网络流量,是的后端微服务总是可以访问,但是此Service在集群外部无法访问也无法解析。

二、创建并发布前端应用程序

接下来创建一个可在集群外部访问的前端应用程序,并通过代理前端的请求连接到后端应用程序。本例的前端应用程序选择nginx。与后端应用程序类似,前端应用程序包含一个Deployment和一个Service,唯一的区别是前端Service要提供外部访问。

(1)创建ConfigMap,将nginx的上游服务器配置为后端应用程序

nginx除了可以直接作为Web服务器使用外,还可以通过反向代理将请求转发给上游服务器。本例前端使用的是原生的nginx镜像,需要自定义配置文件,将请求转发给前面发布的后端Service。

首先创建一个nginx配置文件

[root@master ~]# cat nginx.conf 
# Backend 是 Nginx 的内部标识符,用于命名以下特定的上游服务器(upstream)
upstream Backend {# webapp 是 Kubernetes 中的后端服务所使用的内部DNS名称server webapp;
}
server {listen 80;location / {# 以下语句将流量通过代理方式转发到名为Backend的上游服务器proxy_pass http://Backend;}
}

Service具有服务发现机制,前端应用程序通过后端Service的域名就可以将请求发送到后端Pod

然后基于该配置文件创建名为nginx-config的ConfigMap,供前端使用

[root@master ~]# kubectl create configmap nginx-config --from-file=nginx.conf
configmap/nginx-config created

(2)创建Deployment

[root@master ~]# vim frontend-deploy.yaml
[root@master ~]# cat frontend-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: frontend
spec:selector:matchLabels:app: webapptier: frontendreplicas: 1                              # 前端只提供一个副本template:metadata:labels:app: webapptier: frontendspec:containers:- name: nginximage: nginx:1.14.2volumeMounts:                     # 挂载由ConfigMap提供的配置文件- name: nginx-configmountPath: /etc/nginx/conf.d/default.confsubPath: nginx.confvolumes:                               # 定义由ConfigMap提供的特殊卷- name: nginx-configconfigMap:name: nginx-configitems:- key: nginx.confpath: nginx.conf[root@master ~]# 

注意,这里的容器挂载了由上述ConfigMap提供的nginx配置文件

(3)执行创建

[root@master ~]# kubectl apply -f frontend-deploy.yaml 
deployment.apps/frontend created

(4)创建Service

[root@master ~]# cat frontend-service.yaml 
apiVersion: v1
kind: Service
metadata:name: frontend
spec:type: NodePort              # Service类型为NodePortselector:app: webapptier: frontendports:- protocol: TCPport: 80targetPort: 80nodePort: 30080             # 节点上绑定的端口

实际应用中,大多会使用LoadBalancer类型的Service,利用云提供商的负载均衡器实现从集群外部访问的目的。为了便于实验,这里改用NodePort类型的Service,通过节点IP地址和端口对外发布应用程序。

(5)执行创建

[root@master ~]# kubectl apply -f frontend-service.yaml 
service/frontend created

(6)列出该Service的基本信息

[root@master ~]# kubectl get svc frontend
NAME       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
frontend   NodePort   10.101.220.232   <none>        80:30080/TCP   47s

(7)该Service仅运行一个Pod副本,执行以下命令列出该Pod信息。

[root@master ~]# kubectl get po --selector="tier=frontend" -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
frontend-85bf7d77d8-xfzbl   1/1     Running   0          5m3s   10.244.104.1   node2   <none>           <none>

可以发现,该Service的Pod副本在node2节点上运行。但是,外部用户可以通过集群中任一节点的IP地址(域名)和节点端口来访问该Service发布的应用程序。至此,前端和后端的连接已经完成。


三、通过前端发送流量进行测试

可以使用curl命令通过前端Service的集群节点IP地址和端口访问服务端点,进行简单的测试,结果发现能够访问后端的Tomcat服务器。例如,访问node1节点:

[root@master ~]# curl http://192.168.10.31:30080
...<h1>Apache Tomcat/8.0.53</h1>
...
[root@master ~]# 

使用浏览器访问该前端Service,这里访问另一个节点node2(IP地址为192.168.10.32),进一步验证了前后端的成功连接。

在这里插入图片描述

测试完毕后,删除创建的对象

[root@master ~]# kubectl get pods
NAME                        READY   STATUS              RESTARTS   AGE
backend-5c94c696c-2jb4g     1/1     Running             0          36m
backend-5c94c696c-8hmvv     0/1     ContainerCreating   0          36m
backend-5c94c696c-pw4mj     1/1     Running             0          36m
frontend-85bf7d77d8-xfzbl   1/1     Running             0          12m
[root@master ~]# kubectl delete services frontend webapp
service "frontend" deleted
service "webapp" deleted
[root@master ~]# kubectl delete deployment frontend backend
deployment.apps "frontend" deleted
deployment.apps "backend" deleted
[root@master ~]# kubectl delete cm nginx-config
configmap "nginx-config" deleted
[root@master ~]# kubectl get pods
NAME                      READY   STATUS        RESTARTS   AGE
backend-5c94c696c-8hmvv   0/1     Terminating   0          37m
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   27d
[root@master ~]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      27d
[root@master ~]# kubectl delete pod backend-5c94c696c-8hmvv --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "backend-5c94c696c-8hmvv" force deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.
[root@master ~]# 
http://www.xdnf.cn/news/36811.html

相关文章:

  • 软件测试行业核心知识点的系统化梳理
  • 【Matlab】中国沿岸潮滩宽度和坡度分布
  • 2025年KBS SCI1区TOP:增强天鹰算法EBAO,深度解析+性能实测
  • 【数据结构_11】二叉树(3)
  • NestJS——使用TypeORM连接MySQL数据库(Docker拉取镜像、多环境适配)
  • 【大模型】 LangChain框架 -LangChain实现问答系统
  • 基于UNet算法的农业遥感图像语义分割(下)
  • AF3 unify_alignment_db_indices脚本解读
  • QT+Cmake+mingw32-make编译64位的zlib-1.3.1源码成功过程
  • Spring中的AOP基础理解
  • 探秘 C++ 内存管理:从虚拟内存到内存池的深度解析与实战应用
  • 【AI提示词】物理学家
  • 【信息系统项目管理师】高分论文:论信息系统项目的干系人管理(商业银行绩效考核系统)
  • 力扣算法ing(60 / 100)
  • 苍穹外卖项目中所涉及到的测试内容
  • 大模型Rag - 向量数据库索引
  • Docker应用端口查看器docker-port-viewer
  • 筑基挑战 | 第14期
  • 数字孪生火星探测车,星际探索可视化
  • 解码 Web Service:从技术原理到应用场景的深度剖析
  • 可以直接本地使用的Python环境可以调用的AI大模型归纳整理(AI辅助)
  • 如何防止接口被刷
  • 内积(Inner Product)
  • C#测试linq中的左连接的基本用法
  • 红黑树模拟实现STL中的map和set---C++
  • ThingsBoard3.9.1 MQTT Topic(3)
  • 【入门】数数小木块
  • OpenFeign终极指南:超时控制、重试策略、拦截器与自定义Starter
  • Stable Diffusion秋叶整合包V4独立版Python本地API连接指南
  • 《Operating System Concepts》阅读笔记:p738-p747