searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

前端部署实战

2023-05-17 00:36:49
21
0

一、裸机部署

以BI可视化为例,如果我们要部署一个Node服务,还需要在机器上手动安装 Node、Mysql、Redis、MongoDB、Nginx,对linux环境不熟悉的话,很容易遇到问题卡半天也解决不了。

二、容器化部署

为什么我们需要Docker

隔离环境。

假设你有三个后端服务,分别用 Java、Go、Node 编写,你需要在服务器分别安装三者的环境,才能运行所有语言编写的代码。

假设你有三个 Node 服务,分别用 node10、node12、node14 编写,你需要在服务器分别安装三个版本 nodejs 才能运行各个版本 nodejs 编写的代码。

而有了 Docker,就没有这种问题,它可单独提供某种语言的运行环境,并同时与宿主机隔离起来。

对于前端而言,此时你可以通过由自己在项目中单独维护 nginx.conf 进行一些 nginx 的配置,大大提升前端的自由性和灵活度,而无需通过运维或者后端来进行。

镜像与容器

你应该在其他地方听到过镜像这个词。

比如最常见的光盘镜像,重装电脑时使用的硬盘镜像等。

它们有一些相同点:只读,不允许修改,以标准格式存储了一系列的文件,然后在需要的时候再从中提取出数据运行起来。

容器技术里的镜像也是同样的道理。因为容器是由操作系统动态创建的,那么可以用一种办法把它的初始环境给固化下来,保存成一个静态的文件,相当于是把容器给扁平化,这样就可以非常方便地存放、传输、版本化管理

镜像把运行进程所需要的文件系统、依赖库、环境变量、启动参数等所有信息打包整合到了一起。之后镜像文件无论放在哪里,操作系统都能根据这个“样本”快速重建容器。

镜像里面不仅有基本的可执行文件,还有应用运行时的整个系统环境。这就让镜像具有了非常好的跨平台便携性和兼容性,完全不需要考虑环境依赖的问题。

镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。

Dockerfile

那镜像是怎么创建出来的?如何制作镜像?

如果把容器想象成一个房子,镜像就是“样板间”。那么,要造出这个“样板间”,就必然要有一个“施工图纸”,由它来规定如何建造地基、如何铺设水电线路等动作。这个“施工图纸”就是“Dockerfile”。

Dockerfile 就是一个纯文本,里面记录了一系列的构建指令。

# 所有的 Dockerfile 都要从它开始,表示选择构建使用的基础镜像,相当于“打地基”
FROM nginx

# 把当前目录下dist文件夹下的所有内容复制到目标路径下
COPY dist/ /usr/share/nginx/html/

COPY nginx.conf /etc/nginx/conf.d/default.conf

构建镜像

如果说Dockerfile是图纸的话,那么docker build命令就是施工队。

使用 docker build命令可基于 Dockerfile 构建镜像。

docker build -t harbor.ctyun.cn/{project}/web:{version} .

docker push harbor.ctyun.cn/{project}/web:{version}

Yaml:K8S世界里的通用语

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: {{DEPLOYMENT_NAME}}
  name: {{DEPLOYMENT_NAME}}
  namespace: {{NAMESPACE}}
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      run: {{DEPLOYMENT_NAME}}
  template:
    metadata:
      labels:
        run: {{DEPLOYMENT_NAME}}
    spec:
      imagePullSecrets:
        - name: harboreg
      containers:
        - image: {{imageUrl}}
          imagePullPolicy: IfNotPresent
          name: {{DEPLOYMENT_NAME}}
      restartPolicy: Always
kind: Service
apiVersion: v1
metadata:
  name: {{DEPLOYMENT_NAME}}
  namespace: {{NAMESPACE}}
spec:
  selector:
    run: {{DEPLOYMENT_NAME}}
  ports:
    - protocol: TCP
      port: 80
      targetPort: {{SERVICE_TARGET_PORT}}

kubectl apply -f k8s.yaml

三、实用技能

1. 免密登录

1.1 登录服务器:ssh

ssh,secure shell protocol,以更加安全的方式连接远程服务器。

ssh root@192.168.31.1

但是记住ip地址是一个反人类的操作,如果你有很多个服务器呢?

1.2 配置别名快速登录:ssh-config

Mac电脑的ssh-config在~/.ssh/config

# 修改 ssh 配置文件 ~/.ssh/config

Host yyc
    HostName 192.168.31.1
    User root

# 模板
Host <hostname>
    HostName <ip>
    User <user>
  	Port <port>

配置成功之后直接 ssh <hostname> 就可以直接登录了,再也不用记住ip了。

ssh yyc
1.3 免密登录:public-key 与 ssh-copy-id

虽然不需要记住ip了,但是每次登录都需要输入密码,为了进一步解放生产力,我们可以配置免密登录,彻底解放双手。原理就是把本地文件~/.ssh/id_rsa.pub中的内容复制粘贴到远程服务器~/.ssh/authorized_keys

总结成一句话,把自己的公钥放在远程服务器的 authorized_keys 中。

我们可以通过ssh-copy-id来快速实现这一步骤。

# 第一次会提示输入密码
ssh-copy-id yyc

# 后续登录无需密码
ssh yyc

2. ProxyJump

你一定听到过一些名词,公网堡垒机或者4A内网堡垒机。没有接触机器前,我根本弄不明白这玩意儿干什么用的。

堡垒机,又称跳板机或者中转机。由于安全风险,公司的服务器不允许被公网 IP 直接访问,而只能通过堡垒机来访问。目前我们公司每个组都有组内专用的中转机。

以BI可视化为例,我们登录息壤的测试环境,中间经过了两次中转,如下图所示。

如果不配置ProxyJump,那么我每次登录机器就会是下面这个步骤。

ssh fe_jump
ssh cb_jump
ssh xirang

配置ProxyJump,可直接登录目标主机,在传输文件时能极大的提升效率。

# 目标机器
Host xirang
    HostName 10.0.0.30
    User root
    ProxyJump cb_jump
# 城市大脑项目组中转机
Host cb_jump
    HostName 180.1.0.1
    User root
    ProxyJump fe_jump
# 前端组中转机
Host fe_jump
		HostName 192.168.31.1
		User user
# 可跨过中转机,直接登录到目标主机

ssh xirang

3. rsync

是一个快速高效,支持断点续传、按需复制的文件拷贝工具,并支持远程服务器拷贝

强烈建议使用rsync替换cp

# 将本地的 dist 拷贝到服务器的 /opt/fe 目录

# -l:--links,拷贝符号链接
# -a:--archive,归档模式
# -h:--human-readable,可读化格式进行输出
# -z:--compress,压缩传输
# -v:--verbose,详细输出
# yyc: 远程服务器别名
$ rsync -lahzv dist yyc:/opt/fe

rsync 归档模式最大的好处是可以拷贝元属性,如 ctime/mtime/mode 等等。

结合ProxyJump,可以跳过多个中转机,直接把文件传到目标服务器上。在需要传输大文件的时候,简直就是强强联手,天下无敌了。

rsync -lahzv dist xirang:/opt/fe
0条评论
0 / 1000
姚****晨
3文章数
0粉丝数
姚****晨
3 文章 | 0 粉丝
姚****晨
3文章数
0粉丝数
姚****晨
3 文章 | 0 粉丝
原创

前端部署实战

2023-05-17 00:36:49
21
0

一、裸机部署

以BI可视化为例,如果我们要部署一个Node服务,还需要在机器上手动安装 Node、Mysql、Redis、MongoDB、Nginx,对linux环境不熟悉的话,很容易遇到问题卡半天也解决不了。

二、容器化部署

为什么我们需要Docker

隔离环境。

假设你有三个后端服务,分别用 Java、Go、Node 编写,你需要在服务器分别安装三者的环境,才能运行所有语言编写的代码。

假设你有三个 Node 服务,分别用 node10、node12、node14 编写,你需要在服务器分别安装三个版本 nodejs 才能运行各个版本 nodejs 编写的代码。

而有了 Docker,就没有这种问题,它可单独提供某种语言的运行环境,并同时与宿主机隔离起来。

对于前端而言,此时你可以通过由自己在项目中单独维护 nginx.conf 进行一些 nginx 的配置,大大提升前端的自由性和灵活度,而无需通过运维或者后端来进行。

镜像与容器

你应该在其他地方听到过镜像这个词。

比如最常见的光盘镜像,重装电脑时使用的硬盘镜像等。

它们有一些相同点:只读,不允许修改,以标准格式存储了一系列的文件,然后在需要的时候再从中提取出数据运行起来。

容器技术里的镜像也是同样的道理。因为容器是由操作系统动态创建的,那么可以用一种办法把它的初始环境给固化下来,保存成一个静态的文件,相当于是把容器给扁平化,这样就可以非常方便地存放、传输、版本化管理

镜像把运行进程所需要的文件系统、依赖库、环境变量、启动参数等所有信息打包整合到了一起。之后镜像文件无论放在哪里,操作系统都能根据这个“样本”快速重建容器。

镜像里面不仅有基本的可执行文件,还有应用运行时的整个系统环境。这就让镜像具有了非常好的跨平台便携性和兼容性,完全不需要考虑环境依赖的问题。

镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。

Dockerfile

那镜像是怎么创建出来的?如何制作镜像?

如果把容器想象成一个房子,镜像就是“样板间”。那么,要造出这个“样板间”,就必然要有一个“施工图纸”,由它来规定如何建造地基、如何铺设水电线路等动作。这个“施工图纸”就是“Dockerfile”。

Dockerfile 就是一个纯文本,里面记录了一系列的构建指令。

# 所有的 Dockerfile 都要从它开始,表示选择构建使用的基础镜像,相当于“打地基”
FROM nginx

# 把当前目录下dist文件夹下的所有内容复制到目标路径下
COPY dist/ /usr/share/nginx/html/

COPY nginx.conf /etc/nginx/conf.d/default.conf

构建镜像

如果说Dockerfile是图纸的话,那么docker build命令就是施工队。

使用 docker build命令可基于 Dockerfile 构建镜像。

docker build -t harbor.ctyun.cn/{project}/web:{version} .

docker push harbor.ctyun.cn/{project}/web:{version}

Yaml:K8S世界里的通用语

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: {{DEPLOYMENT_NAME}}
  name: {{DEPLOYMENT_NAME}}
  namespace: {{NAMESPACE}}
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      run: {{DEPLOYMENT_NAME}}
  template:
    metadata:
      labels:
        run: {{DEPLOYMENT_NAME}}
    spec:
      imagePullSecrets:
        - name: harboreg
      containers:
        - image: {{imageUrl}}
          imagePullPolicy: IfNotPresent
          name: {{DEPLOYMENT_NAME}}
      restartPolicy: Always
kind: Service
apiVersion: v1
metadata:
  name: {{DEPLOYMENT_NAME}}
  namespace: {{NAMESPACE}}
spec:
  selector:
    run: {{DEPLOYMENT_NAME}}
  ports:
    - protocol: TCP
      port: 80
      targetPort: {{SERVICE_TARGET_PORT}}

kubectl apply -f k8s.yaml

三、实用技能

1. 免密登录

1.1 登录服务器:ssh

ssh,secure shell protocol,以更加安全的方式连接远程服务器。

ssh root@192.168.31.1

但是记住ip地址是一个反人类的操作,如果你有很多个服务器呢?

1.2 配置别名快速登录:ssh-config

Mac电脑的ssh-config在~/.ssh/config

# 修改 ssh 配置文件 ~/.ssh/config

Host yyc
    HostName 192.168.31.1
    User root

# 模板
Host <hostname>
    HostName <ip>
    User <user>
  	Port <port>

配置成功之后直接 ssh <hostname> 就可以直接登录了,再也不用记住ip了。

ssh yyc
1.3 免密登录:public-key 与 ssh-copy-id

虽然不需要记住ip了,但是每次登录都需要输入密码,为了进一步解放生产力,我们可以配置免密登录,彻底解放双手。原理就是把本地文件~/.ssh/id_rsa.pub中的内容复制粘贴到远程服务器~/.ssh/authorized_keys

总结成一句话,把自己的公钥放在远程服务器的 authorized_keys 中。

我们可以通过ssh-copy-id来快速实现这一步骤。

# 第一次会提示输入密码
ssh-copy-id yyc

# 后续登录无需密码
ssh yyc

2. ProxyJump

你一定听到过一些名词,公网堡垒机或者4A内网堡垒机。没有接触机器前,我根本弄不明白这玩意儿干什么用的。

堡垒机,又称跳板机或者中转机。由于安全风险,公司的服务器不允许被公网 IP 直接访问,而只能通过堡垒机来访问。目前我们公司每个组都有组内专用的中转机。

以BI可视化为例,我们登录息壤的测试环境,中间经过了两次中转,如下图所示。

如果不配置ProxyJump,那么我每次登录机器就会是下面这个步骤。

ssh fe_jump
ssh cb_jump
ssh xirang

配置ProxyJump,可直接登录目标主机,在传输文件时能极大的提升效率。

# 目标机器
Host xirang
    HostName 10.0.0.30
    User root
    ProxyJump cb_jump
# 城市大脑项目组中转机
Host cb_jump
    HostName 180.1.0.1
    User root
    ProxyJump fe_jump
# 前端组中转机
Host fe_jump
		HostName 192.168.31.1
		User user
# 可跨过中转机,直接登录到目标主机

ssh xirang

3. rsync

是一个快速高效,支持断点续传、按需复制的文件拷贝工具,并支持远程服务器拷贝

强烈建议使用rsync替换cp

# 将本地的 dist 拷贝到服务器的 /opt/fe 目录

# -l:--links,拷贝符号链接
# -a:--archive,归档模式
# -h:--human-readable,可读化格式进行输出
# -z:--compress,压缩传输
# -v:--verbose,详细输出
# yyc: 远程服务器别名
$ rsync -lahzv dist yyc:/opt/fe

rsync 归档模式最大的好处是可以拷贝元属性,如 ctime/mtime/mode 等等。

结合ProxyJump,可以跳过多个中转机,直接把文件传到目标服务器上。在需要传输大文件的时候,简直就是强强联手,天下无敌了。

rsync -lahzv dist xirang:/opt/fe
文章来自个人专栏
前端部署实战
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0