├── linux ├── 命令 │ └── 命令.md ├── shell │ └── shell.md ├── 文件系统 │ └── 文件系统.dmd └── 内核参数 │ └── kernel_args.md ├── 协议 ├── ip │ └── ip.md ├── tcp │ └── tcp.md └── http │ └── http.md ├── 日志 ├── elk │ ├── es.md │ ├── kibana.md │ └── logstash.md └── kafka │ └── kafka.md ├── 硬件 ├── CPU │ └── CPU.md ├── 内存 │ └── 内存.md └── 磁盘 │ └── 磁盘.md ├── web服务器 └── nginx │ └── nginx.md ├── 应用工具 ├── dubbo │ └── dubbo.md ├── java工具 │ └── java工具.md ├── tomcat │ └── tomcat.md └── springcloud │ └── springcloud.md ├── 数据库 ├── mysql │ └── mysql.md └── redis │ └── redis.md ├── 语言 ├── golang │ └── golang.md └── python │ └── python.md ├── 中间件 ├── zookeeper │ └── zookeeper.md └── keepalived │ └── keepalived.md ├── 批量工具 ├── saltstack │ └── saltstack.md └── ansible │ └── ansible.md ├── 监控 ├── prometheus │ └── prometheus.md ├── grafana │ └── grafana.md └── zabbix │ └── zabbix.md ├── README.md ├── CICD ├── gitlab │ └── gitlab.md └── jenkins │ └── jenkins.md └── 容器 ├── docker └── docker.md └── k8s └── k8s.md /linux/命令/命令.md: -------------------------------------------------------------------------------- 1 | > 命令 -------------------------------------------------------------------------------- /协议/ip/ip.md: -------------------------------------------------------------------------------- 1 | > ip -------------------------------------------------------------------------------- /协议/tcp/tcp.md: -------------------------------------------------------------------------------- 1 | > tcp -------------------------------------------------------------------------------- /日志/elk/es.md: -------------------------------------------------------------------------------- 1 | > es -------------------------------------------------------------------------------- /硬件/CPU/CPU.md: -------------------------------------------------------------------------------- 1 | > CPU -------------------------------------------------------------------------------- /硬件/内存/内存.md: -------------------------------------------------------------------------------- 1 | > 内存 -------------------------------------------------------------------------------- /硬件/磁盘/磁盘.md: -------------------------------------------------------------------------------- 1 | > 磁盘 -------------------------------------------------------------------------------- /协议/http/http.md: -------------------------------------------------------------------------------- 1 | > http -------------------------------------------------------------------------------- /linux/shell/shell.md: -------------------------------------------------------------------------------- 1 | > shell -------------------------------------------------------------------------------- /linux/文件系统/文件系统.dmd: -------------------------------------------------------------------------------- 1 | > 文件系统 -------------------------------------------------------------------------------- /web服务器/nginx/nginx.md: -------------------------------------------------------------------------------- 1 | > nginx -------------------------------------------------------------------------------- /应用工具/dubbo/dubbo.md: -------------------------------------------------------------------------------- 1 | > dubbo -------------------------------------------------------------------------------- /数据库/mysql/mysql.md: -------------------------------------------------------------------------------- 1 | > mysql -------------------------------------------------------------------------------- /数据库/redis/redis.md: -------------------------------------------------------------------------------- 1 | > redis -------------------------------------------------------------------------------- /日志/elk/kibana.md: -------------------------------------------------------------------------------- 1 | > kibana -------------------------------------------------------------------------------- /日志/elk/logstash.md: -------------------------------------------------------------------------------- 1 | > logstash -------------------------------------------------------------------------------- /日志/kafka/kafka.md: -------------------------------------------------------------------------------- 1 | > kafka -------------------------------------------------------------------------------- /语言/golang/golang.md: -------------------------------------------------------------------------------- 1 | > golang -------------------------------------------------------------------------------- /语言/python/python.md: -------------------------------------------------------------------------------- 1 | > python -------------------------------------------------------------------------------- /应用工具/java工具/java工具.md: -------------------------------------------------------------------------------- 1 | > java工具 -------------------------------------------------------------------------------- /应用工具/tomcat/tomcat.md: -------------------------------------------------------------------------------- 1 | > tomcat -------------------------------------------------------------------------------- /linux/内核参数/kernel_args.md: -------------------------------------------------------------------------------- 1 | > kernel args -------------------------------------------------------------------------------- /中间件/zookeeper/zookeeper.md: -------------------------------------------------------------------------------- 1 | > zookeeper -------------------------------------------------------------------------------- /批量工具/saltstack/saltstack.md: -------------------------------------------------------------------------------- 1 | > saltstack -------------------------------------------------------------------------------- /中间件/keepalived/keepalived.md: -------------------------------------------------------------------------------- 1 | > keepalived -------------------------------------------------------------------------------- /应用工具/springcloud/springcloud.md: -------------------------------------------------------------------------------- 1 | > springcloud -------------------------------------------------------------------------------- /监控/prometheus/prometheus.md: -------------------------------------------------------------------------------- 1 | > prometheus 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 7 | * [prometheus](#prometheus) 8 | * [exporter](#exporter) 9 | * [架构](#%E6%9E%B6%E6%9E%84) 10 | * [prometheus server](#prometheus-server) 11 | * [client libraries](#client-libraries) 12 | * [push gateway](#push-gateway) 13 | * [exporter](#exporter-1) 14 | * [alertmanager](#alertmanager) 15 | * [原理](#%E5%8E%9F%E7%90%86) 16 | * [部署](#%E9%83%A8%E7%BD%B2) 17 | * [prometheus](#prometheus-1) 18 | * [部署脚本](#%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC) 19 | * [node\_exporter](#node_exporter) 20 | * [部署脚本](#%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC-1) 21 | * [制作成service](#%E5%88%B6%E4%BD%9C%E6%88%90service) 22 | * [文档](#%E6%96%87%E6%A1%A3) 23 | 24 | # 基本概念 25 | ## prometheus 26 | prometheus是一个监控告警工具。 27 | 28 | ## exporter 29 | 对于不同的监控对象,prometheus通过各种exporter来解决。比如node exporter,提供对磁盘,CPU,内存,网络等资源的监控。 30 | 31 | # 架构 32 | ## prometheus server 33 | 主要的Prometheus服务器,用于存储时间序列数据 34 | 35 | ## client libraries 36 | 用于检测应用程序代码的客户端库 37 | 38 | ## push gateway 39 | 用于支持短期工作的推送网关 40 | 41 | ## exporter 42 | 针对HAProxy,StatsD,Graphite等服务的专用出口商 43 | 44 | ## alertmanager 45 | 一个alertmanager处理警报 46 | 47 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1553145936/ops/architecture.png) 48 | 49 | # 原理 50 | Prometheus直接或通过中间推送网关从仪表工作中删除指标,用于短期工作。它在本地存储所有已删除的样本,并对此数据运行规则,以汇总和记录现有数据的新时间序列或生成警报。Grafana或其他API使用者可用于可视化收集的数据。 51 | 52 | # 部署 53 | ## prometheus 54 | ### 部署脚本 55 | ``` 56 | prometheus_install(){ 57 | INSTALL prometheus 58 | cd $SRC 59 | mkd $BASEDIR/prometheus 60 | tar xf prometheus-2.10.0.linux-amd64.tar.gz --strip 1 -C $BASEDIR/prometheus 61 | $BASEDIR/prometheus/prometheus --version 62 | } 63 | ``` 64 | ``` 65 | vim prometheus.yml 66 | scrape_configs: 67 | - job_name: "node" 68 | scrape_interval: "15s" 69 | static_configs: 70 | ``` 71 | ``` 72 | #启动 73 | nohup ./prometheus > prometheus.log 2>&1 & 74 | #访问 75 | ip:9090 76 | # 77 | ip:9090/consoles/node.html 78 | ``` 79 | 80 | ## node_exporter 81 | ### 部署脚本 82 | ``` 83 | node_exporter_install(){ 84 | INSTALL node_exporter 85 | cd $SRC 86 | mkd $BASEDIR/prometheus/node_exporter 87 | tar xf node_exporter-0.18.1.linux-amd64.tar.gz --strip 1 -C $BASEDIR/prometheus/node_exporter 88 | } 89 | ``` 90 | 91 | ### 制作成service 92 | ``` 93 | vim /etc/systemd/system/node_exporter.service 94 | [Unit] 95 | Description=Node Exporter 96 | 97 | [Service] 98 | User=prometheus 99 | ExecStart=/usr/local/prometheus/node_exporter/node_exporter 100 | 101 | [Install] 102 | WantedBy=default.target 103 | 104 | systemctl daemon-reload 105 | groupadd prometheus 106 | useradd prometheus -g prometheus -s /sbin/nologin -M 107 | chown -R prometheus /usr/local/prometheus 108 | ``` 109 | ``` 110 | #启动 111 | systemctl start node_exporter 112 | #测试 113 | curl ip:9100/metrics 114 | ``` 115 | 116 | # 文档 117 | https://github.com/prometheus 118 | 119 | https://prometheus.io/docs/visualization/grafana/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Table of Contents 2 | ================= 3 | 4 | * [监控](https://github.com/leomei91/devops_notes/tree/master/%E7%9B%91%E6%8E%A7) 5 | * [zabbix](https://github.com/leomei91/devops_notes/tree/master/%E7%9B%91%E6%8E%A7/zabbix) 6 | * [prometheus](https://github.com/leomei91/devops_notes/tree/master/%E7%9B%91%E6%8E%A7/prometheus) 7 | * [grafana](https://github.com/leomei91/devops_notes/tree/master/%E7%9B%91%E6%8E%A7/grafana) 8 | * [CI/CD](https://github.com/leomei91/devops_notes/tree/master/CICD) 9 | * [jenkins](https://github.com/leomei91/devops_notes/tree/master/CICD/jenkins) 10 | * [gitlab](https://github.com/leomei91/devops_notes/tree/master/CICD/gitlab) 11 | * [应用工具](https://github.com/leomei91/devops_notes/tree/master/%E5%BA%94%E7%94%A8%E5%B7%A5%E5%85%B7) 12 | * [java工具](https://github.com/leomei91/devops_notes/tree/master/%E5%BA%94%E7%94%A8%E5%B7%A5%E5%85%B7/java%E5%B7%A5%E5%85%B7) 13 | * [tomcat](https://github.com/leomei91/devops_notes/tree/master/%E5%BA%94%E7%94%A8%E5%B7%A5%E5%85%B7/tomcat) 14 | * [spring cloud](https://github.com/leomei91/devops_notes/tree/master/%E5%BA%94%E7%94%A8%E5%B7%A5%E5%85%B7/springcloud) 15 | * [dubbo](https://github.com/leomei91/devops_notes/tree/master/%E5%BA%94%E7%94%A8%E5%B7%A5%E5%85%B7/dubbo) 16 | * [容器](https://github.com/leomei91/devops_notes/tree/master/%E5%AE%B9%E5%99%A8) 17 | * [docker](https://github.com/leomei91/devops_notes/tree/master/%E5%AE%B9%E5%99%A8/docker) 18 | * [k8s](https://github.com/leomei91/devops_notes/tree/master/%E5%AE%B9%E5%99%A8/k8s) 19 | * [语言](https://github.com/leomei91/devops_notes/tree/master/语言) 20 | * [golang](https://github.com/leomei91/devops_notes/tree/master/%E8%AF%AD%E8%A8%80/golang) 21 | * [python](https://github.com/leomei91/devops_notes/tree/master/%E8%AF%AD%E8%A8%80/python) 22 | * [linux](https://github.com/leomei91/devops_notes/tree/master/linux) 23 | * [shell](https://github.com/leomei91/devops_notes/tree/master/linux/shell) 24 | * [命令](https://github.com/leomei91/devops_notes/tree/master/linux/%E5%91%BD%E4%BB%A4) 25 | * [内核参数](https://github.com/leomei91/devops_notes/tree/master/linux/%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0) 26 | * [内核机制](#%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6) 27 | * [文件系统](https://github.com/leomei91/devops_notes/tree/master/linux/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F) 28 | * [协议](https://github.com/leomei91/devops_notes/tree/master/%E5%8D%8F%E8%AE%AE) 29 | * [http](https://github.com/leomei91/devops_notes/tree/master/%E5%8D%8F%E8%AE%AE/http) 30 | * [tcp](https://github.com/leomei91/devops_notes/tree/master/%E5%8D%8F%E8%AE%AE/tcp) 31 | * [ip](https://github.com/leomei91/devops_notes/tree/master/%E5%8D%8F%E8%AE%AE/ip) 32 | * [硬件](https://github.com/leomei91/devops_notes/tree/master/%E7%A1%AC%E4%BB%B6) 33 | * [CPU](https://github.com/leomei91/devops_notes/tree/master/%E7%A1%AC%E4%BB%B6/CPU) 34 | * [内存](https://github.com/leomei91/devops_notes/tree/master/%E7%A1%AC%E4%BB%B6/%E5%86%85%E5%AD%98) 35 | * [磁盘](https://github.com/leomei91/devops_notes/tree/master/%E7%A1%AC%E4%BB%B6/%E7%A3%81%E7%9B%98) 36 | * [日志](https://github.com/leomei91/devops_notes/tree/master/%E6%97%A5%E5%BF%97) 37 | * [elk](https://github.com/leomei91/devops_notes/tree/master/%E6%97%A5%E5%BF%97/elk) 38 | * [kafka](https://github.com/leomei91/devops_notes/tree/master/%E6%97%A5%E5%BF%97/kafka) 39 | * [web服务器](https://github.com/leomei91/devops_notes/tree/master/web%E6%9C%8D%E5%8A%A1%E5%99%A8) 40 | * [nginx](https://github.com/leomei91/devops_notes/tree/master/web%E6%9C%8D%E5%8A%A1%E5%99%A8/nginx) 41 | * [数据库](https://github.com/leomei91/devops_notes/tree/master/%E6%95%B0%E6%8D%AE%E5%BA%93) 42 | * [mysql](https://github.com/leomei91/devops_notes/tree/master/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql) 43 | * [redis](https://github.com/leomei91/devops_notes/tree/master/%E6%95%B0%E6%8D%AE%E5%BA%93/redis) 44 | * [批量工具](https://github.com/leomei91/devops_notes/tree/master/%E6%89%B9%E9%87%8F%E5%B7%A5%E5%85%B7) 45 | * [ansible](https://github.com/leomei91/devops_notes/tree/master/%E6%89%B9%E9%87%8F%E5%B7%A5%E5%85%B7/ansible) 46 | * [saltstack](https://github.com/leomei91/devops_notes/tree/master/%E6%89%B9%E9%87%8F%E5%B7%A5%E5%85%B7/saltstack) 47 | * [中间件](https://github.com/leomei91/devops_notes/tree/master/%E4%B8%AD%E9%97%B4%E4%BB%B6) 48 | * [keepalived](https://github.com/leomei91/devops_notes/tree/master/%E4%B8%AD%E9%97%B4%E4%BB%B6/keepalived) 49 | * [zookeeper](https://github.com/leomei91/devops_notes/tree/master/%E4%B8%AD%E9%97%B4%E4%BB%B6/zookeeper) -------------------------------------------------------------------------------- /CICD/gitlab/gitlab.md: -------------------------------------------------------------------------------- 1 | > gitlab 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 7 | * [gitlab](#gitlab) 8 | * [配置免密钥](#%E9%85%8D%E7%BD%AE%E5%85%8D%E5%AF%86%E9%92%A5) 9 | * [环境说明](#%E7%8E%AF%E5%A2%83%E8%AF%B4%E6%98%8E) 10 | * [1\.初始化git仓库](#1%E5%88%9D%E5%A7%8B%E5%8C%96git%E4%BB%93%E5%BA%93) 11 | * [2\.生成密钥对](#2%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E5%AF%B9) 12 | * [3\.创建一个gitlab项目](#3%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAgitlab%E9%A1%B9%E7%9B%AE) 13 | * [4\.复制密钥到gitlab](#4%E5%A4%8D%E5%88%B6%E5%AF%86%E9%92%A5%E5%88%B0gitlab) 14 | * [5\.推送本地仓库到gitlab](#5%E6%8E%A8%E9%80%81%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93%E5%88%B0gitlab) 15 | * [jenkins的使用](#jenkins%E7%9A%84%E4%BD%BF%E7%94%A8) 16 | * [安装插件](#%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6) 17 | * [配置](#%E9%85%8D%E7%BD%AE) 18 | * [ssh原理](#ssh%E5%8E%9F%E7%90%86) 19 | * [webhook](#webhook) 20 | * [1\.开启webhook](#1%E5%BC%80%E5%90%AFwebhook) 21 | * [2\.gitlab配置](#2gitlab%E9%85%8D%E7%BD%AE) 22 | * [3\.jenkins配置](#3jenkins%E9%85%8D%E7%BD%AE) 23 | * [全局安全配置](#%E5%85%A8%E5%B1%80%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE) 24 | * [job中配置](#job%E4%B8%AD%E9%85%8D%E7%BD%AE) 25 | * [git基本使用](#git%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8) 26 | * [查看远程分支](#%E6%9F%A5%E7%9C%8B%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF) 27 | * [推送本地分支master到远程分支dev](#%E6%8E%A8%E9%80%81%E6%9C%AC%E5%9C%B0%E5%88%86%E6%94%AFmaster%E5%88%B0%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AFdev) 28 | * [其他](#%E5%85%B6%E4%BB%96) 29 | * [修改gitlab域名](#%E4%BF%AE%E6%94%B9gitlab%E5%9F%9F%E5%90%8D) 30 | 31 | # 基本概念 32 | ## gitlab 33 | gitlab是一个流行的代码仓库。 34 | 35 | # 配置免密钥 36 | ## 环境说明 37 | ``` 38 | jenkins节点 node01 39 | 本地仓库 node02 40 | gitlab节点 master 41 | ``` 42 | 43 | ## 1.初始化git仓库 44 | node02上执行: 45 | ``` 46 | mkdir -p /apps/test/git-demo 47 | cd /apps/test/git-demo 48 | git init 49 | git config --global user.name node02 50 | git config --global user.email 51 | node02@node02.com 52 | cat >> README.md << EOF 53 | # a git demo node02 54 | - #01 55 | EOF 56 | git add . 57 | git commit -m "#01" 58 | ``` 59 | 60 | ## 2.生成密钥对 61 | node02上执行: 62 | ``` 63 | ssh-keygen -t rsa -C "node02" 64 | ``` 65 | 66 | ## 3.创建一个gitlab项目 67 | 在web端创建用户 `ky` ,然后创建一个项目 `node02` 68 | 69 | ## 4.复制密钥到gitlab 70 | 在web端操作,`ky` 用户登录,Settings -> SSH Keys,复制node02的公钥到gitlab 71 | 72 | ## 5.推送本地仓库到gitlab 73 | node02节点,在/etc/hosts添加gitlab服务器的域名解析: 74 | ``` 75 | vim /etc/hosts 76 | gitlab_ip git.leo.com 77 | ``` 78 | 79 | 推送 80 | ``` 81 | git remote add ssh-origin ssh://git@git.leo.com:2222/ky/node02.git 82 | git push -u ssh-origin master 83 | # 第一次加上 -u 选项,后面可以不加 84 | ``` 85 | 如果node02第一次和gitlab服务器建立ssh连接,会要求确认,输入 `yes` 即可。 86 | 87 | # jenkins的使用 88 | ## 安装插件 89 | ``` 90 | Gitlab 91 | ``` 92 | 93 | ## 配置 94 | web端,凭据 -> 全局凭据 -> 添加凭据 -> 95 | 96 | `SSH Username with private key` 97 | 98 | `Username` 随便填 99 | 100 | `Private Key` **填写jenkins的私钥** 101 | 102 | 将jenkins的公钥添加到gitlab 103 | 104 | 这里需要说明的是,其实只要任意节点的公钥添加到了gitlab,`Private Key` 就可以填写该节点的私钥。但是推荐只填写 `jenkins` 的私钥。 105 | 106 | # ssh原理 107 | 比如A节点 ssh无密码 B节点 108 | 109 | 1.将A的公钥复制到B的 `authorized_keys` 110 | 111 | 2.A会在自己的 `known_hosts` 中添加B节点的记录 112 | 113 | 注意:第一次A连接B会要求确认,确认之后A会在自己的 `known_hosts` 中添加B节点的记录。 114 | 115 | # webhook 116 | ## 1.开启webhook 117 | 管理员登录web -> Admin Area -> Settings -> Network -> Outbound requests -> Allow requests to the local network from hooks and services打钩 118 | 119 | ## 2.gitlab配置 120 | 普通用户登录 -> 项目 -> Settings -> Integrations 121 | 122 | URL: 123 | ``` 124 | jenkins_url/job/job_name/build?token=xxx 125 | ``` 126 | token是在job中随便填写的。 127 | 128 | 提示:`test` -> `Push events` 可以测试webhook是否生效。 129 | 130 | ## 3.jenkins配置 131 | ### 全局安全配置 132 | cors关闭 133 | 134 | 允许匿名用户访问 135 | 136 | 137 | ### job中配置 138 | `Trigger builds remotely` -> token随便写 139 | 140 | pipeline代码: 141 | ``` 142 | node { 143 | stage('git clone'){ 144 | echo 'begin to git pull...' 145 | checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'aa508664-9cee-44ac-8fdf-a6587ce48eab', url: 'ssh://git@git.leo.com:2222/ky/node02.git']]]) 146 | } 147 | } 148 | ``` 149 | 150 | 之后,在本地仓库每次 `push` 代码,都会自动触发jenkins中代码的构建。 151 | 152 | # git基本使用 153 | ## 查看远程分支 154 | ``` 155 | git branch -r 156 | ``` 157 | 158 | ## 推送本地分支master到远程分支dev 159 | ``` 160 | git push ssh-origin master:dev 161 | ``` 162 | 163 | # 其他 164 | ## 修改gitlab域名 165 | ``` 166 | vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml 167 | production: &base 168 | # 169 | # 1. GitLab app settings 170 | # ========================== 171 | 172 | ## GitLab settings 173 | gitlab: 174 | ## Web server settings (note: host is the FQDN, do not include http://) 175 | host: test.gitlab.com 176 | port: 80 177 | https: false 178 | ``` 179 | 重启 180 | ``` 181 | gitlab-ctl restart 182 | ``` -------------------------------------------------------------------------------- /容器/docker/docker.md: -------------------------------------------------------------------------------- 1 | > docker 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [历史背景](#%E5%8E%86%E5%8F%B2%E8%83%8C%E6%99%AF) 7 | * [概念](#%E6%A6%82%E5%BF%B5) 8 | * [OCI](#oci) 9 | * [OCF](#ocf) 10 | * [docker镜像](#docker%E9%95%9C%E5%83%8F) 11 | * [docker引擎](#docker%E5%BC%95%E6%93%8E) 12 | * [存储驱动](#%E5%AD%98%E5%82%A8%E9%A9%B1%E5%8A%A8) 13 | * [docker插件](#docker%E6%8F%92%E4%BB%B6) 14 | * [架构](#%E6%9E%B6%E6%9E%84) 15 | * [docker client](#docker-client) 16 | * [docker host](#docker-host) 17 | * [docker image registry](#docker-image-registry) 18 | * [docker网络](#docker%E7%BD%91%E7%BB%9C) 19 | * [部署](#%E9%83%A8%E7%BD%B2) 20 | * [使用](#%E4%BD%BF%E7%94%A8) 21 | * [限制内存资源](#%E9%99%90%E5%88%B6%E5%86%85%E5%AD%98%E8%B5%84%E6%BA%90) 22 | * [限制CPU资源](#%E9%99%90%E5%88%B6cpu%E8%B5%84%E6%BA%90) 23 | * [限制IO资源](#%E9%99%90%E5%88%B6io%E8%B5%84%E6%BA%90) 24 | * [限制 bps 和 iops](#%E9%99%90%E5%88%B6-bps-%E5%92%8C-iops) 25 | * [命令行](#%E5%91%BD%E4%BB%A4%E8%A1%8C) 26 | * [查看docker当前状态](#%E6%9F%A5%E7%9C%8Bdocker%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81) 27 | * [查看docker版本信息](#%E6%9F%A5%E7%9C%8Bdocker%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF) 28 | * [拉取镜像](#%E6%8B%89%E5%8F%96%E9%95%9C%E5%83%8F) 29 | * [删除镜像](#%E5%88%A0%E9%99%A4%E9%95%9C%E5%83%8F) 30 | * [删除容器](#%E5%88%A0%E9%99%A4%E5%AE%B9%E5%99%A8) 31 | * [查看镜像列表](#%E6%9F%A5%E7%9C%8B%E9%95%9C%E5%83%8F%E5%88%97%E8%A1%A8) 32 | * [创建并启动容器](#%E5%88%9B%E5%BB%BA%E5%B9%B6%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8) 33 | * [查看容器详细信息](#%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF) 34 | * [查看容器列表](#%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8%E5%88%97%E8%A1%A8) 35 | * [在外部执行容器内命令](#%E5%9C%A8%E5%A4%96%E9%83%A8%E6%89%A7%E8%A1%8C%E5%AE%B9%E5%99%A8%E5%86%85%E5%91%BD%E4%BB%A4) 36 | * [一张图搞定docker命令](#%E4%B8%80%E5%BC%A0%E5%9B%BE%E6%90%9E%E5%AE%9Adocker%E5%91%BD%E4%BB%A4) 37 | * [文档](#%E6%96%87%E6%A1%A3) 38 | 39 | # 历史背景 40 | Linux为了实现资源隔离,搞出了namespace和cgroup。 41 | 42 | 基于namespace和cgroup,又诞生了LXC,这个是早期的容器。 43 | 44 | LXC使用起来还是太繁琐,功能过于简单,于是docker横空出世,极大降低了容器的使用门槛,功能上更加强大,火遍全球。 45 | 46 | 此时,谷歌按捺不住了!因为类似docker容器的技术,在谷歌内部,其实使用了十几年! 47 | 48 | 谷歌想阻住docker的风头,奈何容器大势已定。于是,谷歌开始在其他方面发力,这就是容器编排领域。 49 | 50 | docker容器如果没有很好的编排工具支持,无法大规模使用,发展会严重受阻。 51 | 52 | 于是,各类编排工具应时而生,比较流行的有: 53 | 54 | swarm+compose 55 | 56 | mesos+marathon 57 | 58 | k8s 59 | 60 | 而站在谷歌borg系统肩上的k8s,可以说一出世便势如破竹,如今几乎称霸了容器编排领域。 61 | 62 | 谷歌还牵头搞出了一个CNCF组织,云原生得以茁壮成长。 63 | 64 | 这就是容器的历史背景。 65 | 66 | (docker是商业版本,社区版改名成了moby,万恶的资本主义啊!) 67 | 68 | # 概念 69 | ## OCI 70 | 由Linux基金会于2015年创立。 71 | 72 | 旨在围绕容器格式和容器运行时制定一个开放的工业标准。 73 | 74 | ## OCF 75 | 开发容器格式。RunC容器引擎就是基于OCF格式的一个具体实现。 76 | 77 | ## docker镜像 78 | 镜像和容器的关系,好比程序和进程的关系。 79 | 80 | 镜像是分层的,顶层是可写的,叫做容器层。其余是只读层。 81 | 82 | docker使用的是系统的内核。镜像中不包含内核。 83 | 84 | docker镜像是联合挂载的。 85 | 86 | ## docker引擎 87 | docker引擎由最初的LXC,到后来的libcontainer,到现在的runContainer,发展也逐渐成熟。 88 | 89 | ## 存储驱动 90 | docker存储驱动使用的是overlay2。 91 | 92 | ## docker插件 93 | docker是插件式的,像存储卷,网络和日志组件都是插件式部署的。 94 | 95 | # 架构 96 | docker由客户端,服务器和镜像仓库构成。 97 | 98 | ## docker client 99 | docker客户端。比如docker命令工具,各种SDK。 100 | 101 | ## docker host 102 | docker host包含docker daemon,containers和images三个部分。 103 | 104 | ## docker image registry 105 | docker的镜像仓库 106 | 107 | ## docker网络 108 | https://www.cnblogs.com/CloudMan6/p/7066851.html 109 | 110 | # 部署 111 | ``` 112 | yum install docker-ce -y > /dev/null 113 | 114 | # 启用daocloud加速 115 | curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://9f1c3784.m.daocloud.io > /dev/null 116 | 117 | # 修改配置文件 118 | cp /etc/docker/daemon.json{,.bak} 119 | `sed -i s/,}/}/g /etc/docker/daemon.json` 120 | 121 | # 启动 122 | systemctl restart docker 123 | 124 | docker version 125 | 126 | echo "docker is installed." 127 | ``` 128 | 129 | # 使用 130 | ## 限制内存资源 131 | ``` 132 | -m xxxM 133 | --memory xxxM 134 | ``` 135 | 136 | 限制内存+swap资源 137 | ``` 138 | --memory-swap xxxM 139 | ``` 140 | 注意是内存和swap的总量。 141 | 142 | 如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍。 143 | 144 | ## 限制CPU资源 145 | Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。 146 | ``` 147 | -c 1024 148 | -c 512 149 | ``` 150 | 需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。 151 | 152 | ## 限制IO资源 153 | 默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。 154 | 155 | --blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。 156 | 157 | ### 限制 bps 和 iops 158 | bps 是 byte per second,每秒读写的数据量。 159 | 160 | iops 是 io per second,每秒 IO 的次数。 161 | 162 | 可通过以下参数控制容器的 bps 和 iops: 163 | ``` 164 | --device-read-bps,限制读某个设备的 bps。 165 | --device-write-bps,限制写某个设备的 bps。 166 | --device-read-iops,限制读某个设备的 iops。 167 | --device-write-iops,限制写某个设备的 iops。 168 | ``` 169 | 170 | 下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s 171 | ``` 172 | docker run -it --device-write-bps /dev/sda:30MB ubuntu 173 | ``` 174 | 175 | # 命令行 176 | ## 查看docker当前状态 177 | ``` 178 | docker info 179 | ``` 180 | 181 | ## 查看docker版本信息 182 | ``` 183 | docker version 184 | ``` 185 | 186 | ## 拉取镜像 187 | ``` 188 | docker [image] pull 189 | ``` 190 | 191 | ## 删除镜像 192 | ``` 193 | docker rmi image_id 194 | ``` 195 | 196 | ## 删除容器 197 | ``` 198 | docker rm container_id 199 | ``` 200 | 201 | ## 查看镜像列表 202 | ``` 203 | docker image ls 204 | ``` 205 | 206 | ## 创建并启动容器 207 | ``` 208 | docker run [option] image 209 | ``` 210 | 211 | ## 查看容器详细信息 212 | ``` 213 | docker inspect contanier_name 214 | ``` 215 | 216 | ## 查看容器列表 217 | ``` 218 | docker ps -a 219 | ``` 220 | 221 | ## 在外部执行容器内命令 222 | ``` 223 | docker exec [option] container_name cmd 224 | ``` 225 | 226 | ## 一张图搞定docker命令 227 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1557556679/k8s/upload-ueditor-image-20170608-1496889671778038814.png) 228 | 229 | # 文档 230 | https://www.cnblogs.com/CloudMan6/tag/%E5%AE%B9%E5%99%A8/default.html?page=8 231 | -------------------------------------------------------------------------------- /监控/grafana/grafana.md: -------------------------------------------------------------------------------- 1 | > grafana 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 7 | * [Data Source](#data-source) 8 | * [Organization](#organization) 9 | * [User](#user) 10 | * [Row](#row) 11 | * [Panel](#panel) 12 | * [Query Editor](#query-editor) 13 | * [Dashboard](#dashboard) 14 | * [部署](#%E9%83%A8%E7%BD%B2) 15 | * [部署脚本](#%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC) 16 | * [制作成service](#%E5%88%B6%E4%BD%9C%E6%88%90service) 17 | * [使用](#%E4%BD%BF%E7%94%A8) 18 | * [grafana和prometheus的组合](#grafana%E5%92%8Cprometheus%E7%9A%84%E7%BB%84%E5%90%88) 19 | * [导入第三方模板](#%E5%AF%BC%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9%E6%A8%A1%E6%9D%BF) 20 | * [grafana配置邮件功能](#grafana%E9%85%8D%E7%BD%AE%E9%82%AE%E4%BB%B6%E5%8A%9F%E8%83%BD) 21 | * [安装插件](#%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6) 22 | * [文档](#%E6%96%87%E6%A1%A3) 23 | 24 | # 基本概念 25 | ## Data Source 26 | Grafana为您的时间序列数据(数据源)支持许多不同的存储后端。每个数据源都有一个特定的查询编辑器,该编辑器针对特定数据源公开的特性和功能进行了自定义。 27 | 28 | 官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch。 29 | 30 | 每个数据源的查询语言和功能显然非常不同。您可以将来自多个数据源的数据组合到单个仪表板上,但每个Panel都绑定到属于特定组织的特定数据源。 31 | 32 | ## Organization 33 | Grafana支持多个组织,以支持各种部署模型,包括使用单个Grafana实例为多个可能不受信任的组织提供服务。 34 | 35 | 在许多情况下,Grafana将部署在一个组织中。 36 | 37 | 每个组织可以拥有一个或多个数据源。 38 | 39 | 所有仪表板都归特定组织所有。 40 | 41 | ## User 42 | 用户是Grafana中的指定帐户。用户可以属于一个或多个组织,可以通过角色为其分配不同级别的权限。 43 | 44 | Grafana支持各种内部和外部方式,供用户进行身份验证。这些包括来自其自己的集成数据库,来自外部SQL服务器或来自外部LDAP服务器。 45 | 46 | ## Row 47 | A Row是仪表板中的逻辑分隔符,用于将Panel组合在一起 48 | 49 | ## Panel 50 | 该小组是Grafana的基本可视化构建块。每个Panel提供一个查询编辑器(取决于面板中选择的数据源),允许您使用查询编辑器提取要在Panel上显示的完美可视化 51 | 52 | 每个面板都有各种各样的样式和格式选项,可以让您创建完美的图片。 53 | 54 | 可以在仪表板上拖放面板并重新排列面板。它们也可以调整大小。 55 | 56 | 目前有五种Panel类型:Graph,Singlestat,Dashlist,Table和Text。 57 | 58 | ## Query Editor 59 | 查询编辑器公开数据源的功能,并允许您查询它包含的指标。 60 | 61 | 使用查询编辑器在时间序列数据库中构建一个或多个查询(对于一个或多个系列)。该面板将立即更新,允许您实时有效地探索您的数据,并为该特定面板构建一个完美的查询。 62 | 63 | 您可以在查询编辑器中使用查询编辑器中的模板变量。这提供了一种基于仪表板上选择的模板变量动态探索数据的强大方法。 64 | 65 | Grafana允许您通过查询编辑器中的行来引用查询。如果向图表添加第二个查询,则只需键入#A即可引用第一个查询。这提供了一种简单方便的方法来构建复合查询。 66 | 67 | ## Dashboard 68 | 仪表板是它们汇集在一起​​的地方。仪表板可以被认为是一组一个或多个面板组织并排列成一个或多个行。 69 | 70 | 仪表板的时间段可以通过仪表板右上角的仪表板时间选择器进行控制。 71 | 72 | 仪表板可以利用模板化使其更具动态性和交互性。 73 | 74 | 仪表板可以利用Annotations在Panel中显示事件数据。这有助于将Panel中的时间序列数据与其他事件相关联。 75 | 76 | 可以通过各种方式轻松共享仪表板(或特定面板)。您可以向登录Grafana的人发送链接。您可以使用快照功能将当前正在查看的所有数据编码为静态和交互式JSON文档; 它比通过电子邮件截图更好! 77 | 78 | 可以标记仪表板,仪表板选择器提供对特定组织中所有仪表板的快速,可搜索的访问。 79 | 80 | 81 | # 部署 82 | ## 部署脚本 83 | ``` 84 | grafana_install(){ 85 | INSTALL grafana 86 | cd $SRC 87 | mkd $BASEDIR/grafana 88 | tar xf grafana-6.2.2.linux-amd64.tar.gz --strip 1 -C $BASEDIR/grafana 89 | } 90 | ``` 91 | 92 | ## 制作成service 93 | ``` 94 | vim /etc/sysconfig/grafana-server 95 | GRAFANA_USER=grafana 96 | 97 | GRAFANA_GROUP=grafana 98 | 99 | GRAFANA_HOME=/usr/local/grafana 100 | 101 | LOG_DIR=/usr/local/grafana/data/log 102 | 103 | DATA_DIR=/usr/local/grafana/data 104 | 105 | MAX_OPEN_FILES=10000 106 | 107 | CONF_DIR=/usr/local/grafana/conf 108 | 109 | CONF_FILE=/usr/local/grafana/conf/defaults.ini 110 | 111 | RESTART_ON_UPGRADE=true 112 | 113 | PLUGINS_DIR=/usr/local/grafana/data/plugins 114 | 115 | PROVISIONING_CFG_DIR=/usr/local/grafana/conf/provisioning 116 | 117 | # Only used on systemd systems 118 | PID_FILE_DIR=/usr/local/grafana 119 | ``` 120 | ``` 121 | vim /usr/lib/systemd/system/grafana-server.service 122 | [Unit] 123 | Description=Grafana instance 124 | Documentation=http://docs.grafana.org 125 | Wants=network-online.target 126 | After=network-online.target 127 | After=postgresql.service mariadb.service mysql.service 128 | 129 | [Service] 130 | EnvironmentFile=/etc/sysconfig/grafana-server 131 | User=grafana 132 | Group=grafana 133 | Type=notify 134 | Restart=on-failure 135 | WorkingDirectory=/usr/local/grafana 136 | RuntimeDirectory=grafana 137 | RuntimeDirectoryMode=0750 138 | ExecStart=/usr/local/grafana/bin/grafana-server \ 139 | --config=${CONF_FILE} \ 140 | --pidfile=${PID_FILE_DIR}/grafana-server.pid \ 141 | cfg:default.paths.logs=${LOG_DIR} \ 142 | cfg:default.paths.data=${DATA_DIR} \ 143 | cfg:default.paths.plugins=${PLUGINS_DIR} \ 144 | cfg:default.paths.provisioning=${PROVISIONING_CFG_DIR} 145 | 146 | LimitNOFILE=10000 147 | TimeoutStopSec=20 148 | 149 | [Install] 150 | WantedBy=multi-user.target 151 | 152 | systemctl daemon-reload 153 | ``` 154 | ``` 155 | vim conf/defaults.ini 156 | socket = /usr/local/grafana/grafana.sock 157 | 158 | mkdir -p data/{log,plugins} 159 | groupadd grafana 160 | useradd grafana -g grafana -s /sbin/nologin -M 161 | chown -R grafana /usr/local/grafana/ 162 | #启动 163 | systemctl start grafana-server 164 | ``` 165 | ``` 166 | #访问web 167 | ip:3000 168 | ``` 169 | 默认账号 170 | ``` 171 | admin/admin 172 | ``` 173 | 第一次登陆需要自己修改密码 174 | 175 | # 使用 176 | ## grafana和prometheus的组合 177 | https://prometheus.io/docs/visualization/grafana/#installing 178 | 179 | ### 导入第三方模板 180 | 自己动手写模板太费时了!这个时候就可以使用模板导入功能! 181 | 182 | https://grafana.com/docs/reference/export_import/ 183 | 184 | ## grafana配置邮件功能 185 | ``` 186 | grafana.ini 187 | [smtp] 188 | enabled = true 189 | host = smtp.163.com:465 190 | user = 邮箱前缀@163.com 191 | # If the password contains # or ; you have to wrap it with trippel quotes. Ex """#password;""" 192 | password = 客户端授权密码 193 | skip_verify = true 194 | from_address = 邮箱前缀@163.com 195 | from_name = Grafana 196 | ``` 197 | ## 安装插件 198 | ``` 199 | bin/grafana-cli --pluginsDir data/plugins/ plugins install alexanderzobnin-zabbix-app 200 | systemctl restart grafana 201 | ``` 202 | 203 | 204 | # 文档 205 | https://grafana.com/docs/installation/configuration/ -------------------------------------------------------------------------------- /批量工具/ansible/ansible.md: -------------------------------------------------------------------------------- 1 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 2 | * [说明](#%E8%AF%B4%E6%98%8E) 3 | * [工作模式](#%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F) 4 | * [ansible的幂等性](#ansible%E7%9A%84%E5%B9%82%E7%AD%89%E6%80%A7) 5 | * [ansible role](#ansible-role) 6 | * [ansible tower](#ansible-tower) 7 | * [ansible galaxy](#ansible-galaxy) 8 | * [ansible的模板引擎](#ansible%E7%9A%84%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E) 9 | * [原理](#%E5%8E%9F%E7%90%86) 10 | * [ansible执行过程](#ansible%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B) 11 | * [部署](#%E9%83%A8%E7%BD%B2) 12 | * [环境说明](#%E7%8E%AF%E5%A2%83%E8%AF%B4%E6%98%8E) 13 | * [安装](#%E5%AE%89%E8%A3%85) 14 | * [推荐配置](#%E6%8E%A8%E8%8D%90%E9%85%8D%E7%BD%AE) 15 | * [使用](#%E4%BD%BF%E7%94%A8) 16 | * [yes和True](#yes%E5%92%8Ctrue) 17 | * [常见模块](#%E5%B8%B8%E8%A7%81%E6%A8%A1%E5%9D%97) 18 | * [shell](#shell) 19 | * [script](#script) 20 | * [setup](#setup) 21 | * [playbook](#playbook) 22 | * [目录结构](#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84) 23 | * [执行方式](#%E6%89%A7%E8%A1%8C%E6%96%B9%E5%BC%8F) 24 | * [增加并行能力](#%E5%A2%9E%E5%8A%A0%E5%B9%B6%E8%A1%8C%E8%83%BD%E5%8A%9B) 25 | * [输出分析](#%E8%BE%93%E5%87%BA%E5%88%86%E6%9E%90) 26 | * [注意事项](#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9) 27 | * [1\.ansible命令行不要使用命令的别名,可能无法识别](#1ansible%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E7%9A%84%E5%88%AB%E5%90%8D%E5%8F%AF%E8%83%BD%E6%97%A0%E6%B3%95%E8%AF%86%E5%88%AB) 28 | * [文档](#%E6%96%87%E6%A1%A3) 29 | * [例子](#%E4%BE%8B%E5%AD%90) 30 | * [复制文件](#%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6) 31 | * [下载文件](#%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6) 32 | * [yum安装](#yum%E5%AE%89%E8%A3%85) 33 | * [重启服务](#%E9%87%8D%E5%90%AF%E6%9C%8D%E5%8A%A1) 34 | * [查看主机组下所有主机](#%E6%9F%A5%E7%9C%8B%E4%B8%BB%E6%9C%BA%E7%BB%84%E4%B8%8B%E6%89%80%E6%9C%89%E4%B8%BB%E6%9C%BA) 35 | * [同时执行多个主机组](#%E5%90%8C%E6%97%B6%E6%89%A7%E8%A1%8C%E5%A4%9A%E4%B8%AA%E4%B8%BB%E6%9C%BA%E7%BB%84) 36 | * [ansible基于role部署apache](#ansible%E5%9F%BA%E4%BA%8Erole%E9%83%A8%E7%BD%B2apache) 37 | * [准备工作](#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C) 38 | * [目录结构](#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84-1) 39 | * [执行](#%E6%89%A7%E8%A1%8C) 40 | * [验证](#%E9%AA%8C%E8%AF%81) 41 | 42 | # 基本概念 43 | ## 说明 44 | 1.对于每一个任务,ansible在每个主机之间是并行执行的 45 | 46 | 2.在开始执行下一个任务之前,ansible会等待当前任务在所有主机上执行完成 47 | 48 | 3.ansible是按照顺序来执行任务的 49 | 50 | ## 工作模式 51 | ansible是采取主动推送的工作模式,可以立即执行任务;ansible也支持被动拉取模式(ansible-pull)。 52 | 53 | ## ansible的幂等性 54 | ansible的模块是幂等的,如果用户不存在则创建,创建则不做操作。 55 | 56 | 同一台主机上的同一个任务,只会执行一次。 57 | 58 | ## ansible role 59 | role用来实现更为复杂的任务,可以在不同系统中使用,可以复用。 60 | 61 | ## ansible tower 62 | ansible的web管理后台。 63 | 64 | ## ansible galaxy 65 | 一个role的在线仓库。 66 | 67 | ## ansible的模板引擎 68 | ansible 采用jinjia2作为模板引擎。 69 | 70 | # 原理 71 | ## ansible执行过程 72 | 1.加载配置文件/etc/ansible/ansible.cfg 73 | 74 | 2.加载模块文件 75 | 76 | 3.通过ansible将模块和命令生成为py文件,将文件传输至目标主机的$HOME/.ansible/tmp目录下 77 | 78 | 4.指定py文件 79 | 80 | 5.删除py文件,退出 81 | 82 | # 部署 83 | ## 环境说明 84 | ``` 85 | centos7 86 | ``` 87 | 88 | ## 安装 89 | 控制节点安装ansible 90 | ``` 91 | yum install ansible -y 92 | ``` 93 | 94 | 配置 95 | ``` 96 | vim /etc/ansible/hosts 97 | [nodes] 98 | node01 99 | node02 100 | node03 101 | ``` 102 | 103 | 免密钥 104 | ``` 105 | # 控制节点 node01 也可以用 ansible 管理 106 | ssh-copy-id root@node01 107 | ssh-copy-id root@node02 108 | ssh-copy-id root@node03 109 | ``` 110 | 111 | ## 推荐配置 112 | ``` 113 | vim /etc/ansible/ansible.cfg 114 | ... 115 | #不检查known_hosts文件 116 | host_key_checking = False 117 | #开启日志 118 | log_path = /var/log/ansible.log 119 | ... 120 | ``` 121 | 122 | # 使用 123 | ## yes和True 124 | 向模块传递参数时,使用`yes`;在剧本其他地方使用`True`。 125 | 126 | ## 常见模块 127 | ### shell 128 | ansible默认使用 `command` 模块,但是很多时候并不能满足我们的需求。比如涉及到管道操作时,`command` 模块就无能为力了。 129 | 130 | 这个时候就需要用到 `shell` 模块了! 131 | 132 | 1.过滤进程 133 | ``` 134 | ansible gb_test -m shell -a 'ps -ef|grep -v grep|grep cron' 135 | ``` 136 | 137 | ### script 138 | script模块用来在所有主机执行本地shell脚本 139 | ``` 140 | ansible 'hosts' -m script -a 'test.sh' 141 | ``` 142 | 143 | ### setup 144 | 我们可以通过setup模块查看主机的相关信息。 145 | 146 | ## playbook 147 | 但通常情况下,有很多任务需要执行,这个时候该怎么办呢? 148 | 149 | 难道把命令行全都放在一个脚本文件中?这种方式当然可行,但是明显不够完美。 150 | 151 | ansible其实提供了一个剧本,让我们可以将多个任务放在一个剧本中,然后执行这个剧本就可以了! 152 | 153 | - 剧本 154 | ``` 155 | # yml 156 | - hosts: all # 指定执行节点 157 | tasks: 158 | - name: "ifconfig eht1" 159 | shell: "ifconfig eth1" 160 | 161 | ``` 162 | 163 | - 执行 164 | ``` 165 | $ ansible-playbook -i /etc/ansible/hosts asb_pb_test.yml 166 | ``` 167 | 168 | ### 目录结构 169 | ``` 170 | playbooks/ 171 | hosts 172 | files/ 173 | templates 174 | ``` 175 | hosts文件用来存放主机清单文件,files用来存放文件,templates用来存放jinjia2模板文件。 176 | 177 | ### 执行方式 178 | ``` 179 | ansible-playbook foo.yml 180 | ``` 181 | ``` 182 | vim test.yml 183 | #!/usr/bin/env ansible-playbook 184 | 185 | ./test.yml(可执行权限) 186 | ``` 187 | 188 | ### 增加并行能力 189 | ``` 190 | vim ansible.cfg 191 | [defaults] 192 | forks = 20 193 | ``` 194 | 195 | ### 输出分析 196 | `GATHERING FACTS` ansible初始化时会去搜集主机的基本信息,这个就是在搜集中。 197 | 198 | 可以配置关闭这个搜集功能。 199 | ``` 200 | gather_facts: False 201 | ``` 202 | 或 203 | ``` 204 | [defaults] 205 | gathering=explicit 206 | ``` 207 | 208 | `changed` 主机状态和模块状态不一致,执行完后会出现`changed`;不改变状态为`ok`。 209 | 210 | # 注意事项 211 | ## 1.ansible命令行不要使用命令的别名,可能无法识别 212 | ansible命令行不要使用命令的别名,可能无法识别,比如: 213 | ``` 214 | ll 215 | 要写成 216 | ls -l 217 | ``` 218 | 219 | # 文档 220 | https://docs.ansible.com/ 221 | 222 | # 例子 223 | ## 复制文件 224 | ``` 225 | ansible nodes -m copy -a "src=/mnt/install_docker.sh dest=/mnt/install_docker.sh mode=755" 226 | ``` 227 | 228 | ## 下载文件 229 | ``` 230 | ansible webservers -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0755 force=yes" 231 | ``` 232 | 233 | ## yum安装 234 | ``` 235 | ansible webservers -m yum -a "name=httpd state=latest" 236 | ``` 237 | 238 | ## 重启服务 239 | ``` 240 | ansible webservers -m service -a "name=httpd state=restarted" 241 | ``` 242 | 243 | ## 查看主机组下所有主机 244 | ``` 245 | ansible hostgroup --list-hosts 246 | ``` 247 | 248 | ### 同时执行多个主机组 249 | ``` 250 | ansible 'h1:h2' -a '...' 251 | ``` 252 | 253 | ## ansible基于role部署apache 254 | ### 准备工作 255 | 配置域名解析 256 | ``` 257 | [root@vnode01 opt]# cat /etc/hosts 258 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 259 | ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 260 | 10.186.63.76 vnode01 261 | 10.186.63.182 vnode02 262 | 10.186.63.9 vnode03 263 | ``` 264 | 265 | 配置文件 266 | ``` 267 | /etc/ansible/hosts 268 | ... 269 | [vnodes] 270 | vnode01 271 | vnode02 272 | vnode03 273 | ``` 274 | 275 | ssh初始化 276 | 277 | 在vnode01执行: 278 | ``` 279 | ssh vnode01 280 | ssh vnode02 281 | ssh vnode03 282 | ``` 283 | 284 | ### 目录结构 285 | ``` 286 | . 287 | └── role 288 | ├── apache 289 | │   ├── files 290 | │   │   └── index.html 291 | │   ├── handlers 292 | │   │   └── main.yaml 293 | │   ├── tasks 294 | │   │   └── main.yaml 295 | │   ├── templates 296 | │   │   └── httpd.conf.j2 297 | │   └── vars 298 | │   └── main.yaml 299 | └── site.yaml 300 | 301 | 7 directories, 6 files 302 | ``` 303 | 304 | ### 执行 305 | ``` 306 | ansible-playbook -vv role/site.yaml 307 | ``` 308 | 309 | ### 验证 310 | ``` 311 | [root@vnode02 ~]# curl -vvv 127.0.0.1:880 312 | * About to connect() to 127.0.0.1 port 880 (#0) 313 | * Trying 127.0.0.1... 314 | * Connected to 127.0.0.1 (127.0.0.1) port 880 (#0) 315 | > GET / HTTP/1.1 316 | > User-Agent: curl/7.29.0 317 | > Host: 127.0.0.1:880 318 | > Accept: */* 319 | > 320 | < HTTP/1.1 200 OK 321 | < Date: Tue, 02 Jul 2019 02:20:51 GMT 322 | < Server: Apache/2.4.6 (CentOS) 323 | < Last-Modified: Tue, 02 Jul 2019 02:20:14 GMT 324 | < ETag: "13-58ca962926d6a" 325 | < Accept-Ranges: bytes 326 | < Content-Length: 19 327 | < Content-Type: text/html; charset=UTF-8 328 | < 329 | welcome to apache! 330 | * Connection #0 to host 127.0.0.1 left intact 331 | ``` -------------------------------------------------------------------------------- /CICD/jenkins/jenkins.md: -------------------------------------------------------------------------------- 1 | > jenkins 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 7 | * [jenkins](#jenkins) 8 | * [目录结构](#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84) 9 | * [文档](#%E6%96%87%E6%A1%A3) 10 | * [pipeline](#pipeline) 11 | * [环境说明](#%E7%8E%AF%E5%A2%83%E8%AF%B4%E6%98%8E) 12 | * [jenkins必须安装的插件](#jenkins%E5%BF%85%E9%A1%BB%E5%AE%89%E8%A3%85%E7%9A%84%E6%8F%92%E4%BB%B6) 13 | * [jenkinsfile编辑器推荐](#jenkinsfile%E7%BC%96%E8%BE%91%E5%99%A8%E6%8E%A8%E8%8D%90) 14 | * [jenkins换主题](#jenkins%E6%8D%A2%E4%B8%BB%E9%A2%98) 15 | * [步骤](#%E6%AD%A5%E9%AA%A4) 16 | * [1\.gitlab创建一个测试用户test](#1gitlab%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7test) 17 | * [2\.test用户创建一个springcloud项目(勾选初始化README\.md)](#2test%E7%94%A8%E6%88%B7%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAspringcloud%E9%A1%B9%E7%9B%AE%E5%8B%BE%E9%80%89%E5%88%9D%E5%A7%8B%E5%8C%96readmemd) 18 | * [3\.添加git客户端的SSH Key](#3%E6%B7%BB%E5%8A%A0git%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84ssh-key) 19 | * [4\.git客户端上操作](#4git%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8A%E6%93%8D%E4%BD%9C) 20 | * [5\.jenkins配置gitlab地址](#5jenkins%E9%85%8D%E7%BD%AEgitlab%E5%9C%B0%E5%9D%80) 21 | * [6\.构建项目](#6%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE) 22 | * [全局变量](#%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F) 23 | * [docker](#docker) 24 | * [配置邮件](#%E9%85%8D%E7%BD%AE%E9%82%AE%E4%BB%B6) 25 | * [多分支pipeline](#%E5%A4%9A%E5%88%86%E6%94%AFpipeline) 26 | * [共享库](#%E5%85%B1%E4%BA%AB%E5%BA%93) 27 | * [最佳实践](#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5) 28 | * [1\.](#1) 29 | * [2\.](#2) 30 | * [3\.](#3) 31 | * [二次开发](#%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91) 32 | * [golang实现的jenkins api](#golang%E5%AE%9E%E7%8E%B0%E7%9A%84jenkins-api) 33 | 34 | # 基本概念 35 | ## jenkins 36 | jenkins是一个CICD工具,主要作用是代码的构建和发布。 37 | 38 | ## 目录结构 39 | 目录 | 说明 40 | ---|--- 41 | jobs | 创建的job及相关数据都会放在该目录 42 | users | 本地数据库的方式下,用户文件存放点 43 | war | jenkins.war包会解压到该目录,winstone.jar文件的存放点 44 | secrets | 初始密码就存放在这里,initialAdminPassword 45 | 46 | # 文档 47 | https://jenkins.io/zh/doc/book/ 48 | 49 | # pipeline 50 | ## 环境说明 51 | 服务器 52 | ``` 53 | jenkins server: 10.186.63.9:8080 54 | gitlab server: 10.186.63.77 55 | 应用服务器: 10.186.63.76 56 | git客户端: 10.186.63.9 57 | ``` 58 | 59 | 账号 60 | ``` 61 | gitlab用户: test 62 | 密码: test123456 63 | ``` 64 | 65 | ## jenkins必须安装的插件 66 | ``` 67 | Pipeline 68 | GitLab 69 | Git Parameter 70 | Extended Choice Parameter 71 | Email Extension 72 | Workspace Cleanup 73 | ``` 74 | 75 | ## jenkinsfile编辑器推荐 76 | 推荐使用vscode,需要安装插件: 77 | ``` 78 | jenkins-pipeline-linter-connector 79 | ``` 80 | ## jenkins换主题 81 | 1.安装`Simple Theme`插件 82 | 83 | 2.到GitHub搜索`jenkins theme` 84 | 85 | 这里使用 http://afonsof.com/jenkins-material-theme/,可以自己制作图标和主题,然后把主题下载到本地,之后上传css文件到网盘,直接在系统设置中配置css文件的URL即可! 86 | 87 | ## 步骤 88 | ### 1.gitlab创建一个测试用户test 89 | 90 | ### 2.test用户创建一个springcloud项目(勾选初始化README.md) 91 | 92 | ### 3.添加git客户端的SSH Key 93 | 94 | ### 4.git客户端上操作 95 | 初始化仓库 96 | ``` 97 | cd /mnt/git 98 | git init 99 | ``` 100 | 101 | 上传项目到仓库 102 | 103 | 初始化git 104 | ``` 105 | git config --global user.name jenkins_server 106 | git config --global user.email jenkins_server@test.com 107 | ``` 108 | 109 | 提交 110 | ``` 111 | git add spring-cloud-config-server/ 112 | git commit -m "springcloud config-server" 113 | ``` 114 | 115 | 添加解析 116 | ``` 117 | vim /etc/hosts 118 | 10.186.63.77 test.gitlab.com 119 | ``` 120 | 121 | 推送到gitlab server 122 | ``` 123 | git remote add ssh-origin ssh://git@test.gitlab.com/test/springcloud.git 124 | git pull ssh-origin master 125 | git push -u ssh-origin master #仅仅第一次加上-u选项 126 | ``` 127 | 128 | gitlab创建test分支,之后可以推送代码到远程test分支 129 | ``` 130 | git push ssh-origin master:dev 131 | ``` 132 | 133 | ### 5.jenkins配置gitlab地址 134 | 1.首先在 凭据->系统->全局凭据 创建两个账号 135 | ``` 136 | GitLab API token (gitlab-token-01) 137 | test/****** (test-username-password) 138 | ``` 139 | 注意:需要先在gitlab->Settings->access tokens中创建一个personal token,scope选择api。 140 | 141 | 2.在 系统管理->系统设置->Gitlab中配置仓库地址 142 | 143 | 3.在项目中直接使用即可 144 | 145 | 4.创建一个list视图 `springcloud-framework` 146 | 147 | 5.在视图中创建一个job`config-server` 148 | 149 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560243835/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190611151905.png) 150 | 151 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560243835/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190611152122.png) 152 | 153 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560243967/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190611170542.png) 154 | 155 | 注意: Script Path就是jenkinsfile的名称,默认是`Jenkinsfile`,如果不一致记得修改! 156 | 157 | jenkinsfile 158 | ``` 159 | node { 160 | stage('检出代码') { 161 | git branch: '${branch_name}', credentialsId: 'test-username-password', url: 'http://test.gitlab.com/test/springcloud.git', changelog: true 162 | } 163 | stage('Maven构建') { 164 | println "service: ${service_name}" 165 | dir('./') { 166 | sh """ 167 | pwd 168 | ls 169 | """ 170 | } 171 | } 172 | stage('部署项目到远程服务器') { 173 | dir('/data/build') { 174 | sh '/data/build/test.sh' 175 | } 176 | } 177 | } 178 | ``` 179 | 180 | ## 6.构建项目 181 | 之后点击参数化构建即可。 182 | 183 | ## 全局变量 184 | ### docker 185 | 用来访问和docker相关的函数。 186 | 187 | ## 配置邮件 188 | 在 Jenkins 的主界面,进入系统管理,系统设置,然后找到 Extended E-mail Notification,添加与邮件通知类似的配置: 189 | 190 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560499884/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190614160907.png) 191 | 192 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560499885/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190614160936.png) 193 | 194 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1560499885/%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/QQ%E6%88%AA%E5%9B%BE20190614160959.png) 195 | 196 | ## 多分支pipeline 197 | 不同的分支发布到不同的环境,比如说合并到test分支,就自动构建到测试环境,合并到releas就上预发布,master就上线了 198 | 199 | 每个分支的Jenkinsfile都可以不同,比如说不同的环境可能要做一些特殊的操作啥的 200 | 201 | ## 共享库 202 | pipeline提供了一种共享库的机制,可以将一些通用的代码放到gitlab,之后任何项目都可以导入共享库,并且使用这些通用的代码。 203 | 204 | 1.首先得将共享库提交到gitlab 205 | ``` 206 | . 207 | ├── README.md 208 | └── vars 209 | └── test.groovy 210 | ``` 211 | 212 | ``` 213 | test.groovy 214 | def call() { 215 | echo '完成!' 216 | } 217 | 218 | def ok(a) { 219 | echo 'ok!' 220 | echo "args: ${a}" 221 | } 222 | ``` 223 | 224 | 2.在jenkins配置该共享库 225 | 226 | 配置->系统配置->全局共享库 227 | 228 | 3.在项目中使用共享库 229 | ``` 230 | @Library('test-library') _ 231 | 232 | node { 233 | stage('测试') { 234 | test() 235 | test.ok('hehe') 236 | } 237 | } 238 | ``` 239 | 240 | ## 最佳实践 241 | ### 1. 242 | ``` 243 | node { 244 | try { 245 | stage('拉取代码') { 246 | git branch: '${branch_name}', credentialsId: 'test-username-password', url: 'http://test.gitlab.com/test/springcloud.git' 247 | } 248 | stage('项目构建') { 249 | echo currentBuild.JOB_NAME 250 | dir('./') { 251 | sh """ 252 | echo "开始构建..." 253 | echo "构建完成" 254 | """ 255 | } 256 | } 257 | stage('部署项目') { 258 | echo "开始部署项目 " 259 | } 260 | } catch (e) { 261 | echo "Failed: ${e}" 262 | echo "result: ${currentBuild.result}" 263 | emailext( 264 | subject: "构建结果通知【失败】", 265 | body: "构建项目:${BUILD_URL}\r\n构建失败,\r\n错误消息:${e.toString()}", 266 | to: '${EMAIL}' 267 | ) 268 | throw e 269 | } finally { 270 | // 清空工作空间 271 | cleanWs notFailBuild: true 272 | } 273 | } 274 | ``` 275 | 276 | ### 2. 277 | ``` 278 | node { 279 | try { 280 | stage('拉取代码') { 281 | git branch: '${branch_name}', credentialsId: 'test-username-password', url: 'http://test.gitlab.com/test/${project_name}.git' 282 | } 283 | stage('项目构建') { 284 | dir('./') { 285 | sh """ 286 | cd ${service_name} 287 | echo "开始构建..." 288 | /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true 289 | echo "构建完成" 290 | cp target/*.jar /data/build 291 | """ 292 | } 293 | } 294 | stage('存档') {//注释 295 | def jar = getShEchoResult("find ./ -name '*.jar'") 296 | echo jar 297 | def artifactsDir="artifacts"//存放产物的文件夹 298 | ///usr/local/jenkins/jobs/demo/builds/xx/archive/artifacts 299 | sh "mkdir ${artifactsDir}" 300 | sh "mv ${jar} ${artifactsDir}" 301 | archiveArtifacts "${artifactsDir}/*" 302 | } 303 | stage('部署项目') { 304 | dir('/data/build') { 305 | sh '/data/build/test.sh' 306 | echo "传输代码到远程应用服务器..." 307 | sh 'scp *.jar 10.186.63.76:/tmp' 308 | //执行远程脚本 309 | sh """ 310 | ssh 10.186.63.76 "cd /usr/local/scripts/deploy;sh run_java.sh" 311 | """ 312 | } 313 | } 314 | } catch (e) { 315 | echo "Failed: ${e}" 316 | echo "result: ${currentBuild.result}" 317 | emailext( 318 | subject: "构建结果通知【失败】", 319 | body: "构建项目:${BUILD_URL}\r\n构建失败,\r\n错误消息:${e.toString()}", 320 | to: '${EMAIL}' 321 | ) 322 | throw e 323 | } finally { 324 | // 清空工作空间 325 | cleanWs notFailBuild: true 326 | } 327 | } 328 | 329 | // 获取 shell 命令输出内容 330 | def getShEchoResult(cmd) { 331 | def getShEchoResultCmd = "ECHO_RESULT=`${cmd}`\necho \${ECHO_RESULT}" 332 | return sh ( 333 | script: getShEchoResultCmd, 334 | returnStdout: true 335 | ).trim() 336 | } 337 | ``` 338 | 339 | ### 3. 340 | ``` 341 | node { 342 | try { 343 | stage('拉取代码') { 344 | git branch: '${branch_name}', credentialsId: 'test-username-password', url: 'http://test.gitlab.com/test/${project_name}.git' 345 | } 346 | stage('项目构建') { 347 | dir('./') { 348 | sh """ 349 | cd ${service_name} 350 | echo "开始构建..." 351 | /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true 352 | echo "构建完成" 353 | mkdir /data/build/${service_name} 354 | cp target/*.jar /data/build/${service_name} 355 | """ 356 | } 357 | } 358 | stage('部署项目') { 359 | dir('/data/build') { 360 | echo "传输代码到远程应用服务器..." 361 | sh 'scp ${service_name}/*.jar 10.186.63.76:/opt' 362 | //执行远程脚本 363 | sh """ 364 | ssh 10.186.63.76 "cd /usr/local/scripts/deploy;sh run_java.sh ${service_name}" 365 | """ 366 | } 367 | } 368 | } catch (e) { 369 | echo "Failed: ${e}" 370 | echo "result: ${currentBuild.result}" 371 | emailext( 372 | subject: "构建结果通知【失败】", 373 | body: "构建项目:${BUILD_URL}\r\n构建失败,\r\n错误消息:${e.toString()}", 374 | to: '${EMAIL}' 375 | ) 376 | throw e 377 | } finally { 378 | // 清空工作空间 379 | cleanWs notFailBuild: true 380 | } 381 | } 382 | ``` 383 | 384 | # 二次开发 385 | ## golang实现的jenkins api 386 | ``` 387 | package main 388 | 389 | import ( 390 | "fmt" 391 | 392 | "github.com/bndr/gojenkins" 393 | ) 394 | 395 | func main() { 396 | jenkins := gojenkins.CreateJenkins(nil, "http://10.186.63.9:8080/", "Admin", "864160c05c3344d3bb7905750f4eb946") 397 | // Provide CA certificate if server is using self-signed certificate 398 | // caCert, _ := ioutil.ReadFile("/tmp/ca.crt") 399 | // jenkins.Requester.CACert = caCert 400 | _, err := jenkins.Init() 401 | 402 | if err != nil { 403 | fmt.Println("err: ", err) 404 | panic("Something Went Wrong") 405 | } 406 | 407 | build, err := jenkins.GetJob("config-server") 408 | if err != nil { 409 | panic("Job Does Not Exist") 410 | } 411 | lastSuccessBuild, err := build.GetLastSuccessfulBuild() 412 | if err != nil { 413 | panic("Last SuccessBuild does not exist") 414 | } 415 | 416 | output := lastSuccessBuild.GetConsoleOutput() 417 | fmt.Println("console output: ", output) 418 | 419 | } 420 | ``` 421 | -------------------------------------------------------------------------------- /容器/k8s/k8s.md: -------------------------------------------------------------------------------- 1 | > k8s 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 7 | * [Rest设计规则](#rest%E8%AE%BE%E8%AE%A1%E8%A7%84%E5%88%99) 8 | * [资源(对象)](#%E8%B5%84%E6%BA%90%E5%AF%B9%E8%B1%A1) 9 | * [API Server](#api-server) 10 | * [说明](#%E8%AF%B4%E6%98%8E) 11 | * [swagger ui](#swagger-ui) 12 | * [查看所有API](#%E6%9F%A5%E7%9C%8B%E6%89%80%E6%9C%89api) 13 | * [Deployment](#deployment) 14 | * [Deployment的特性](#deployment%E7%9A%84%E7%89%B9%E6%80%A7) 15 | * [Deployment对比RC](#deployment%E5%AF%B9%E6%AF%94rc) 16 | * [Deployment的应用场景](#deployment%E7%9A%84%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF) 17 | * [Service](#service) 18 | * [特性](#%E7%89%B9%E6%80%A7) 19 | * [总结](#%E6%80%BB%E7%BB%93) 20 | * [kube proxy](#kube-proxy) 21 | * [作用](#%E4%BD%9C%E7%94%A8) 22 | * [特性](#%E7%89%B9%E6%80%A7-1) 23 | * [Annotation](#annotation) 24 | * [特性](#%E7%89%B9%E6%80%A7-2) 25 | * [常见的annotation](#%E5%B8%B8%E8%A7%81%E7%9A%84annotation) 26 | * [Volumn](#volumn) 27 | * [分类](#%E5%88%86%E7%B1%BB) 28 | * [架构](#%E6%9E%B6%E6%9E%84) 29 | * [master节点](#master%E8%8A%82%E7%82%B9) 30 | * [api server](#api-server-1) 31 | * [controller manager](#controller-manager) 32 | * [scheduler](#scheduler) 33 | * [node节点](#node%E8%8A%82%E7%82%B9) 34 | * [kubelet](#kubelet) 35 | * [kube proxy](#kube-proxy-1) 36 | * [docker](#docker) 37 | * [etcd](#etcd) 38 | * [k8s客户端](#k8s%E5%AE%A2%E6%88%B7%E7%AB%AF) 39 | * [使用](#%E4%BD%BF%E7%94%A8) 40 | * [1\.nodePort的范围](#1nodeport%E7%9A%84%E8%8C%83%E5%9B%B4) 41 | * [2\.service相关命令行](#2service%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4%E8%A1%8C) 42 | * [3\.查看k8s集群各组件状态](#3%E6%9F%A5%E7%9C%8Bk8s%E9%9B%86%E7%BE%A4%E5%90%84%E7%BB%84%E4%BB%B6%E7%8A%B6%E6%80%81) 43 | * [4\.查看nodes状态](#4%E6%9F%A5%E7%9C%8Bnodes%E7%8A%B6%E6%80%81) 44 | * [5\.查看node的标签](#5%E6%9F%A5%E7%9C%8Bnode%E7%9A%84%E6%A0%87%E7%AD%BE) 45 | * [6\.查看PodIP和container端口](#6%E6%9F%A5%E7%9C%8Bpodip%E5%92%8Ccontainer%E7%AB%AF%E5%8F%A3) 46 | * [7\.查看pod运行在哪个node](#7%E6%9F%A5%E7%9C%8Bpod%E8%BF%90%E8%A1%8C%E5%9C%A8%E5%93%AA%E4%B8%AAnode) 47 | * [8\.查看pod详细信息](#8%E6%9F%A5%E7%9C%8Bpod%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF) 48 | * [9\.查看日志](#9%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97) 49 | * [10\.交互式进入k8s](#10%E4%BA%A4%E4%BA%92%E5%BC%8F%E8%BF%9B%E5%85%A5k8s) 50 | * [11\.删除deployment](#11%E5%88%A0%E9%99%A4deployment) 51 | * [12\.创建service account](#12%E5%88%9B%E5%BB%BAservice-account) 52 | * [13\.创建clusterrolebinding](#13%E5%88%9B%E5%BB%BAclusterrolebinding) 53 | * [14\.创建令牌](#14%E5%88%9B%E5%BB%BA%E4%BB%A4%E7%89%8C) 54 | * [15\.解决镜像站点不能访问的问题](#15%E8%A7%A3%E5%86%B3%E9%95%9C%E5%83%8F%E7%AB%99%E7%82%B9%E4%B8%8D%E8%83%BD%E8%AE%BF%E9%97%AE%E7%9A%84%E9%97%AE%E9%A2%98) 55 | * [示例](#%E7%A4%BA%E4%BE%8B) 56 | * [1\.在k8s上部署jenkins](#1%E5%9C%A8k8s%E4%B8%8A%E9%83%A8%E7%BD%B2jenkins) 57 | * [文档](#%E6%96%87%E6%A1%A3) 58 | * [步骤](#%E6%AD%A5%E9%AA%A4) 59 | * [1\.创建namespace](#1%E5%88%9B%E5%BB%BAnamespace) 60 | * [2\.定义并创建deployment](#2%E5%AE%9A%E4%B9%89%E5%B9%B6%E5%88%9B%E5%BB%BAdeployment) 61 | * [3\.定义并创建service](#3%E5%AE%9A%E4%B9%89%E5%B9%B6%E5%88%9B%E5%BB%BAservice) 62 | * [4\.访问jenkins](#4%E8%AE%BF%E9%97%AEjenkins) 63 | * [实现jenkins的持久化](#%E5%AE%9E%E7%8E%B0jenkins%E7%9A%84%E6%8C%81%E4%B9%85%E5%8C%96) 64 | * [1\.给运行jenkins的node打标签](#1%E7%BB%99%E8%BF%90%E8%A1%8Cjenkins%E7%9A%84node%E6%89%93%E6%A0%87%E7%AD%BE) 65 | * [2\.pod和node进行绑定](#2pod%E5%92%8Cnode%E8%BF%9B%E8%A1%8C%E7%BB%91%E5%AE%9A) 66 | * [3\.设置存储卷](#3%E8%AE%BE%E7%BD%AE%E5%AD%98%E5%82%A8%E5%8D%B7) 67 | * [4\.修改宿主机挂载目录的权限为jenkins user](#4%E4%BF%AE%E6%94%B9%E5%AE%BF%E4%B8%BB%E6%9C%BA%E6%8C%82%E8%BD%BD%E7%9B%AE%E5%BD%95%E7%9A%84%E6%9D%83%E9%99%90%E4%B8%BAjenkins-user) 68 | * [5\.删除pod并重新创建](#5%E5%88%A0%E9%99%A4pod%E5%B9%B6%E9%87%8D%E6%96%B0%E5%88%9B%E5%BB%BA) 69 | * [6\.进行验证](#6%E8%BF%9B%E8%A1%8C%E9%AA%8C%E8%AF%81) 70 | 71 | # 基本概念 72 | ## Rest设计规则 73 | Rest的设计规则: 74 | 75 | 1.所有事物抽象为资源 76 | 77 | 2.资源有唯一标识符(URI) 78 | 79 | 3.使用通用的接口对资源进行操作 80 | 81 | 4.对资源的操作不会影响URI 82 | 83 | 5.操作是无状态的 84 | 85 | ## 资源(对象) 86 | 1.资源有元数据 87 | 88 | 2.资源可以嵌套 89 | 90 | ## API Server 91 | ### 说明 92 | 1.API Sever支持Rest和非Rest风格 93 | 94 | ### swagger ui 95 | api server提供了swagger api: 96 | ``` 97 | http://apiserver:8080/swagger-ui/ 98 | ``` 99 | 100 | ### 查看所有API 101 | ``` 102 | http://apiserver:8080/api/v1 103 | ``` 104 | 105 | ## Deployment 106 | ### Deployment的特性 107 | 1.Deployment相当于RC的升级版 108 | 109 | 2.Deployment内部使用了Replica Set 110 | 111 | ### Deployment对比RC 112 | Deployment对比RC,最大的一个升级是:能够随时了解当前Pod的部署状态。 113 | 114 | ### Deployment的应用场景 115 | 1.通过创建deployment对象来创建replica set对象,最终创建pod副本对象 116 | 117 | 2.通过检查deployment来查询部署进度 118 | 119 | 3.通过deployment来实现pod的更新和回滚(扩容,缩容) 120 | 121 | ## Service 122 | ### 特性 123 | 1.service定义了一个服务的访问入口 124 | 125 | 2.service相当于微服务架构中的一个微服务 126 | 127 | 3.service和后端pod集群交互是通过label selector实现的 128 | 129 | ### 总结 130 | 传统服务通过k8s的service实现了微服务,不同的service提供不同业务的服务,它们之间彼此独立,一起组成强大而灵活的微服务系统。 131 | 132 | ## kube proxy 133 | ### 作用 134 | kube proxy将来自service的请求转发给后端的pod。 135 | 136 | ### 特性 137 | 1.service被创建,系统会分配给它一个独立的IP(cluster IP),这个IP是固定的 138 | 139 | ## Annotation 140 | ### 特性 141 | 1.中文为注解 142 | 143 | 2.用来定义资源对象的特殊信息 144 | 145 | ### 常见的annotation 146 | 1.build,release信息 147 | 148 | 2.docker信息 149 | 150 | 3.日志库,监控库等资源库的地址信息 151 | 152 | ## Volumn 153 | ### 分类 154 | ``` 155 | 宿主机: emptyDir、HostPath 156 | 集群存储: configmap、secret 157 | 云存储: awsElasticBlockStore、gcePersistentDisk等 158 | 外部存储: glusterfs、Ceph等 159 | ``` 160 | 161 | # 架构 162 | ## master节点 163 | master是k8s集群的控制节点,每个k8s集群都有一个master节点。 164 | 165 | master节点负责管理和控制整个集群。 166 | 167 | master节点由三个组件构成:api server,controller manager,scheduler。 168 | 169 | ### api server 170 | api server是集群的控制入口,也是资源对象操作的唯一入口。提供了rest风格API供客户端调用。 171 | 172 | ### controller manager 173 | controller manager是集群的控制中心。相当于资源对象的“管家”。 174 | 175 | ### scheduler 176 | scheduler是集群的调度中心。负责Pod的调度。 177 | 178 | ## node节点 179 | node节点时集群的工作节点。负责接收master节点的指令并在本地执行。 180 | 181 | node节点由三个组件构成:kubelet,proxy,docker 182 | 183 | ### kubelet 184 | kubelet负责Pod的创建,启动,销毁。 185 | 186 | ### kube proxy 187 | kube proxy负责service资源对象的实现,提供Pod的负载均衡。 188 | 189 | ### docker 190 | docker负责容器的创建和管理。 191 | 192 | ## etcd 193 | etcd是k8s集群的存储中心,负责存储k8s各种资源的信息。 194 | 195 | ## k8s客户端 196 | 用户通过k8s客户端和k8s集群进行交互。常见的客户端有:kubectl工具,编程语言的sdk。 197 | 198 | # 使用 199 | ## 1.nodePort的范围 200 | ``` 201 | 30000-32767 202 | ``` 203 | 204 | ## 2.service相关命令行 205 | ``` 206 | #查看PodIP和container端口 207 | kubectl get endpoints --namespace=jenkins 208 | #查看service详细信息 209 | kubectl get svc jenkins-service -o yaml --namespace=jenkins 210 | #查看pod运行在哪个node 211 | kubectl get pods -o wide --namespace=jenkins 212 | #查看pod详细信息 213 | kubectl describe pod jenkins-deployment-85bf948f97-vcd42 --namespace=jenkins 214 | #查看日志 215 | kubectl logs jenkins-deployment-85bf948f97-q86c6 --namespace=jenkins 216 | (-f 表示流式打印日志) 217 | #重启pod 218 | kubectl get pod jenkins-deployment-85bf948f97-q86c6 -o yaml --namespace=jenkins|kubectl replace --force -f - 219 | #交互式进入k8s 220 | kubectl exec -it -n jenkins jenkins-deployment-85bf948f97-fzxtk /bin/bash 221 | #删除deployment 222 | kubectl delete deployment jenkins-deployment -n jenkins 223 | ``` 224 | 225 | ## 3.查看k8s集群各组件状态 226 | ``` 227 | kubectl get componentstatuses 228 | ``` 229 | 230 | ## 4.查看nodes状态 231 | ``` 232 | kubectl get nodes 233 | ``` 234 | 235 | ## 5.查看node的标签 236 | ``` 237 | kubectl get nodes --show-labels 238 | ``` 239 | 240 | ## 6.查看PodIP和container端口 241 | ``` 242 | kubectl get endpoints --namespace=jenkins 243 | ``` 244 | 245 | ## 7.查看pod运行在哪个node 246 | ``` 247 | kubectl get pods -o wide --namespace=jenkins 248 | ``` 249 | 250 | ## 8.查看pod详细信息 251 | ``` 252 | kubectl describe pod jenkins-deployment-85bf948f97-vcd42 --namespace=jenkins 253 | ``` 254 | 255 | ## 9.查看日志 256 | ``` 257 | kubectl logs jenkins-deployment-85bf948f97-q86c6 --namespace=jenkins 258 | (-f 表示流式打印日志) 259 | ``` 260 | 261 | ## 10.交互式进入k8s 262 | ``` 263 | kubectl exec -it -n jenkins jenkins-deployment-85bf948f97-fzxtk /bin/bash 264 | ``` 265 | 266 | ## 11.删除deployment 267 | ``` 268 | kubectl delete deployment jenkins-deployment -n jenkins 269 | ``` 270 | 271 | ## 12.创建service account 272 | ``` 273 | kubectl create sa dashboard-admin -n kube-system 274 | ``` 275 | 276 | ## 13.创建clusterrolebinding 277 | ``` 278 | kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin 279 | ``` 280 | 281 | ## 14.创建令牌 282 | ``` 283 | kubectl create sa dashboard-admin -n kube-system 284 | kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin 285 | 286 | ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}') 287 | 288 | DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}') 289 | 290 | echo ${DASHBOARD_LOGIN_TOKEN} 291 | ``` 292 | 293 | ## 15.解决镜像站点不能访问的问题 294 | 1.自己拉国内镜像的镜像,然后重新打tag 295 | ``` 296 | docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0 297 | docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0 298 | ``` 299 | 300 | # 示例 301 | ## 1.在k8s上部署jenkins 302 | ### 文档 303 | https://devopscube.com/setup-jenkins-on-kubernetes-cluster/ 304 | 305 | ### 步骤 306 | #### 1.创建namespace 307 | ``` 308 | kubectl create ns jenkins 309 | ``` 310 | 311 | #### 2.定义并创建deployment 312 | ``` 313 | #cat jenkins-deployment.yml 314 | apiVersion: extensions/v1beta1 315 | kind: Deployment 316 | metadata: 317 | name: jenkins-deployment 318 | spec: 319 | replicas: 1 320 | selector: 321 | matchLabels: 322 | app: jenkins 323 | template: 324 | metadata: 325 | labels: 326 | app: jenkins 327 | spec: 328 | containers: 329 | - name: jenkins 330 | image: jenkins:2.60.3 331 | ports: 332 | - containerPort: 8080 333 | ``` 334 | ``` 335 | kubectl create -f jenkins-deployment.yml --namespace=jenkins 336 | ``` 337 | 338 | #### 3.定义并创建service 339 | ``` 340 | #cat jenkins-service.yml 341 | apiVersion: v1 342 | kind: Service 343 | metadata: 344 | name: jenkins-service 345 | spec: 346 | type: NodePort 347 | ports: 348 | - port: 8080 349 | targetPort: 8080 350 | nodePort: 30000 351 | selector: 352 | app: jenkins 353 | ``` 354 | ``` 355 | kubectl create -f jenkins-service.yml --namespace=jenkins 356 | ``` 357 | 358 | #### 4.访问jenkins 359 | ``` 360 | #查看pod运行在哪个node 361 | kubectl get pods -o wide --namespace=jenkins 362 | ``` 363 | 访问 364 | ``` 365 | http://:30000 366 | ``` 367 | 368 | jenkins的初始密码可以通过日志获得: 369 | ``` 370 | kubectl logs jenkins-deployment-85bf948f97-q86c6 --namespace=jenkins 371 | ``` 372 | 373 | ### 实现jenkins的持久化 374 | #### 1.给运行jenkins的node打标签 375 | ``` 376 | #给运行jenkins的node打标签 377 | kubectl label nodes 10.186.60.107 app=jenkins 378 | ``` 379 | 380 | #### 2.pod和node进行绑定 381 | ``` 382 | #pod和node进行绑定 383 | apiVersion: extensions/v1beta1 384 | kind: Deployment 385 | metadata: 386 | name: jenkins-deployment 387 | spec: 388 | replicas: 1 389 | selector: 390 | matchLabels: 391 | app: jenkins 392 | template: 393 | metadata: 394 | labels: 395 | app: jenkins 396 | spec: 397 | containers: 398 | - name: jenkins 399 | image: jenkins:2.60.3 400 | ports: 401 | - containerPort: 8080 402 | nodeSelector: 403 | app: jenkins 404 | ``` 405 | 406 | #### 3.设置存储卷 407 | ``` 408 | #设置存储卷 409 | #cat jenkins-deployment.yml 410 | apiVersion: extensions/v1beta1 411 | kind: Deployment 412 | metadata: 413 | name: jenkins-deployment 414 | spec: 415 | replicas: 1 416 | selector: 417 | matchLabels: 418 | app: jenkins 419 | template: 420 | metadata: 421 | labels: 422 | app: jenkins 423 | spec: 424 | containers: 425 | - name: jenkins 426 | image: jenkins:2.60.3 427 | volumeMounts: 428 | - mountPath: /var/jenkins_home 429 | name: jenkins-home 430 | ports: 431 | - containerPort: 8080 432 | volumes: 433 | - name: jenkins-home 434 | hostPath: 435 | path: /volumes/jenkins_home 436 | nodeSelector: 437 | app: jenkins 438 | ``` 439 | 440 | #### 4.修改宿主机挂载目录的权限为jenkins user 441 | ``` 442 | #修改宿主机挂载目录的权限为jenkins user 443 | chown -R 1000 /volumes/jenkins_home 444 | ``` 445 | 446 | 查看jenkins uid的方式: 447 | ``` 448 | #kubectl exec -it jenkins-deployment-555c465c57-544z9 /bin/bash -n jenkins 449 | jenkins@jenkins-deployment-555c465c57-544z9:/$ cat /etc/passwd|grep jenkins 450 | jenkins:x:1000:1000::/var/jenkins_home:/bin/bash 451 | ``` 452 | 453 | #### 5.删除pod并重新创建 454 | ``` 455 | #重新创建pod 456 | kubectl delete deployment jenkins-deployment -n jenkins 457 | kubectl create -f jenkins-deployment.yml --namespace=jenkins 458 | ``` 459 | 460 | #### 6.进行验证 461 | ``` 462 | #重启pod进行验证 463 | kubectl get pod jenkins-deployment-555c465c57-7l7x4 -o yaml --namespace=jenkins|kubectl replace --force -f - 464 | ``` 465 | -------------------------------------------------------------------------------- /监控/zabbix/zabbix.md: -------------------------------------------------------------------------------- 1 | > zabbix 2 | 3 | Table of Contents 4 | ================= 5 | 6 | * [架构](#%E6%9E%B6%E6%9E%84) 7 | * [基本概念](#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5) 8 | * [数据采集方式](#%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86%E6%96%B9%E5%BC%8F) 9 | * [Zabbix agent](#zabbix-agent) 10 | * [Zabbix agent(active)](#zabbix-agentactive) 11 | * [简单检查(Simple check)](#%E7%AE%80%E5%8D%95%E6%A3%80%E6%9F%A5simple-check) 12 | * [SNMP设备监控](#snmp%E8%AE%BE%E5%A4%87%E7%9B%91%E6%8E%A7) 13 | * [SNMP介绍](#snmp%E4%BB%8B%E7%BB%8D) 14 | * [管理信息库(MIB)](#%E7%AE%A1%E7%90%86%E4%BF%A1%E6%81%AF%E5%BA%93mib) 15 | * [对象标识符(OID)](#%E5%AF%B9%E8%B1%A1%E6%A0%87%E8%AF%86%E7%AC%A6oid) 16 | * [OID的形式](#oid%E7%9A%84%E5%BD%A2%E5%BC%8F) 17 | * [OID名称标识](#oid%E5%90%8D%E7%A7%B0%E6%A0%87%E8%AF%86) 18 | * [zabbix中使用的OID](#zabbix%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%9A%84oid) 19 | * [SNMPv1](#snmpv1) 20 | * [SNMPv2](#snmpv2) 21 | * [SNMPv3](#snmpv3) 22 | * [SNMP原理](#snmp%E5%8E%9F%E7%90%86) 23 | * [SNMP trap](#snmp-trap) 24 | * [SNMPD配置](#snmpd%E9%85%8D%E7%BD%AE) 25 | * [snmpwalk](#snmpwalk) 26 | * [选项说明](#%E9%80%89%E9%A1%B9%E8%AF%B4%E6%98%8E) 27 | * [zabbix的动态索引](#zabbix%E7%9A%84%E5%8A%A8%E6%80%81%E7%B4%A2%E5%BC%95) 28 | * [动态索引的语法](#%E5%8A%A8%E6%80%81%E7%B4%A2%E5%BC%95%E7%9A%84%E8%AF%AD%E6%B3%95) 29 | * [动态索引的原理](#%E5%8A%A8%E6%80%81%E7%B4%A2%E5%BC%95%E7%9A%84%E5%8E%9F%E7%90%86) 30 | * [zabbix系统内部数据采集](#zabbix%E7%B3%BB%E7%BB%9F%E5%86%85%E9%83%A8%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86) 31 | * [Zabbix trap](#zabbix-trap) 32 | * [Zabbix aggregate](#zabbix-aggregate) 33 | * [External check](#external-check) 34 | * [Database monitor](#database-monitor) 35 | * [IPMI agent](#ipmi-agent) 36 | * [SSH agent](#ssh-agent) 37 | * [TELNET agent](#telnet-agent) 38 | * [JMX agent](#jmx-agent) 39 | * [原理](#%E5%8E%9F%E7%90%86) 40 | * [配置JMX服务](#%E9%85%8D%E7%BD%AEjmx%E6%9C%8D%E5%8A%A1) 41 | * [zabbix服务配置](#zabbix%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE) 42 | * [zabbix java gateway配置](#zabbix-java-gateway%E9%85%8D%E7%BD%AE) 43 | * [jmx监控项配置](#jmx%E7%9B%91%E6%8E%A7%E9%A1%B9%E9%85%8D%E7%BD%AE) 44 | * [Calculated](#calculated) 45 | * [zabbix server的进程](#zabbix-server%E7%9A%84%E8%BF%9B%E7%A8%8B) 46 | * [db watchdog](#db-watchdog) 47 | * [houserkeeper](#houserkeeper) 48 | * [alerter](#alerter) 49 | * [icmp poller](#icmp-poller) 50 | * [ipmi poller](#ipmi-poller) 51 | * [java poller](#java-poller) 52 | * [node watcher](#node-watcher) 53 | * [history syncer](#history-syncer) 54 | * [httppoller](#httppoller) 55 | * [poller](#poller) 56 | * [proxy poller](#proxy-poller) 57 | * [discovery](#discovery) 58 | * [trapper](#trapper) 59 | * [self\-monitoring](#self-monitoring) 60 | * [unreachable poller](#unreachable-poller) 61 | * [vmware collector](#vmware-collector) 62 | * [configuration syncer](#configuration-syncer) 63 | * [timer](#timer) 64 | * [escalator](#escalator) 65 | * [web配置](#web%E9%85%8D%E7%BD%AE) 66 | * [unsupported items的检测时间间隔](#unsupported-items%E7%9A%84%E6%A3%80%E6%B5%8B%E6%97%B6%E9%97%B4%E9%97%B4%E9%9A%94) 67 | * [zabbix调优](#zabbix%E8%B0%83%E4%BC%98) 68 | * [调优原则](#%E8%B0%83%E4%BC%98%E5%8E%9F%E5%88%99) 69 | * [操作系统层面的优化](#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%B1%82%E9%9D%A2%E7%9A%84%E4%BC%98%E5%8C%96) 70 | * [低级自动发现 \- LLD](#%E4%BD%8E%E7%BA%A7%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0---lld) 71 | * [流程](#%E6%B5%81%E7%A8%8B) 72 | * [支持的自动发现](#%E6%94%AF%E6%8C%81%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0) 73 | * [zabbix中的正则表达式](#zabbix%E4%B8%AD%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F) 74 | * [配置](#%E9%85%8D%E7%BD%AE) 75 | * [说明](#%E8%AF%B4%E6%98%8E) 76 | * [用法](#%E7%94%A8%E6%B3%95) 77 | * [Expression type](#expression-type) 78 | * [Character string included](#character-string-included) 79 | * [Any character string included](#any-character-string-included) 80 | * [Character string included](#character-string-included-1) 81 | * [Result is TRUE](#result-is-true) 82 | * [Result is FALSE](#result-is-false) 83 | 84 | # 架构 85 | zabbix架构图: 86 | 87 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1548299387/ops/zabbix_arch.png) 88 | 89 | # 基本概念 90 | - 主机(host) 91 | 92 | 被监控的网络设备。 93 | 94 | - 监控项(item) 95 | 96 | 被监控的对象。 97 | 98 | # 数据采集方式 99 | ## Zabbix agent 100 | agent的被动模式。zabbix服务器进程(默认监听10051端口)按照监控项所设置的时间间隔,定期发送采集数据的请求给agent进程(默认监听10050端口),agent开始采集监控数据并将采集到的数据返回给zabbix服务器。 101 | 102 | ## Zabbix agent(active) 103 | agent的主动模式。agent从配置文件(zabbix_agentd.conf)中读取ServerActive(zabbix服务器的IP)配置项的内容,连接到zabbix服务器获取需要采集的监控项列表以及其配置信息(监控项列表及其配置信息的读取频率是由RefreshActiveChecks配置项指定,默认120秒),根据监控项配置信息定期采集监控数据,在采集到数据之后立即发送监控数据给zabbix服务器。 104 | 105 | zabbix服务器和agent数据传输使用的是JSON格式。 106 | 107 | ## 简单检查(Simple check) 108 | https://www.zabbix.com/documentation/3.4/zh/manual/config/items/itemtypes/simple_checks 109 | 110 | ## SNMP设备监控 111 | ### SNMP介绍 112 | 简单网络管理协议。广泛应用于各种网络设备,比如交换机,路由器,打印机,存储设备,超融合设备,防火墙等。 113 | 114 | ### 管理信息库(MIB) 115 | 基于SNMP协议管理的监控对象的集合,就是MIB。比如CPU负载,磁盘状态等监控项的集合。 116 | 117 | ### 对象标识符(OID) 118 | MIB的组织结构是分层的,树状的,给每个监控对象设置一个标识符,这就是OID。通常使用OID来标识MIB中的对象。 119 | 120 | #### OID的形式 121 | 从根开始到指定对象所经过的各层次对象的位置符,用点号(.)从左至右连接起来,所形成的的字符串就是OID。比如".1.3.6.1.2.1.2.1"就是ifnumber的OID。 122 | 123 | #### OID名称标识 124 | 将各层次对象的名称用点号从左至右连接起来,这就是OID的名称标识,比如".iso.org.dod.internet.mgmt.mib-2.interface.ifnumber"。 125 | 126 | #### zabbix中使用的OID 127 | zabbix中使用最多的OID类似于"SNMPv2-MIB::sysName.0"这种形式,这是OID的另一种标识方法,标识SNMPv2信息库中sysName对象下第一节点的对象,即设备的系统全称。 128 | 129 | ### SNMPv1 130 | SNMPv1是SNMP协议的第一个版本,它指定了四种核心协议数据单元(PDU),分别是GET,用来获取指定对象的信息;GETNEXT,用来连续获取指定的多个对象的信息;SET,用来设置一个管理对象的信息;TRAP,当管理对象的信息发送变化时,主动向管理站(通常就是zabbix服务器)报告这种变化。 131 | 132 | SNMPv1只使用了一种安全策略,就是团体名。团体名和密码类似,只有正确提供团体名的管理站才能查询或设置SNMP代理。需要注意的是,SNMPv1,管理站和SNMP代理之前发送的PDU是明文的,非常不安全。 133 | 134 | ### SNMPv2 135 | SNMPv2是SNMPv1的进化版本,在性能和安全上进行了升级。另外还增加了GetBulk和Inform两种PDU,当一次get多个值时,即使某些值不存在,也不会报错。 136 | 137 | ### SNMPv3 138 | SNMPv3在SNMPv2基础上,增強了远程配置和安全性。放弃了之前依赖团体名认证的方式,提供了用户和密码认证方式;增加了数据包加密。 139 | 140 | ### SNMP原理 141 | SNMPv1, SNMPv2, SNMPv3都是zabbix服务器根据监控项配置,定期通过SNMP协议查询被监控SNMP代理的信息,是一种被动的数据采集模式。 142 | 143 | Zabbix服务器根据用户配置的监控项中的OID,定期调用net-snmp包所提供的接口函数,查询被监控主机上的MIB库中指定的OID所对应对象的数据。只需要被监控SNMP设备开启SNMP服务,并针对zabbix服务器开放查询权限,然后在配置监控项时指定好监控项目的OID值,zabbix就会按照我们的需求,定时去被监控主机上采集所需要的监控数据,不需要额外编写脚本。 144 | 145 | ### SNMP trap 146 | SNMP trap是指当SNMP代理发生某个事件时,根据自身配置,向指定地址和端口发送相应的SNMP信息。是一种主动的采集方式。这种方式所能采集的监控数据有限。 147 | 148 | ### SNMPD配置 149 | snmpd.conf 150 | ``` 151 | # 配置一条SNMPv3的用户信息,用户名snmpuser 152 | # 这里配置完了之后,还需要使用net-snmp-config工具来创建SNMPv3用户 153 | # net-snmp-config --create-snmpv3-user -ro -A A_STRING -a MD5|SHA snmpuser 154 | # -A 用户密码 155 | # -a 加密方法 156 | rouser snmpuser 157 | 158 | # 127.0.0.1和192.168.55.0网段的主机允许访问该SNMP服务器,需要使用相应的团体名 159 | # 只适用于SNMPv1和SNMPv2 160 | rocommunity community_name 192.168.55.0/24 161 | rocommunity c_name 127.0.0.1 162 | 163 | # 将所有没有使用团体名的,使用了SNMPv1和SNMPv2访问的归为notConfigGroup组 164 | group notConfigGroup v1 notConfigUser 165 | group notConfigGroup v2c notConfigUser 166 | 167 | # 定义一个视图 168 | view systemview included .1.3.6.1.2.1.1 169 | 170 | # 所有属于notConfigGroup组的访问都会被拒绝 171 | access notConfigGroup "" any noauth exact all none none 172 | 173 | # 配置SNMPv1 trap,指定团体名为public,接受的服务器IP为192.168.11.22 174 | trap1 192.168.11.22:162 public 175 | # 配置SNMPv2 trap,指定团体名为trap2,接受的服务器IP为192.168.33.12 176 | trap2 192.168.33.12:162 trap2 177 | # 注意这里的团体名要和管理站上的snmptrapd.conf中所配置的团体名保持一致 178 | 179 | ``` 180 | 181 | ### snmpwalk 182 | snmpwalk是snmp客户端,用来采集snmp设备上的信息。 183 | 184 | #### 选项说明 185 | ``` 186 | # -O n,-O用来控制数据输出的形式,n表示OID以数值的形式输出 187 | snmpwalk -v2c -c cname -O n ip oid 188 | ``` 189 | 190 | ### zabbix的动态索引 191 | 在监控snmp设备时,采用动态索引,可以极大提高监控的工作效率。 192 | 193 | #### 动态索引的语法 194 | ``` 195 | ["index","",""] 196 | ``` 197 | OID if Data,监控对象的主OID,比如ifOutOctets 198 | 199 | base OID of index,用于查找索引的基础OID,比如ifDescr 200 | 201 | string to search,指定要匹配的字符串,比如GigabitEthernet0/1 202 | 203 | #### 动态索引的原理 204 | 1.根据`base OID if index`和`string to search`获取具体的OID,然后取最后一个数值 205 | 206 | 2.将该数值和OID of Data进行拼接,得到另一个OID 207 | 208 | 3.使用这个OID去获取该监控对象的数据 209 | 210 | 211 | ## zabbix系统内部数据采集 212 | 用于采集和监控zabbix服务器自身的性能数据,不需要安装任何客户端 213 | 214 | ## Zabbix trap 215 | 使用zabbix_sender工具,主动向zabbix服务器发送监控数据,无需安装agent 216 | 217 | 使用这种方式需要注意的是: 218 | 219 | 因为将web配置信息同步到内存cache是按照周期来的(又CacheUpdateFrequency配置项决定,默认60秒),所以可能需要等待一段时间 220 | 221 | ## Zabbix aggregate 222 | 在已有的数据上进行组合,得到更多的数据。无需安装任何工具 223 | 224 | ## External check 225 | 通过脚本采集数据称之为外部检查。 226 | 227 | zabbix服务器根据配置信息,周期的执行ExternalScripts配置项指定的脚本目录下的脚本,然后把脚本的输出结果当做监控项的值(即使脚本执行出错,也会将错误信息当做监控项的值),对zabbix性能影响较大。 228 | 229 | key的格式: 230 | ``` 231 | script_name.sh[arg1,arg2] 232 | # 比如echo_data.sh[{HOST.HOST}] 233 | ``` 234 | 235 | ## Database monitor 236 | 通过ODBC进行数据库的监控 237 | 238 | ## IPMI agent 239 | IPMI,智能平台管理接口,用于监控和采集某些硬件设备的信息,比如CPU温度等。IPMI的优势在于,它独立于CPU和操作系统,在关机状态下,也可以监控,还能远程开启硬件设备。 240 | 241 | IPMI的网络接口,不同厂商有不同的叫法,HP叫iLO,DELL叫DRAC。 242 | 243 | 可以通过ipmitool工具配置IPMI网络和用户参数,也可以现场直接修改服务器的BIOS来设置这些信息。 244 | 245 | ## SSH agent 246 | https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/ssh_checks 247 | 248 | ## TELNET agent 249 | https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/telnet_checks 250 | 251 | ## JMX agent 252 | JMX,JAVA 管理拓展,是一个在不对现有应用做修改的情况下植入到现有应用的框架,用来对应用的运行状态进行监控和管理。 253 | 254 | ### 原理 255 | 1.zabbix服务器根据监控项的配置,定期发送查询请求给zabbix java gateway进程 256 | 257 | 2.zabbix java gateway进程将请求打包成JMX格式的请求,发给被监控主机的JMX服务端口 258 | 259 | 3.zabbix java gateway进程接受来自被监控主机的响应包,之后将响应发给zabbix服务进程 260 | 261 | 4.zabbix服务进程将返回的监控数据保存到数据库相应的监控项里 262 | 263 | ### 配置JMX服务 264 | java程序 265 | ``` 266 | java \ 267 | -Dcom.sun.management.jmxremote \ 268 | -Dcom.sun.management.jmxremote.port=12345 \ 269 | -Dcom.sun.management.jmxremote.authenticate=false \ 270 | -Dcom.sun.management.jmxremote.ssl=false\ 271 | ``` 272 | 273 | java容器(以tomcat为例) 274 | ``` 275 | vim bin/catalina.sh 276 | CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=12345 \ 277 | -Dcom.sun.management.jmxremote.ssl=false \ 278 | -Dcom.sun.management.jmxremote.authenticate=true \ 279 | -Dcom.sun.management.jmxremote.password.file=jmxremote.password \ 280 | -Dcom.sun.management.jmxremote.access.file=jxmremote.access \ 281 | -Djava.rmi.server.hostname=ip" 282 | ``` 283 | password.file默认是当前目录下的jmxremote.password文件,port是JMX服务监听的端口,hostname限制连入的客户端 284 | 285 | jmxremote.password(600) 286 | ``` 287 | monitor monitor@ 288 | admin admin@ 289 | ``` 290 | 291 | jmxremote.access(600) 292 | ``` 293 | monitor readonly 294 | admin readwrite 295 | ``` 296 | 可以通过jconsole工具连入JMX服务 297 | 298 | ### zabbix服务配置 299 | ``` 300 | vim zabbix_server.conf 301 | # 指定JavaGateway的IP 302 | JavaGateway=IP|Hostname 303 | # zabbix服务端和java gateway通信的端口 304 | JavaGatewayPort=Port 305 | # 启动多少个进程和java gateway进程通信 306 | StartJavaPollers=2 307 | ``` 308 | 309 | ### zabbix java gateway配置 310 | ``` 311 | vim zabbix_java_gateway.conf 312 | LISTEN_IP="0.0.0.0" # java gateway监听的IP 313 | 314 | LISTEN_PORT=10052 # java gateway监听的端口 315 | 316 | START_POLLERS=5 # 启动多少个java gateway进程,注意要大于对应的zabbix服务进程 317 | 318 | TIMEOUT=3 # 指定超时时间 319 | ``` 320 | 321 | ### jmx监控项配置 322 | ``` 323 | Key: jmx[,] 324 | ``` 325 | 这里的object_name可以通过jconsole查看,比如java.lang:type=classLoading,attribute_name是classLoading的属性。 326 | 327 | ## Calculated 328 | https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/calculated 329 | 330 | # zabbix server的进程 331 | ## db watchdog 332 | 用于监控zabbix系统数据库状态,当不可用时会发送告警信息 333 | 334 | ## houserkeeper 335 | 管家,定期清理过期的历史数据 336 | 337 | ## alerter 338 | 用来发送告警通知 339 | 340 | ## icmp poller 341 | 定期进行ICMP PING检查 342 | 343 | ## ipmi poller 344 | 定期进行ipmi类型监控项的检查 345 | 346 | ## java poller 347 | 用于轮询java类项目监控 348 | 349 | ## node watcher 350 | 用于在分布式节点中发送历史数据和配置信息 351 | 352 | ## history syncer 353 | 用于写入历史数据 354 | 355 | ## httppoller 356 | 监控web加载时间 357 | 358 | ## poller 359 | 用于被动监控项的轮询 360 | 361 | ## proxy poller 362 | 拥有服务器代理被动轮询 363 | 364 | ## discovery 365 | 自动发现新的主机 366 | 367 | ## trapper 368 | 用于处理主动采集、陷入以及分布式节点间或服务器代理 369 | 370 | ## self-monitoring 371 | 用于搜集zabbix内部的监控数据 372 | 373 | ## unreachable poller 374 | 用于轮询不可到达的设备 375 | 376 | ## vmware collector 377 | 用于从vmware服务进程中搜集数据 378 | 379 | ## configuration syncer 380 | 将配置文件中的配置信息同步到内存缓存(cache)中 381 | 382 | ## timer 383 | 用于处理触发器中与时间相关的函数和维护模式的进程 384 | 385 | ## escalator 386 | 处理action中的步骤升级 387 | 388 | # web配置 389 | ## unsupported items的检测时间间隔 390 | zabbix服务器检测不支持key的时间间隔 391 | 392 | Administrator -> General -> Other -> Refresh unsupported items (in sec) 393 | 默认600秒 394 | 395 | # zabbix调优 396 | ## 调优原则 397 | 1.尽可能单独部署各个组件 398 | 399 | 比如数据库采用配置最好的服务器进行部署,web前端采用一般配置的服务器 400 | 401 | 2.尽可能采用分布式部署 402 | 403 | 3.重点关注数据库服务器 404 | 405 | 4.尽可能统一监控项类型,关闭不需要的进程 406 | 407 | 5.合理的配置数据采集的时间间隔 408 | 409 | 6.规划好模板 410 | 411 | 7.及时处理不支持的监控项和触发器 412 | 413 | 8.合理的使用函数 414 | 415 | 9.合理的选择监控项的数据类型 416 | 417 | 数值类比文本类的性能要好得多 418 | 419 | ## 操作系统层面的优化 420 | 421 | # 低级自动发现 - LLD 422 | ## 流程 423 | 1.创建模板 424 | 425 | 2.基于模板创建自动发现规则 426 | 427 | 3.基于自动发现规则创建item 428 | 429 | 4.主机关联该模板 430 | 431 | ## 支持的自动发现 432 | https://www.zabbix.com/documentation/4.0/zh/manual/discovery/low_level_discovery 433 | 434 | # zabbix中的正则表达式 435 | ## 配置 436 | ![](https://res.cloudinary.com/dkkg9pm0i/image/upload/v1550134093/ops/regex01.png) 437 | 438 | Administrator->General->Select 439 | 440 | ## 说明 441 | zabbix中的正则相当于一个过滤的功能,比如有30个项目,符合正则的就20个,那么最后只保存这20个。 442 | 443 | ## 用法 444 | ``` 445 | @regex 446 | ``` 447 | 448 | ## Expression type 449 | ### Character string included 450 | Expression必须和目标字符串一模一样,结果才为TRUE 451 | 452 | ### Any character string included 453 | 对目标字符串使用指定分隔符分割,分割的对象中有一个匹配Expression,结果为TRUE 454 | 455 | ### Character string included 456 | 不解释 457 | 458 | ### Result is TRUE 459 | 这个才是通常意义上的正则匹配!只要目标字符串匹配Expression,结果为TRUE。 460 | 比如:Expression为[abc],目标字符串为apple,结果为TRUE 461 | 462 | ### Result is FALSE 463 | 不解释 --------------------------------------------------------------------------------