十分钟教你在 k8s 中部署一个前后端应用

好多开发人员,尤其是没接触过 k8s 的人员对如何在k8s中部署一个 前后端应用很模糊,不知如何下手,所以本篇讲一下如何快速在 k8s 部署一个前后端应用,让大家对k8s有个快速认识

前置依赖

  • k8s集群,如果没有安装,请参考k8s 部署手册

  • kubectl ,客户端部署需要依赖

应用镜像构建

应用镜像构建不用自己去执行,相关镜像已经推送到 docker hub仓库,如果要了解过程和细节,可以看一下,否则直接跳到k8s yaml 文件配置章节

Java应用镜像构建

代码地址:GitHub - dongweizhao/backend: k8s学习demo

Java应用打包

调用sh package.sh会执行mvn的package命令,进行打包

编写Dockerfile

从target目录复制可执行jar

FROM openjdk:8-jre
COPY target/backend-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT java -jar ${JAVA_OPTS} /app.jar

镜像打包推送

执行sh push.sh 推送至dockerhub仓库,镜像地址:dweizhao/backend:latest

前端应用镜像构建

代码地址:GitHub - dongweizhao/frontend: k8s学习前端demo前端项目结构如下

采用百度低代码平台amis进行开发

编写Dockerfile

拷贝前端工程dist目录至/frontend,并进行目录授权

from nginx
copy ./dist /frontend
run chown nginx.nginx /frontend -R
copy nginx.conf /etc/nginx/conf.d/default.conf

编写nginx.conf文件

server{listen 80;server_name localhost;root  /frontend;index index.html index.htm;location /login {try_files $uri $uri/ /login.html;}
}

推送镜像

执行sh push.sh推送dockerhub仓库,镜像地址:dweizhao/frontend:latest

k8s yaml文件配置

以下是我们部署的服务在k8s 中路由示意图

后端服务配置

backend-dp.yaml

由于我们服务是无状态服务,使用Deployment进行部署,Deployment拥有更加灵活强大的升级、回滚功能,并且支持滚动更新

apiVersion: apps/v1
kind: Deployment
metadata:name:  backend
spec:selector:matchLabels:app:  backendreplicas: 1template:metadata:labels:# service 会根据此标签来查找此podapp:  backendversion: latestspec:containers:- name: backendimage: "dweizhao/backend:latest"imagePullPolicy: Always

backend-svc.yaml

Service相当于Spring cloud中Ribbon的作用,提供了服务发现和负载均衡的功能,而不用关心具体服务实例有多少个,在 k8s 的服务实例就是Pod,这里我们使用ClusterIP类型,因为是通过Ingress在集群内访问,通过 app:backend标签,来查找对应 pod,所以 pod 的label 必须包含app:backend

apiVersion: v1
kind: Service
metadata:name: backend
spec:type: ClusterIPports:- name: backend-httpport: 8080targetPort: 8080protocol: TCPselector:# 根据标签查找 podapp: backend

前端服务配置

frontend-dp.yaml

前端镜像是一个 nginx的,

apiVersion: apps/v1
kind: Deployment
metadata:name:  frontend
spec:selector:matchLabels:app:  frontendreplicas: 1template:metadata:labels:# service 会根据此标签来查找此podapp:  frontendversion: latestspec:containers:- name: frontendimage: "dweizhao/frontend:latest"imagePullPolicy: Always

frontend-svc.yaml

apiVersion: v1
kind: Service
metadata:name: frontend
spec:type: ClusterIPports:- name: frontend-httpport: 80targetPort: 80protocol: TCPselector:# 根据标签查找 podapp: frontend

Ingress配置

Ingress相当于nginx 的作用,匹配url转发请求至Service

注意:k8s不同的版本,对应的Ingress apiVerson 有点细微差别,所以要找到对应k8s版本的Ingress,我们的 k8s 版本为v1.25.13

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: test-ingress
spec:ingressClassName: nginxrules:- host: k8sdemo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: frontendport:number: 80#backend开头的 url,转发到后端服务 ,否则都转发到前端服务              - path: /backendpathType: Prefixbackend:service:name: backendport:number: 8080

k8s部署

部署使用 kubectl 进行部署,如果没有请先安装,安装完成以后,把以上yaml文件保存至本地

创建命名空间

kubectl create namespace k8sdemo

部署

部署系统至k8sdemo空间下

kubectl create namespace k8sdemo && kubectl apply -f backend-dp.yaml -f backend-svc.yaml -f frontend-dp.yaml -f frontend-svc.yaml -f ingress.yaml -n k8sdemo

查看系统状态

#查看pod 启动状态
kubectl get pods -n k8sdemo
# 查看服务状态
kubectl get svc -n k8sdemo
# 查看Ingress状态
kubectl get ingress -n k8sdemo

host 解析

在 hosts 文件中,对k8sdemo.com域名映射,映射到k8s 的任意 node 节点上即可,假设IP为172.18.2.53,配置如下

测试

在浏览器访问k8sdemo.com,如果出现以下结果则部署成功,可以看到正确请求到数据,这个数据为backend提供

总结

以上我们只是简单演示了下,如何在 k8s 中快速部署一个前后端应用,让你对在 k8s 操作有一个快速认识,但是此应用如果要在生产使用还要在做些配置,比如探针配置,因为后端服务的启动,可能是个假启动,必须要配置探针探活之后,才能让 service访问,否则导致请求异常,同时应用有些文件如果需要持久化,还需要配置存储卷等操作

文章转载自:架构成长指南

原文链接:https://www.cnblogs.com/waldron/p/17960915

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618957.shtml

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

相关文章

什么是RoPE-旋转位置编码?

RoPE位置编码是大模型中最常见的位置编码之一。像是谷歌的PaLM和meta的LLaMA等开源大模型都是RoPE位置编码,那么RoPE有什么特点呢? 本文将介绍如下内容: RoPE旋转位置编码概要什么是位置编码?RoPE及其特点总结 一、RoPE旋转位置…

stm32学习笔记:DMA

每个DMA通道硬件触发源是不一样的,要使用某个外设的硬件触发源,就必须使用它连接的那个通道 12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发 C8T6 DMA资源:DMA1 &#xff…

Python自动化我选DrissionPage,弃用Selenium

DrissionPage 是一个基于 python 的网页自动化工具。 它既能控制浏览器,也能收发数据包,还能把两者合而为一。 可兼顾浏览器自动化的便利性和 requests 的高效率。 它功能强大,内置无数人性化设计和便捷功能。 它的语法简洁而优雅&#x…

数据库和表的操作

文章目录 前言一、库的操作创建数据库字符集和校验规则操纵数据库查看数据库显示创建语句修改数据库删除数据库备份和恢复数据库还原查看连接情况 二、表的操作创建表查看表结构修改表修改表名添加一列修改某一列属性删除某一列 删除表 前言 一、库的操作 创建数据库 语法&am…

【Python机器学习】分类器的不确定估计——决策函数

scikit-learn接口的分类器能够给出预测的不确定度估计,一般来说,分类器会预测一个测试点属于哪个类别,还包括它对这个预测的置信程度。 scikit-learn中有两个函数可以用于获取分类器的不确定度估计:decidion_function和predict_pr…

day06

1.八大基本数据类型整型: byte short int long 浮点: double float字符: char布尔: boolean2.声明变量的语法格式数据类型 变量名字 初始化的值; 3.使用for循环打印等腰三角形for (int i 1; i < 4; i) {for (int j 1; j < 4 - i; j) {System.out.print(" &qu…

计算机毕业设计----SSH电子相册管理系统

项目介绍 本项目分为普通用户与管理员两个角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登陆,用户信息管理,登陆密码修改等功能。 用户角色包含以下功能&#xff1a; 用户登陆,个人信息管理,相册管理,上传照片等功能。 环境需要 1.运行环境&#xff1a;最好…

高效办公:在文件夹名称左边插入关键字,提高文件管理效率

在繁忙的工作环境中&#xff0c;经常要处理大量的文件和文件夹。有效的文件管理是一个挑战&#xff0c;大量的文件和文件夹难以找到所需的资料。下面一起来看云炫文件管理器如何在文件夹名称左边批量插入关键字。 文件夹名称左边添加关键字前后对比图。 文件夹名称左边批量插…

P1379 八数码难题

题目描述 在 33 的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格&#xff0c;空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a;给出一种初始布局&#xff08;初始状态&#xff09;和目标布局&…

哪里能找到好用的PPT模板?12个免费模板网站让你畅快办公!

你是否有过这样的经历&#xff0c;在准备重要会议或者演讲的时候&#xff0c;为找不到合适的PPT模板而困扰&#xff1f;或是在网上漫无目的地搜寻&#xff0c;结果收获的是设计平淡无奇的PPT模板&#xff1f; 如果你有同样的疑问&#xff0c;那么你来对地方了&#xff01;在这…

电脑扩容升级硬盘选1T还是2T

SSD固态有必要升级2TB吗&#xff1f;----------吴中函 某大二学生用的一台笔记本电脑&#xff0c;512GB的硬盘空间已经严重不够用了&#xff0c;想给笔记本扩容升级一下硬盘&#xff1b; 这位学生是学设计专业的、平时也喜欢摄影、电脑里面也装了一些游戏&#xff0c;经常整理、…

Linux技术,winSCP连接服务器超时故障解决方案

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 故障现象 使用 sftp 协议连接主机时, 明显感觉缓慢且卡顿,并且时常出现如下报错: 点击重新连接后,又有概率重新连接上; 总之在"连接上"和&…

【Web】NSSCTF Round#16 Basic个人wp(全)

出题友好&#xff0c;适合手生复健。 目录 ①RCE但是没有完全RCE ②了解过PHP特性吗 ①RCE但是没有完全RCE 上来就是一段md5八股 (string)就是不让用数组了&#xff0c;然后强比较需要md5碰撞 ?md5_1%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc…

josef约瑟 中间继电器 HJDZ-E440额定电压:AC220V 卡轨安装

HJDZ-静态中间继电器 系列型号&#xff1a; HJDZ-A200静态中间继电器&#xff1b;HJDZ-A110静态中间继电器&#xff1b; HJDZ-A002静态中间继电器&#xff1b;HJDZ-A004静态中间继电器&#xff1b; HJDZ-E112静态中间继电器&#xff1b;HJDZ-E112L静态中间继电器&#xff1…

计算机网络——应用层(3)

计算机网络——应用层&#xff08;3&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 点对点&#xff08;P2P&#xff09;P2P网络一般用途优点缺点总结 套接字编程基本步骤UDP套接字TCP套接字基本步骤 二者对比 小程一言 我的计算机网络专栏&#xff0c;是自…

开放式耳机和骨传导耳机有什么区别?谁更值得入手?

很多人都知道开放式耳机&#xff0c;但很少有人知道其实骨传导耳机也算开放式耳机的一种&#xff0c;事实上&#xff0c;开放式耳机可以分为气传导耳机和骨传导耳机两种类型&#xff0c;这两种耳机佩戴方式都是开放双耳机&#xff0c;但传声方式有所不同&#xff0c;下面简单科…

《C语言学习》---郝斌版---笔记

简介 学习计算机&#xff0c;离不开C语言的学习&#xff0c;而C语言学习过程中的视频课教程&#xff0c;目前来说&#xff0c;如果郝斌老师的C语言排第二&#xff0c;没有人敢排第一 郝斌老师的C语言教程&#xff0c;通俗易懂&#xff0c;引人发思&#xff0c;特别适合新手入门…

如何定义核心场景用例?

首先我们解决两个问题&#xff1a; 1.什么是场景测试&#xff1f;2.什么是核心场景&#xff1f; 1、什么是场景测试&#xff1f; &#x1f3af; 1.1&#xff1a;什么是场景 事件触发时的情景形成了场景。场景必不可少的几个要素&#xff1a;环境、人、时间、行为。简而言之&…

Rust-变量

Rust的变量必须先声明后使用。对于局部变量&#xff0c;最常见的声明语法为&#xff1a; let variable:i32 100;与传统的C/C语言相比&#xff0c;Rust的变量声明语法不同。这样设计主要有以下几个方面的考虑。 语法分析更容易 从语法分析的角度来说&#xff0c;Rust的变量声明…

Linux系统编程(十一):高级 IO

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 非阻塞 I/O 阻塞就是进入了休眠状态&#xff0c;交出了 CPU 控制权阻塞 I/O 就是对文件的 I/O 操作&#xff08;读写操作&#xff09;是阻塞式的&#xff0c;非阻塞 I/O 就是对文件的 I/O 操作是非阻塞的…