【Kubernetes】前端SPA应用部署Kubernetes

首席Bug官
• 阅读 2246

前言

最近了解到很多团队会用到Kubernetes来统一管理应用. 当然. 我们公司也不例外。所以后续会对 各种类型的应用上 Kubernetes 做一些分享。

统一部署Kubernetes的好处.

可以对所有应用统一管理. 融灾. 迁移...

举个🌰. 当我们在阿里云深圳区A的k8s集群因为各种原因出现服务故障 无法正常提供服务后. 我们可以快速在 上海区 或者 其他云例如 Azure 购买服务器然后通过ansible脚本一键部署k8s集群. 在最快的时间内恢复服务.

实施

SPA 应用因为完全没有涉及到node 跟 服务端. 我们都不需要用到 Service, 只需要一个 Ingress 跟 CDN 存储, 我们可以直接将每个版本的资源上传到CDN. 然后通过 Ingress 转发到 CDN 到每个版本.

【Kubernetes】前端SPA应用部署Kubernetes

我们先创建一个 helm 项目.
helm 是一个k8s的项目管理工具. 这里我们不讨论. google关于这个的资料.

helm create frontendexamples

### 因为我们只需要用到 ingress 所以删除其他多余到服务.
rm deployment.yaml service.yaml serviceaccount.yaml

然后编辑 ingress.yaml 成我们需要到样子. 根据前端到静态资源来转发并且根据版本号做缓存

{{- $ingress := .Values.ingress }}
{{- $top := . -}}
{{- if $ingress.enabled }}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ include "frontendexamples.fullname" . }}-{{ $ingress.name }}
  labels:
    {{- include "frontendexamples.labels" . | nindent 4 }}
  {{- with $ingress.annotations }}
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/configuration-snippet: |
      ### 默认重定向到首页
      return 302 $scheme://$host/index.html;
    nginx.ingress.kubernetes.io/server-snippet: |
        location = / {
          return 302 $scheme://$host/index.html;
        }
      
        {{- $cdnHost := $top.Values.cdnHost -}}
        {{- $cdnPrefix := $top.Values.cdnPrefix -}}
        {{- range $top.Values.htmlList -}}

        location = {{ . }} {
          rewrite ^(.*)$ /{{ $cdnPrefix }}{{ . }} break; 
          proxy_pass {{ $cdnHost }};
          proxy_buffering on;
          proxy_buffer_size  128k;
          proxy_buffers 100  128k;
          proxy_cache        auth_cache;
          proxy_cache_key {{ $cdnPrefix }};
          proxy_cache_valid      200  1d;
          proxy_cache_use_stale  error timeout invalid_header updating
                                 http_500 http_502 http_503 http_504;
        }
        {{- end -}}
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  rules:
  {{- range $ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ . }}
            backend:
              serviceName: none
              servicePort: 80
        {{- end }}
  {{- end }}
{{- end }}

然后. 我们写一个前端编译然后生成对应静态资源文件(index.html)的部署bash脚本.

用来生成一份helm values文件

# Default values for frontendexamples.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
cdnHost: "https://bg-stage.wkcoding.com/"
cdnPrefix: "wixland/pro/2031"
htmlList:
    - /index.html

build -> upload cdn -> generate html values

scripts/deploy.sh

#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

### get project dir
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"

readonly PROJECT_ROOT="$(dirname $DIR)"
readonly BUILDOUT_DIR=${BUILDOUT_DIR:-"$PROJECT_ROOT/build"}
readonly BUCKET_HOST=${BUCKET_HOST:-""}
readonly APPLICATION_NAME=${APPLICATION_NAME:-"frontendexamples"}
readonly RESOURCES_PREFIX=${RESOURCES_PREFIX:-"wixland/pro"}
readonly BUCKET=${BUCKET:-"bp-stage"}
readonly QINIU_AK=${QINIU_AK:-""}
readonly QINIU_SK=${QINIU_SK:-""}

cd $PROJECT_ROOT
VERSION=""

### application version
get_current_version() {
    if [[ -z "$VERSION" ]]; then
        echo -e "Enter version:" >&2
        read -r VERSION
    fi
    echo $VERSION;
    #echo $(date +%Y%m%d%H%M%S)
}

### build code
build() {
    echo "building..."
    version=${1:-""}
    appVersion=${version} appResourcesPrefix=${RESOURCES_PREFIX} cdnHost=${BUCKET_HOST} yarn build
}

### upload builded code to qiniu cdn
upload() {
    echo "uploading..."
    version=${1:-""}
    /Users/albert/code/github/qiniu-uploader/bin/qiniu-upload.js -r 1 -es 1000000 \
    --verbose -b ${BUCKET} \
    -p "${RESOURCES_PREFIX}/${version}" \
    --base ./build --ak ${QINIU_AK} --sk ${QINIU_SK} 'build/**'
}

### Auto install [qiniu2uploader](https://github.com/work4fun/qiniu-uploader)
### An small resume upload qiniu tools
dectect_autoinstall_qiniu2uploader() {
    if ! [ -x "$(command -v qiniu-upload)" ]; then
        yarn global add -g qiniu2uploader
    fi
}

dectect_autoinstall_qiniu2uploader

version=$(get_current_version)

build $version
upload $version


### Generate helm values.
### Examples:
### cdnHost: "http://bg-stage.wkcoding.com/"
### cdnPrefix: "wixland/pro/20000"
### htmlList: 
###  - /index.html
###
htmlList=""
for html in $(find "$BUILDOUT_DIR" -type f -name "*.html")
do
    ### Replace string
    ### ${content/search/replace}
    html=${html/$BUILDOUT_DIR/''}
    htmlList="- $html
  $htmlList
"
done

cat << EOF > "$PROJECT_ROOT/docker/$APPLICATION_NAME/html.yaml"
# Default values for $APPLICATION_NAME.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
cdnHost: "https:$BUCKET_HOST"
cdnPrefix: "$RESOURCES_PREFIX/$version"
htmlList: 
  $htmlList
EOF

### deploy with helm
helm upgrade $APPLICATION_NAME ./docker/$APPLICATION_NAME --install --values ./docker/$APPLICATION_NAME/html.yaml

上面都完成后我们只需要运行. 就可以完成部署了.

bash ./scripts/deploy.sh

缺点

  • 依赖 ingress-nginx
  • 依赖单点cdn存储. 如果cdn挂了集群也挂了.
  • 缺少对cdn的监控

后续

  • 实现多cdn上传
  • 实现cdn心跳检测. 自动切换主/备 CDN

以上源码都在 https://github.com/work4fun/e...

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
DevOpSec DevOpSec
4年前
Kubernetes(k8s)中文文档 Kubernetes概述
简介Kubernetes(https://www.kubernetes.org.cn/)是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes一个核心的特点就是能够自主的管理容
Stella981 Stella981
3年前
Rancher开源Harvester:基于K8s的超融合基础架构软件
2020年12月17日,业界应用最为广泛的Kubernetes管理平台创建者RancherLabs(以下简称Rancher)宣布推出全新开源软件Harvester,一个通过Kubernetes构建的超融合基础架构(HCI)软件。!图片(https://img.rwimg.top/7592_5649bc00e54d4b30a1419db9c4
Stella981 Stella981
3年前
Kubernetes 部署 Nebula 图数据库集群
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。<br/Kubernetes在设计结构上定义了一系列的构建模块,其目的是为了提供一个可以部署、维护和扩展应用程序的机制,组成Kubernetes
Stella981 Stella981
3年前
Kubernetes的四种用户部署场景,你知吗?
Kubernetes可以作为容器编排引擎、PaaS或者作为云原生应用的核心基础架构被用户部署到生产环境。这些用例并不是相互排斥的。DevOps可以委托基于Kubernetes的PaaS层完成整个应用生命周期的管理(ALM),也可以独立部署Kubernetes管理CI/CD工具部署的应用。对于新应用程序可以使用Kubernetes管理微服务架构的云原始应用,支
Wesley13 Wesley13
3年前
2019 年 CNCF 中国云原生调查报告
!头图.jpg(https://ucc.alicdn.com/pic/developerecology/6db0c465111b4d9a96eb1ffe85c00e7a.jpg)中国72%的受访者生产中使用Kubernetes在CNCF,为更好地了解开源和云原生技术的使用,我们定期调查社区。这是第三次中国云原生调查,以中文进行
Stella981 Stella981
3年前
Kubernetes(K8S)
一、简介  Kubernetes是Google公司在2014年6月开源的一个容器集群管理系统,使用Go语言开发,也叫K8S。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Kubernetes入门篇
前言随着越来越多的公司使用Kubernetes作为它们运行应用的最佳平台,Kubernetes帮助企业标准化了无论是云端部署还是内部部署的应用交付方式;作为研发人员我们还是很有必要去了解其使用方式,了解其内部机制,接下来的一段时间准备通过阅读<KubernetesinAction来更多的了解Kubernetes。Docker安装