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

news2025/4/20 17:35:06

使用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: webapp
      tier: backend
  replicas: 3
  template:
    metadata:
      labels:
        app: webapp
        tier: backend
    spec:
      containers:                     # 容器运行Tomcat服务器
        - name: tomcat
          image: tomcat:8.0-alpine
          ports:
          - 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:                 # 组合多标签选择器来选择目标Pod
    app: webapp
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 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: webapp
      tier: frontend
  replicas: 1                              # 前端只提供一个副本
  template:
    metadata:
      labels:
        app: webapp
        tier: frontend
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          volumeMounts:                     # 挂载由ConfigMap提供的配置文件
          - name: nginx-config
            mountPath: /etc/nginx/conf.d/default.conf
            subPath: nginx.conf
      volumes:                               # 定义由ConfigMap提供的特殊卷
        - name: nginx-config
          configMap:
            name: nginx-config
            items:
            - key: nginx.conf
              path: 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类型为NodePort
  selector:
    app: webapp
    tier: frontend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 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.coloradmin.cn/o/2338874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu20.04下Docker方案实现多平台SDK编译

0 前言 熟悉嵌入式平台Linux SDK编译流程的小伙伴都知道,假如平台a要求必须在Ubuntu18.04下编译,平台b要求要Ubuntu22.04的环境,那我只有Ubuntu20.04,或者说我的电脑硬件配置最高只能支持Ubuntu20.04怎么办?强行在Ubuntu20.04下编译,编又编不过,换到旧版本我又不愿意,…

-SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点

1 、 SSRF 漏洞原理 SSRF(Server-Side Request Forgery: 服务器端请求伪造 ) 一种由攻击者构造形成由服务端发起请求的一个安全漏洞 ; 一般情况下&#xff0c; SSRF 攻击的目标是从外网无法访问的内部系统。 &#xff08;正是因为它是由服务端发起的&#xff0c;所以它能…

《AI大模型应知应会100篇》第27篇:模型温度参数调节:控制创造性与确定性

第27篇&#xff1a;模型温度参数调节&#xff1a;控制创造性与确定性 摘要 在大语言模型的使用中&#xff0c;“温度”&#xff08;Temperature&#xff09;是一个关键参数&#xff0c;它决定了模型输出的创造性和确定性之间的平衡。通过调整温度参数&#xff0c;您可以根据任…

聊聊Doris的数据模型,如何用结构化设计解决实时分析难题

传统 OLAP 系统的局限 在大数据实时分析领域&#xff0c;数据模型设计直接决定了系统的查询性能、存储效率与业务适配性。Apache Doris作为新一代MPP分析型数据库&#xff0c;通过独创的多模型融合架构&#xff0c;在业内率先实现了"一份数据支持多种分析范式"的能力…

LNA设计

设计目的 为后级提供足够的增益以克服后级电路噪声 尽可能小的噪声和信号失真 确保输入和输出端的阻抗匹配 确保信号线性度 评价标准 噪声系数 功率增益 工作频率和带宽 输入信号功率动态范围 端口电压驻波比 稳定性 基于SP模型的LNA设计 直流分析 S参数分析 设计指标 &#xf…

JavaSpring 中使用 Redis

创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码&#xff0c;所以就不进行分层了&#xff0c;只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…

多线程使用——线程安全、线程同步

一、线程安全 &#xff08;一&#xff09;什么是线程安全问题 多个线程&#xff0c;同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全的问题。 &#xff08;二&#xff09;用程序摹拟线程安全问题 二、线程同步 &#xff08;一&#xff09;同步思想概述 解决线…

Spring Boot 集成 tess4j 实现图片识别文本

tesseract是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言&#xff0c;并且可以在命令行中执行。它是一个流行的开源OCR工具&#xff0c;可以在许多不同的操作系统上运行。 Tess4J是…

Redis命令——list

列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储个元素 在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;…

MicroDEM 与 OpenEV(FWTtools工具包):两款开源DEM相关小软件

大家好&#xff0c;今天为大家介绍的软件是MicroDEM 与 OpenEV&#xff0c;这两款小软件分别主要用于DEM数据的处理、数据查看与分析。MICRODEM是一款专注于地理空间分析和遥感数据处理的开源小软件。 MICRODEM官网网址为&#xff1a;https://microdem.org/&#xff0c;官网比较…

STM32使用rand()生成随机数并显示波形

一、随机数生成 1、加入头文件&#xff1a;#include "stdlib.h" 2、定义一个用作生成随机数种子的变量并加入到滴答定时器中不断自增&#xff1a;uint32_t run_times 0; 3、设置种子&#xff1a;srand(run_times);//每次生成随机数前调用一次为佳 4、生成一个随…

大语言模型智能体:安全挑战与应对之道

在当今科技飞速发展的时代&#xff0c;大语言模型驱动的智能体正逐渐融入我们生活和工作的方方面面&#xff0c;给我们带来了诸多便利。但与此同时&#xff0c;它们的安全问题也引起了广泛的关注。今天&#xff0c;咱们就一起来深入了解一下可信大语言模型智能体所面临的安全挑…

每日OJ_牛客_kotori和素因子_DFS_C++_Java

目录 牛客_kotori和素因子_DFS 题目解析 C代码 Java代码 牛客_kotori和素因子_DFS kotori和素因子 描述&#xff1a; kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是&#xff0c;kotori有强迫症&#xff0c;她不允许两个不同的正整数取出相同的素因子…

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成会话列表2.4 利用奖励模型进行迭代偏好对齐2.4.1 训练奖励模型2.4.2 迭代偏好对齐 3. 总结 昨天面试的时候聊到了OneRec&#xff0c;但是由于上次看这篇文章已经是一个月之前&#xff0c;忘得差不多了&#xff0c…

软件测试的页面交互标准:怎样有效提高易用性

当用户遇到"反人类"设计时 "这个按钮怎么点不了&#xff1f;"、"错误提示完全看不懂"、"我输入的内容去哪了&#xff1f;"——这些用户抱怨背后&#xff0c;都指向同一个问题&#xff1a;页面交互的易用性缺陷。作为软件测试工程师&a…

共享单车出行规律与决定因素的空间交互分析——以北京六大区为例

共享单车出行规律与决定因素的空间交互分析——以北京六大区为例 原文&#xff1a;Spatial Interaction Analysis of Shared Bicycles Mobility Regularity and Determinants: A Case Study of Six Main Districts, Beijing 这篇文章主要研究了北京六个主要城区共享单车的流动…

Windows上安装FFmpeg的详细指南

1.下载FFmpeg 访问FFmpeg官方下载页面&#xff1a;https://ffmpeg.org/download.html 点击"Windows builds from gyan.dev"或"Windows builds by BtbN" gyan.dev版本&#xff1a;https://www.gyan.dev/ffmpeg/builds/ BtbN版本&#xff1a;https://githu…

作业2 CNN实现手写数字识别

# 导入必要库 import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 用于高级可视化 from tensorflow import keras from tensorflow.keras import layers from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import time # 用于…

WordPress自定义页面与文章:打造独特网站风格的进阶指南

文章目录 引言一、理解WordPress页面与文章的区别二、主题与模板层级&#xff1a;自定义的基础三、自定义页面模板&#xff1a;打造专属页面风格四、自定义文章模板&#xff1a;打造个性化文章呈现五、使用自定义字段和元数据&#xff1a;增强内容灵活性六、利用WordPress钩子&…

PHP最新好看UI个人引导页网页源码

PHP最新好看UI个人引导页网页源码 采用PHP、HTML、CSS及JavaScript等前端技术&#xff0c;构建了一个既美观又实用的个人主页解决方案。 源码设计初衷在于提供一个高度可定制、跨平台兼容的模板&#xff0c;让用户无需深厚的编程基础&#xff0c;即可快速搭建出专业且富有创意的…