应用部署方式演变 kubernetes简介 kubernetes组件 kubernetes概念 参考 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。
找不到目录, 传送门:Kubernetes 总纲及脑图
应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代:
传统部署:互联网早期,会直接将应用程序部署在物理机上
优点:简单,不需要其它技术的参与
缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响
虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
优点:程序环境不会相互产生影响,提供了一定程度的安全性
缺点:增加了操作系统,浪费了部分资源
容器化部署:与虚拟化类似,但是共享了操作系统
优点:
可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等
运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器 当并发访问量变大的时候,怎么样做到横向扩展容器数量 这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
Swarm:Docker自己的容器编排工具 Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用 Kubernetes:Google开源的的容器编排工具 kubernetes简介
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器 Borg 系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整 服务发现:服务可以通过自动发现的形式找到它所依赖的服务 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本 存储编排:可以根据容器自身的需求自动创建存储卷 kubernetes组件 一个kubernetes集群主要是由 控制节点(master)、工作节点(node) 构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd:负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡关于作者 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~收录极好的Golang库及框架,也是本人使用过,认为不错的。分享给大家。
框架类 名称 网址 Gin Web 框架 https://github.com/gin-gonic/gin Colly 爬虫框架 https://github.com/gocolly/colly 工具类 名称 网址 Gjson 动态获取JSON https://github.com/tidwall/gjson Sjson 动态设置JSON https://github.com/tidwall/sjson 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~node_exporter 安装 监控远程 linux 服务器CPU、内存、磁盘、I/O等信息
下载慢,请查看软件下载列表
https://prometheus.io/download/
cd /usr/local/src
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar -zxvf node_exporter-1.0.1.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv node_exporter-1.0.1.linux-amd64 node_exporter
cd node_exporter 运行 先创建 systemd 服务
cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
KillMode=process
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF 刷新 systemd && 运行 && 查看
systemctl daemon-reload # 刷新 systemd 配置
systemctl enable node_exporter # 加入开机启动
systemctl start node_exporter # 启动服务 systemctl status node_exporter # 查看详情 预览 http://192..1. 安装 .1.1. 下载 .1.2. 运行 .1.3. 预览 .1.4. nginx 反向代理 .2. Docker 安装 .3. 关于作者 .1. 安装 .1.1. 下载 prometheus提供二进制,直接解压即可用.由 go 编写
官网下载: https://prometheus.io/download/
Centos 64x 选择下载 *linux-amd64.tar.gz
wget -c https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.darwin-amd64.tar.gz tar -xvf prometheus-2.18.1.darwin-amd64.tar.gz -C /usr/local/ .1.2. 运行 创建 systemd 服务
--config.file 配置文件 --storage.tsdb.retention 数据保留多少天 --query.max-concurrency 最大并发数 --storage.tsdb.path 数据存储位置 --web.max-connections 最大连接数 cat > /usr/lib/systemd/system/prometheus.service << EOF [Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple ExecStart=/usr/local/prometheus/prometheus \\ --config.file=/usr/local/prometheus/prometheus.yml \\ --web.read-timeout=5m \\ --web.再述 SOLID 原则,因为这些原则是设计模式的基石,所有的模式都是基于这些原则展开的。
单一职责原则 经典定义:应该有且仅有一个原因引起”类“的变更。(不仅仅适应于类,还适应于方法,接口,函数等)
好处:
类的复杂性降低,实现什么职责都有清晰的定义。 可读性提高,复杂性降低,那当然可读性提高了。 可维护性提高,可读性提高,那当然更容易维护了。 变更引 起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。 一句话:单一职责原则,最重要做到单一职责,类的设计尽量做到只有一个原因引起变化。
里氏替换原则 经典定义:父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常。使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行,有子类出现的地方,父类未必能适应。
继承即有优点与有缺点,为了平衡引入里氏替换原则。
继承的优点:
代码共享,减少创建类的工作量。 提高代码的重用性。 子类可以形似父类,但又异于父类。 提高代码的可扩展性。 提高产品或项目的开放性。 继承的缺点:
继承是侵入性的。 降低代码的灵活性。 增强了耦合性。 一句话:父类出现的地方子类就可以出现且无异常。反之不行。
依赖倒置原则 经典定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节。细节应该依赖抽象。
每一个逻辑的实现都是由原子逻辑组成的,不可以分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。
抽象是指接口或抽象类,两者都是不能直接被实例化的。
细节就是实现类,实现接口或继承抽象而产生的类就是细节。
优点:
减少类间的耦合性。 易于扩展 依赖的三种写法:
构造函数传递依赖对象。 Setter 方法传递依赖对象。 接口声明依赖对象即依赖注入。 一句话:面向接口编程。
接口隔离原则 经典定义:客户端不应该依赖它不需要的接口。或类间依赖关系应该建立在最小的接口上。
接口要尽量小。 接口要高内聚。 定制服务 。 接口设计是有限度的。 接口的设计粒度越小,系统越灵活 一句话:接口尽量细化,同时接口中的方法尽量少。
迪米特法则 经典定义:一个对象应该对其他对象有最少的了解。
只与直接的朋友通信。 朋友间也是有距离的。 尽量不要对外公布太多的 public 方法和非静态的 public 变量。 多使用 private 权限。 是自己的就是自己的。 如果一个方法放在本类中,即不增加类间的关系,也对本类不产生负面影响,那就放置在本类中。 谨慎使用 Serializable 一句话:一个对象应该对自己需要耦合或调用的类知道得最少。
开闭原则 开闭原则是最基础的一个原则。也是前五个原则的精神领袖。
经典定义:对修改关闭,对扩展开放。php 环境需要与 nginx 配合安装,共享 nginx 解析的目录(www)
基本参数 -d 后台启动 --name 定义一个别名 -v 挂载目录 --link 链接其它 docker 容器名称 安装 php 即安装 php-fpm 环境
docker search php
docker run --name dev-phpfpm -v /d/local/nginx/www:/www -d php:5.6-fpm /d/local/nginx/www 这里必须是 nginx 解析的目录,也就是与 nginx 共享目录。 安装 nginx ro 表示只读权限
docker run --name dev-nginx-php -p 8080:80 -d -v /d/local/nginx/www:/usr/share/nginx/html:ro -v /d/local/nginx/conf.d:/etc/nginx/conf.d:ro --link dev-phpfpm:php nginx /d/local/nginx/www , /d/local/nginx/conf.d是宿主机的目录,可以自定义。 /usr/share/nginx/html, /etc/nginx/conf.d 是 nginx 里的固定目录,不能更改。 --link dev-phpfpm:php 是链接上面的 php 容器,dev-phpfpm是别名,php 是php容器 修改nginx配置文件 /d/local/nginx/conf.下载镜像 docker search redis docker pull redis # 下载最新的 redis 安装脚本 #!/bin/bash ################ # DOCKER 创建 Redis 实例 # ################ name=$1 # Docker 名称 home=$2 # 安装目录 port=6379 # 端口号 host="0.0.0.0" # 绑定HOST password="123456" # 密码 # docker 名称必须输入 if test -z $name; then echo "docker name is null" exit 0 fi # 未设置安装目录则默认 /data/docker if test -z $home;then home=/data/docker/ fi # redis 存储目录 redis_home="${home}redis/" # 持久化存储目录 append_home="${redis_home}data/" # 配置存储目录 conf_home="${redis_home}conf/" # 配置文件名 conf_filename="${conf_home}redis.systemd 脚本 #!/bin/bash project_name="mygo" project_path="/data/backend/" exec_path="${project_path}${project_name}" cat > /lib/systemd/system/${project_name}.service << EOF [Unit] Description=mygo systemd Documentation=https://yezihack.github.io After=network.target [Service] Type=simple User=root # 启动命令 ExecStart=${exec_path} # 重启命令 ExecReload=/bin/kill -SIGINT # 环境变量 Environment="SGFOOT_ENV=pro" Environment="SGFOOT_PATH=/data/conf" KillMode=process Restart=on-failure RestartSec=3s [Install] WantedBy=multi-user.targe EOF 管理 systemctl daemon-reload # 更新配置 systemctl start mygo # 启动 systemctl stop mygo # 停止 systemctl restart mygo # 重启 systemctl enable mygo # 加入开机启动 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~启动 使用上下键选择不同的内核(可能有些机器就只有一个内核) 选中内核后,按e 键进入编辑状态 编辑 以下内容都是可以编辑,添加或删除的代码。(谨慎操作) 找到linux16的字符串, 然后再在本行中找到ro的字母,将其替换成rw init=/sysroot/bin/sh 然后按ctrl+x组合键,系统进入emergency(紧急情况)模式 chroot /sysroot/ # 切换回原始系统 LANG=en # 如果出现方块,不是字母的情况下设置成英文语言 passwd root # 对 root 修改密码 touch /.autorelabel # 使SELinux生效,密码生效 exit # 退出 reboot # 重启命令 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~