狠狠撸

狠狠撸Share a Scribd company logo
前端转行 DevOps
经验分享
王龑 · 北京
内容
? 背景介绍
? 前端工程化到 DevOps
? DevOps 利器 Docker
? Ansible 介绍和使用
? 使用 Node.js 开发一个 Docker 插件
2017/4/23 2
背景介绍
2017/4/23 3
《北森2016-2017中国公司招聘指数报告》
2017/4/23 4http://www.beisen.com/activity/zpzs
不仅是前端工程师和程序员
“鲁班”AI 设计系统
? 双 11 期间 1.7 亿个 Banner
2017/4/23 5http://www.uisdc.com/alibaba-luban-ai-banner
“鲁班”AI 设计系统
2017/4/23 6http://www.uisdc.com/alibaba-luban-ai-banner
《 2017互联网人才流动报告》
2017/4/23 7http://weibo.com/3632539935/EA1R64Ehx
工作职责
? 负责 React 前端开发
? 主导前端工程化,一键部署
? 运维了 N 多个服务,博客、网站
? 监控和业务数据分析
? 推动自动化程度的提升
2017/4/23 8
前端工程化
? 技术升级
? 框架技术选型
? 模块化、组件化
? 构建工具
? 预处理技术 Jade / Less / Babel
? 文件压缩
? 持续集成
? 单元测试
? 语法规范
? 每次 Push 触发 Jenkins 构建
? 平均每天 1~2 次发布
? 持续部署
? CDN
? 配置管理
2017/4/23 9
2017/4/23 10
源代码
分支管理
包管理
图片
Jenkins
Gitlab CI
10分钟修复
静态文件
测试报告
jMeter 压测
Zip
War
POM
apk
配置管理
Maven
NPM
SFTP
Nginx
错误监控
业务数据
DevOps 流水线
2017/4/23 11
前端
后端
第三方服务
保障服务存活
? 方法
? Nohup 挂后台
? Daemon Process 交给操作系统
? Supervisord 支持多个命令
? PM2 + Keymetrics 设计超前
? Docker
? 需求
? 查看管理服务的状态
? 监控 CPU,磁盘,网络
? 服务发现
2017/4/23 12
Docker
? 标准化
? 多平台
? 版本控制
? 隔离性
? 安全性
2017/4/23 13
从单机到集群
? 1 台 Docker 主机
? InfluxDB
? Grafana
? Sentry
? Postgres
? Ghost
? Metabase
? MongoDB
? 十几个容器,负载不断上升
? 升级重启需要花费 15 分钟
? 调研集群方案,最终确定 Swarm
? 最小成本 Hold 住
2017/4/23 14
Docker Swarm
2017/4/23 15
对于集群
? 权限
? 自签名证书
? Portainer
? 监控
? cAdvisor + InfluxDB + Grafana
? 日志
? ELK Stack + Gelf Driver
? 负载均衡
? Traefik
? *.swarm.company.com
2017/4/23 16
修改服务以更好的适应集群
? 以 Grafana 为例
? 改动前
? 只有一个容器 App
? 使用 SQLite 数据库
? 改动后
? 使用三个容器 Web / DB / Session
? Web 容器可以水平伸缩
? 数据库迁移到 Postgres
? 使用 Memcache 做粘性的 Session
2017/4/23 17
overlay network
2017/4/23 18
all in one
web-2db
session
单节点
集群
web-1
node-1 node-2 node-3
2017/4/23 19
Ansible – 自动化运维工具
? 特点
? 基于 Python 和 SSH 不用安装 Agent
? Inventory 支持主机分组管理
? 能够批量执行命令
? 封装了安装软件包等常用操作
? 支持 YAML 格式的 Playbook 剧本
2017/4/23 20https://www.ansible.com/it-automation
使用 Ansible 的公司
2017/4/23 21
使用 Ansible 安装 Nginx
---
- hosts: web-server
become: true
tasks:
- name: 使用默认配置安装 Nginx
apt:
name: nginx
state: present
2017/4/23 22
? 命令行
? ansible-playbook install_nginx.yml
? 可读性
? 使用 YAML 编写 Playbook
? 声明式
? 类似于单元测试里的断言 assert. true ( nginx is present )
? 幂等性
Ansible 架构
? Ansible Core 核心
? Host Inventory 主机列表
? Playbooks 剧本
? Modules 模块 (900+)
? Plugins 插件
? Ansible Tower 可视化
2017/4/23 23https://terry.im/wiki/terry/Ansible.html
Inventory
[web-servers]
10.1.1.1 ansible_ssh_port=22 ansible_ssh_user=root
10.1.1.2
10.1.1.3
[db]
10.1.1.4
2017/4/23 24
? 每台主机都可以有自定义的配置
? 检查所有机器连通性
? ansible all –m ping
使用 Ansible 安装 Docker
2017/4/23 25
- name: 安装 Docker
shell: curl -sSL https://get.daocloud.io/docker | sh
- name: 确认 user 在 docker 组里
user:
name: user
state: present
groups: docker
append: yes
- name: 安装 Docker Compose
get_url:
url: https://get.daocloud.io/docker/compose/releases/download/1.11.2 ...
dest: /usr/local/bin/docker-compose
mode: 0755
2017/4/23 26
- name: 分发配置
copy:
src: "./config/docker.service"
dest: "/lib/systemd/system/docker.service"
owner: root
group: root
mode: 0644
- name: 重启 Docker 服务
systemd:
name: docker
daemon_reload: yes
state: restarted
- name: 查看版本
command: docker -v
register: i
- debug: var=i.stdout
2017/4/23 27
Ansible and Docker
? Ansible 针对操作系统
? 通过 docker-container 内置模块支持 Docker
? 利用 docker-py pip 模块和 Docker API 通信
? Docker 针对 Container / Image
? 可用 Ansible 安装 Docker 环境
? 可用 Ansible 管理容器生命周期
2017/4/23 28https://nathanleclaire.com/blog/2015/11/10/using-ansible-with-docker-machine-to-bootstrap-host-nodes/
使用 Node.js 开发 Docker 插件?
添加 Docker 对 NFS 的支持,使得容器可以在集群内自由迁移
2017/4/23 29https://docs.docker.com/engine/extend/plugin_api/
2017/4/23 30
NFS Storage
/shared_volumes
docker run --volume-driver nfs –v data:/data –it alpine “echo 1>/data/msg.txt”
/shared_volumes /shared_volumes
/msg.txt /msg.txt /msg.txt
/data /data /data
vm1 vm2 vm3
Docker 插件
? Docker 插件是独立于 Docker Engine 进程的扩展,能够增强 Docker
的功能
? 插件可以运行在容器里也可以运行在容器的外面(插件先启动)
? Docker 通过搜索指定的目录发现插件
? /etc/docker/plugins/nfs.spec
内容就一行 tcp://127.0.0.1:3245
? Docker 插件会在首次使用的时候被激活
2017/4/23 31
Docker Engine 和插件的通信
2017/4/23 32
? 实现这几个 HTTP API
? /Plugin.Activate
? /VolumeDriver.Create
? /VolumeDriver.Remove
? /VolumeDriver.Path
? /VolumeDriver.Mount
? /VolumeDriver.Get
? /VolumeDriver.List
? 具体代码
2017/4/23 33
app.post("/VolumeDriver.Get", (req, res) => {
const mp = path.join("/shared_volumes",sanitize(req.body.Name));
if (fs.existsSync(mp)) {
res.json({
"Volume": {
"Name": req.body.Name,
"Mountpoint": mp,
"Status": {}
}
});
} else {
res.json({
"Err": "Not Exist"
});
}
});
后话
? 测试完 NFS 性能后开源
? 为什么不直接用 mapping 而是用 volume
? 管理功能
? 结合 ZFS 做快照
? 结合云存储做备份
? 跳出舒适区,DevOps 路漫漫,一起学习吧
2017/4/23 34
谢谢
2017/4/23 35

More Related Content

前端转行 DevOps 经验分享

Editor's Notes

  1. 乐 yue 乘 ?阿里智能设计实验室 Logo
  2. 乐 yue 乘 ?阿里智能设计实验室 Logo
  3. 2017互联网人才流动报告
  4. Puppet 和 Saltstack 的最大区别