转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [blog.csdn.net](https://blog.csdn.net/yanggd1987/article/details/109635821) 需求 -- 实际应用中,一个系统往往是包含前后端的,通常前端使用 Vue,后端使用 Springboot。而之前我们只是在 K8S 中配置过后端 Springboot 项目,现在我们需要将完整的系统部署到 K8S 集群中,通过本次部署可以具体分析如何部署,为日后上线生产环境做好充足的准备。 前端 -- 前端如果使用 Vue 开发,需要将打包后的 dist 放到 Web 容器的 root 目录下,在此我们使用 Deployent 来部署 Nginx pod。 ### 1.root 目录 Nginx 镜像默认配置文件中指定的 root 目录为`/usr/share/nginx/html`,我们可以使用默认根目录也可以自定义,但是要保证集群中 node 节点能共享此目录,因此需要将 root 目录进行持久化并以共享的方式挂在,在此我们使用简单的 NFS。 ``` # Master节点 mkdir /App/nfs/nginx/htdocs chmod 777 /App/nfs/nginx/htdocs cd /App/nfs/nginx/htdocs # 将dist 放到hello.test.cn 目录下 mkdir hello.test.cn mv dist . # htdocs目录将通过NFS挂载到Nginx pod的自定义站点root目录/mnt上。 /mnt/hello.test.cn/dist ``` ### 2.Nginx 配置文件 Nginx 配置文件默认放在`/etc/nginx/conf.d`中,站点配置文件通过`ConfigMap`进行定义。 ``` apiVersion: v1 kind: ConfigMap metadata: name: config-nginx-hello-test-cn namespace: test labels: app: config-nginx-hello-test-cn data: hello.test.cn.conf: |- server { listen 80; server_name hello.test.cn; location / { root /mnt/hello.test.cn/dist; index index.html index.htm; try_files $uri $uri/ /index.html; } } ``` ### 3.Nginx pod Nginx 定义为 Deployment 类型的工作负载,其中自定义站点 root 目录及具体的站点配置文件分别以`NFS`和`ConfigMap`形式进行挂载。 ``` apiVersion: apps/v1 kind: Deployment metadata: name: web-nginx namespace: test spec: selector: matchLabels: app: nginx template: metadata: name: web-nginx labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent volumeMounts: - name: htdocs mountPath: /mnt - name: config-nginx-hello-test.cn mountPath: /etc/nginx/conf.d/hello.test.cn.conf subPath: hello.test.cn.conf ports: - containerPort: 80 volumes: #挂在nfs - name: htdocs nfs: path: /App/nfs/htdocs server: 192.168.3.217 #挂在configmap - name: config-nginx-hello-test-cn configMap: name: config-nginx-hello-test-cn defaultMode: 0640 ``` 注意:hello.test.cn.conf 一定要挂载为`subPath`,否则将会变成一个目录。 ### 4.Service 前端的 Service 比较简单,部署类型为 NodePort。 ``` apiVersion: v1 kind: Service metadata: name: web-helloworld namespace: test spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 ``` 后端 -- 后端 Springboot 部署,详细配置说明可参见 [K8S 部署 Springboot 项目](https://blog.csdn.net/yanggd1987/article/details/107628001)一文,在此我们不做具体解释。 ``` # 1.Deployment apiVersion: apps/v1 kind: Deployment metadata: name: api-helloworld namespace: test spec: replicas: 1 selector: matchLabels: app: helloworld template: metadata: name: helloworld labels: app: helloworld spec: hostAliases: - ip: "10.11.10.11" hostnames: - "api1.test.cn" - "api2.test.cn" - ip: "10.11.10.12" hostnames: - "api3.test.cn" containers: - name: helloworld env: - name: JAVA_OPTS value: "-Xmx128m -Xms128m -Dspring.profiles.active=test" image: harbor.test.cn/helloworld/helloworld:1311c4520122dfa67bb60e0103c9519fcb370e50 imagePullPolicy: IfNotPresent livenessProbe: httpGet: path: /api port: 8080 initialDelaySeconds: 200 timeoutSeconds: 5 readinessProbe: httpGet: path: /api port: 8080 initialDelaySeconds: 180 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: #cpu: "0.5" memory: "500Mi" requests: #cpu: "0.5" memory: "500Mi" volumeMounts: - name: logdir mountPath: /logs - name: localtime mountPath: /etc/localtime - name: timezone mountPath: /etc/timezone imagePullSecrets: - name: harbor volumes: - name: logdir emptyDir: {} - name: localtime hostPath: path: /etc/localtime - name: timezone hostPath: path: /etc/timezone # 2.Service apiVersion: v1 kind: Service metadata: name: api-hellworld namespace: test spec: type: NodePort selector: app: helloworld ports: - port: 8080 targetPort: 8080 ``` **注意:我们在此暂时取消 CPU 资源限制,因为 Springboot 在启动时耗费的 CPU 资源较多,导致进程启动慢,在测试时可以临时关闭。** Ingress ------- Ingress 作为访问前后端的入口,我们在此将其分离出来单独讲解。 在 Ingress 中我们通过访问路由将前后端分离: * / 访问前端静态文件; * /api 访问后端接口; ### 1.http 访问 ``` apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-hello.test.cn namespace: test spec: rules: - host: hello.test.cn http: paths: - path: /api pathType: Prefix backend: serviceName: api-hellworld servicePort: 8080 - path: / pathType: Prefix backend: serviceName: web-helloworld servicePort: 80 ``` ### 2.https 访问 ``` # 1.从证书创建secret # kubectl create secret tls tls-secret-test-cn --key test.cn.key --cert test.cn.pem -n test # 2.Ingress配置 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-hello.test.cn namespace: test spec: rules: - host: hello.test.cn http: paths: - path: /api pathType: Prefix backend: serviceName: api-helloworld servicePort: 8080 - path: / pathType: Prefix backend: serviceName: web-nginx servicePort: 80 tls: - hosts: - hello.test.cn secretName: tls-secret-test-cn ``` **注意:配置 https,默认访问 http 会强制转换成 https 访问。** 在此我们可以通过`ssl-redirect设置为"false"(默认为true)`来解决,将其加入到 ingress-nginx 的全局配置文件。 ``` # vim global_configmap.yaml # ingress-nginx 全局配置文件 apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx data: proxy-connect-timeout: "300" proxy-read-timeout: "300" proxy-send-timeout: "300" proxy-body-size: "200m" ssl-redirect: "false" # 应用后,nginx会自动reload生效 # kubectl apply -f global_configmap.yaml ``` 此时既可以通过 http 访问,也可以通过 https 访问。 配置文件合并 ------ 最好我们将以上配置合并为一个配置文件`hello.test.cn.yaml`,方便使用。 ``` apiVersion: v1 kind: ConfigMap metadata: name: config-nginx-hello-test-cn namespace: test labels: app: config-nginx-hello-test-cn data: hello.test.cn.conf: |- server { listen 80; server_name hello.test.cn; location / { root /mnt/hello.test.cn/dist; index index.html index.htm; try_files $uri $uri/ /index.html; } } --- apiVersion: apps/v1 kind: Deployment metadata: name: web-nginx namespace: test spec: selector: matchLabels: app: nginx template: metadata: name: web-nginx labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent volumeMounts: - name: htdocs mountPath: /mnt - name: config-nginx-hello-test.cn mountPath: /etc/nginx/conf.d/hello.test.cn.conf subPath: hello.test.cn.conf ports: - containerPort: 80 volumes: #挂在nfs - name: htdocs nfs: path: /App/nfs/htdocs server: 192.168.3.217 #挂在configmap - name: config-nginx-hello-test-cn configMap: name: config-nginx-hello-test-cn defaultMode: 0640 --- apiVersion: apps/v1 kind: Deployment metadata: name: api-helloworld namespace: test spec: replicas: 1 selector: matchLabels: app: helloworld template: metadata: name: helloworld labels: app: helloworld spec: hostAliases: - ip: "10.11.10.11" hostnames: - "api1.test.cn" - "api2.test.cn" - ip: "10.11.10.12" hostnames: - "api3.test.cn" containers: - name: helloworld env: - name: JAVA_OPTS value: "-Xmx128m -Xms128m -Dspring.profiles.active=test" image: harbor.test.cn/helloworld/helloworld:1311c4520122dfa67bb60e0103c9519fcb370e50 imagePullPolicy: IfNotPresent livenessProbe: httpGet: path: /api port: 8080 initialDelaySeconds: 200 timeoutSeconds: 5 readinessProbe: httpGet: path: /api port: 8080 initialDelaySeconds: 180 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: #cpu: "0.5" memory: "500Mi" requests: #cpu: "0.5" memory: "500Mi" volumeMounts: - name: logdir mountPath: /logs - name: localtime mountPath: /etc/localtime - name: timezone mountPath: /etc/timezone imagePullSecrets: - name: harbor volumes: - name: logdir emptyDir: {} - name: localtime hostPath: path: /etc/localtime - name: timezone hostPath: path: /etc/timezone --- apiVersion: v1 kind: Service metadata: name: web-helloworld namespace: test spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 --- apiVersion: v1 kind: Service metadata: name: api-hellworld namespace: test spec: type: NodePort selector: app: helloworld ports: - port: 8080 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-hello.test.cn namespace: test spec: rules: - host: hello.test.cn http: paths: - path: /api pathType: Prefix backend: serviceName: api-helloworld servicePort: 8080 - path: / pathType: Prefix backend: serviceName: web-nginx servicePort: 80 tls: - hosts: - hello.test.cn secretName: tls-secret-test-cn ``` 问题思考 ---- 以上虽然实现了一套完整的前后端系统在 K8S 中部署,但是我们还需思考以下几个问题: ### 1. 共享 Nginx pod K8S 集群内一个项目我们使用一个 Nginx pod 来提供静态文件的访问,如果是多个项目将会产生很多 Nginx pod,因此是否可以考虑使用一个 Nginx pod 来运行所有项目的静态文件呢? ### 2.Nginx 热更新 每个静态站点我们都是用 ConfigMap 生成一个 Nginx 配置文件,如 hello.test.cn.conf;如果所有项目都使用同一个 Nginx pod,那么再次通过 ConfigMap 生成 Nginx 配置文件,Nginx pod 不会自动 reload,这就需要手动操作或有一套热更新机制。
幻翼
2023年6月26日 14:29
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码