devops

一:理论部分

1 目的

传统开发方式,开发,运维,测试,三者之间遇到困难如下
开发:
    工作效率;环境不统一;与运维沟通成本
测试:
    周期长;覆盖面不广;质量得不到保障
运维:
    开发运维脱节;升级过程复杂;运维手段落后
devops就是为了解决这些问题提出的思想,同时可以达到如下效果
    降低风险;保证质量;快速交付;组织优化

2 devops

是一套一系列基本原则和方法论,是企业内开发、运维、质量三方面工作的融合,促进三者之间的通过协同,提升产品的开发效率及质量
覆盖企业软件生命周期中的7个过程
**编码-》构建-》测试-》打包-》发布-》配置-》监控**
提倡开发运维高度协同在完成高频部署的同时提高生产环境的可靠性、稳定性、安全性、弹性

image
image
image

二:实战部分

image
简单介绍工具部分每个产品功能

步骤一:准备四台Linux虚拟机

    192.168.9.61    Master集群
    192.168.9.62    Master集群
    192.168.9.63    Master集群
    192.168.9.64    Master集群
    192.168.9.65    Master集群
    192.168.9.66    Slave集群
    192.168.9.67    Slave集群
            .
            .
    192.168.9.n    Slave集群
    这里Master作为mesos-master;slave作为mesos-slave
    zookeeper建议安装在master中

步骤二:安装Zookeeper

    Zookeeper安装:
    mkdir /app
    cp /root/zookeeper-3.4.10.tar.gz /app/
    cd /app/
    tar -zxvf zookeeper-3.4.10.tar.gz
    ln -s zookeeper-3.4.10 zookeeper
    cd zookeeper
    mkdir -p /var/zookeeper/data
    echo "1" > /var/zookeeper/data/myid
zookeeper启动:
    /app/zookeeper/bin/zkServer.sh start
查看状态:
    /app/zookeeper/bin/zkServer.sh status
四字命令:
    echo stat | nc 127.0.0.1 2181

步骤三:安装mesos

安装:
    wget http://www.apache.org/dist/mesos/1.6.1/mesos-1.6.1.tar.gz
    tar -zxf mesos-1.6.1.tar.gz
    -- 针对不同的环境mesos还需要安装前提条件具体查看官网相关介绍
        https://mesos.apache.org/documentation/latest/building/
    
mesos-master启动:
    /app/mesos-1.4.1/build/bin/mesos-master.sh --zk=zk://192.168.9.61:2181,192.168.9.62:2181,192.168.9.63:2181,192.168.9.64:2181,192.168.9.65:2181/mesos --port=5050 --log_dir=/var/log/mesos --cluster=test-cluster --quorum=3 --work_dir=/var/lib/mesos
    启动后就可以在浏览器中输入192.168.8.61:5050看到mesos集群启动成功,名字叫test-cluster,但是这里,其中master中leader的选举是通过Zookeeper来实现的
    但是这里的resource资源没有cpu,gpu等都为0,这是因为还没有启动mesos-slave
mesos-slave启动:
    /app/mesos-1.4.1/build/bin/mesos-agent.sh --master=zk://192.168.9.61:2181,192.168.9.62:2181,192.168.9.63:2181,192.168.9.64:2181,192.168.9.65:2181/mesos --port=5050 --log_dir=/var/log/agent --cluster=test-cluster --quorum=3 --work_dir=/var/lib/agent logging-level=ERROR --containerizers=docker,mesos
    此时就与master联系上了,相关资源就被master管理了

步骤三:安装marthon提供远程调用服务

步骤三:搭建持续集成CICD

在集成中在添加二个节点
192.168.9.68    Gitlab+持续集成
192.168.9.69    Docker-registry
首先在gitlab上传我们的项目,项目包含Dockerfile构建docker文件,
接下来是最重要的CI部分就是我们说的持续集成在提交代码后所做的持续继续测试、部署等后续工作,在gitlab上找到CI按钮开始创建.gitlab-ci.xml
具体的测试、部署(可以通过判断tag标签有无来build  docker同时push 到docker 仓库),这样在提交代码后gitlab就会自动执行测试部署判断是否有tag有的话就build push等操作完成了后续集成操作
Docker-registry仓库安装后为了更好的方便管理可以通过docker-register-web即可
安装成功后打开你指定的ip:port就可以更直观的看到我们的镜像仓库情况
通过marthon调用这个镜像对应的json内容如下x:
{
        "id": "ch5",
        "cmd": "python app.py",
        "cpus": 0.1,
        "mem": 32.0,
        "instances": 10,
        "networks": [ { "mode": "container/bridge" } ],
        "container": {
             "type": "DOCKER",
            "docker": { "image": "192.168.9.69:5000/imooc:v1.0.6" },
            }
            ]
        }
执行好后,就可以在marthonweb页面中看到新的appliciton ch5了,打开可以看到程序运行在node1节点上,打开后就是我们的docker应用跑出来的结果了

image

步骤四:给应用添加监控检测(直接是就是marthon提供的服务在json文件中添加healthCecks节点即可)

通过随时监控该应用的运行情况
出现故障时候可以快速重启,或者切换到其他节点,以保证业务的正常进行
具体实现方式
1.应用正常运行
2.故障检测发现应用异常
3.启动新的应用
4.新应用健康检测通过
5.由新应用提供服务
在marthon的调用apijson文件中再加一条
"healthChecks":[
    {
        "path": "/",    --健康检测的路径,会通过http访问这个目录如果在指定时间返回结果正常则健康检测通过
        "portIndex": 0,
        "protocol": "HTTP",
        "gracePeriodSeconds": 300,  --忽略时间
        "intervalSeconds": 60,  --间隔时间
        "timeoutSeconds": 20,   --超时时间
        "maxConsecutiveFailures": 3,    --最大尝试此时
        "ignoreHttp1xx": False  --无论莫些返回码如这里忽略123,132等等
    }]
通过监控健康需要满足两个条件:
    1.http返回码在200到399之间
    2.在timeoutSenconds时间内收到响应
健康检测标准:
    数据库、中间件、各组件间运行情况,建议每个应用都配置监控检测
    我们可以在自己程序中自己添加健康健康的路由,内部逻辑是数据库检测、中间件检测,
    如果访问这个路由出现问题则健康检测失败有问题

动态扩容

根据单容器的并发值确定扩展数量
动态扩展容器数量
活动资源快速回收
在莫个时间段A应用需求量大,可以为他多创建几个应用,B应用相应的减少

依赖部署操作

在部署时候需要注意A应用是否依赖应用B,再想要部署A则需要先部署B

滚动升级

应用需要在无缝升级可通过marthon来实现
1.删除部分旧版本实例,保留另一部分旧版本实例
2.启动新实例,健康检测通过
3.删除剩下的旧版本实例
具体操作
app={
        "id": "ch5",
        "cmd": "python app.py",
        "cpus": 0.1,
        "mem": 32.0,
        "instances": 10,
        "upgradeStrategy": {
            "maximumOverCapacity": 1,
            "minimumHealthCapacity": 0.5    --用此json会创建10个实例,当这十个应用做升级时会先删一般旧版本启动所有新版本健康检测通过删除剩余旧版本
        },
        "constraints": [["hostname", "GROUP_BY"]],
        "networks": [ { "mode": "container/bridge" } ],
        "container": {
             "type": "DOCKER",
            "docker": { "image": "192.168.9.69:5000/imooc:v1.0.6" },
            "portMappings": [ { "containerPort": 5000, "hostPort": 0 } ]
            },
        "healthChecks":[
            {
                "path": "/",
                "portIndex": 0,
                "protocol": "HTTP",
                "gracePeriodSeconds": 300,
                "intervalSeconds": 60,
                "timeoutSeconds": 20,
                "maxConsecutiveFailures": 3,
                "ignoreHttp1xx": False
            }
        ]
        }

依赖的滚动升级

我们把A应用B应用放在一个group中,再加上滚动升级的参数minimumHealthCapacity
这样再提交升级应用group时候就会根据依赖情况依次升级部署
app={
  "id": "/product",
  "dependencies": [],
  "apps": [
    {
      "id": "/product/db",
      "instances": 10,
      "cpus": 0.1,
      "mem": 32,
      "upgradeStrategy": {
            "maximumOverCapacity": 1,
            "minimumHealthCapacity": 0.6
        },
      "container": {
        "type": "DOCKER",
        "docker": {
          "image": "mongo:3.4",
        },
        "portMappings": [
          {
            "containerPort": 27017,
            "hostPort": 0,
            "protocol": "tcp",
            "servicePort": 10001
          }
        ]
      },
      "healthChecks": [
        {
          "gracePeriodSeconds": 300,
          "intervalSeconds": 60,
          "maxConsecutiveFailures": 0,
          "portIndex": 0,
          "protocol": "TCP",
          "timeoutSeconds": 20,
          "delaySeconds": 15
        }
      ],
      "networks": [
        {
          "mode": "container/bridge"
        }
      ]


},
{
  "id": "/product/service",
  "cmd": "python app.py",
  "cpus": 0.1,
  "mem": 128,
  "instances": 10,
  "dependencies": [
        "/product/db"
    ],
  "upgradeStrategy": {
        "maximumOverCapacity": 1,
        "minimumHealthCapacity": 0.8
    },
  "container": {
    "type": "DOCKER",
    "docker": {

      "image": "192.168.9.69:5000/imooc:v1.0.7",

    },
    "portMappings": [
      {
        "containerPort": 5000,
        "hostPort": 0,
        "labels": {},
        "protocol": "tcp",
        "servicePort": 10002
      }
    ]
  },
  "healthChecks": [
    {
      "gracePeriodSeconds": 300,
      "ignoreHttp1xx": False,
      "intervalSeconds": 60,
      "maxConsecutiveFailures": 3,
      "path": "/",
      "portIndex": 0,
      "protocol": "HTTP",
      "timeoutSeconds": 20,
      "delaySeconds": 15
    }
  ],

  "networks": [
    {
      "mode": "container/bridge"
    }
  ]

}
  ],
  "groups": [],
  "pods": []
}

策略约束

通过策略约束可以控制实例安装的位置更好的控制项目资源
只需要在marthon的json文件中增加
"constraints": [["hostname", "GROUP_BY"]],
如:
"constraints": [["hostname", "LIKE","mesos-node[1-2]"]]   --允许应用安装在mesos-node1或者mesos-node2上
"constraints": [["hostname", "UNLIKE","mesos-node[1-2]"]]  
"constraints": [["hostname", "CLUSTER"]]   --允许应用运行在同一个应用上
"constraints": [["hostname", "UNION"]]   --应用安装在不同的应用上
"constraints": [["hostname", "GROUP_BY"]]  --均匀分布在机架或者数据中心提高可用性

服务注册于发现

1.安装marthon-lb
可以简单快速的实现服务注册与发现
集群中的创建一个实例,在marthon-lb注册

image
就直接通过marthon 的jsonAPI安装docker版的吧
想要应用注册到marthon-lb,就需要先安装marthon-lb,再创建应用时候再json中添加
portMappings指定servicePort10001并同一应用都一样是集群给这个应用的
这样原来应用12312才能访问,现在经过负载均衡10001也可以访问了
负载均衡页面:ip:port/haproxy?stats

集中日志管理

通过ELK来实现日志同一管理

运维搭建

image
image
image

Telegraf介绍

go语言编写的代理程序可收集系统和服务器统计数据并写入InfluxDB,占用内存小
开发人员可以轻松通过插件安装其他需要组件

微服务

之后将项目中能独立出来的组件,应用都独立运行

image

posted @ 2020-02-11 15:54  王吉平  阅读(628)  评论(0编辑  收藏  举报