本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 找不到目录, 传送门:Kubernetes 总纲及脑图 Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。 可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。 kubernetes在集群启动之后,会默认创建几个namespace [root@master ~]# kubectl get namespace NAME STATUS AGE default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13开始引入 kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户) kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间 下面来看namespace资源的具体操作: 查看 # 1 查看所有的ns 命令:kubectl get ns [root@master ~]# kubectl get ns NAME STATUS AGE default Active 45h kube-node-lease Active 45h kube-public Active 45h kube-system Active 45h # 2 查看指定的ns 命令:kubectl get ns ns名称 [root@master ~]# kubectl get ns default NAME STATUS AGE default Active 45h # 3 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数 # kubernetes支持的格式有很多,比较常见的是wide、json、yaml [root@master ~]# kubectl get ns default -o yaml apiVersion: v1 kind: Namespace metadata: creationTimestamp: "2020-04-05T04:44:16Z" name: default resourceVersion: "151" selfLink: /api/v1/namespaces/default uid: 7405f73a-e486-43d4-9db6-145f1409f090 spec: finalizers: - kubernetes status: phase: Active # 4 查看ns详情 命令:kubectl describe ns ns名称 [root@master ~]# kubectl describe ns default Name: default Labels: <none> Annotations: <none> Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间 # ResourceQuota 针对namespace做的资源限制 # LimitRange针对namespace中的每个组件做的资源限制 No resource quota.
本章节主要介绍yaml语法和kubernetes的资源管理方式 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。 kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。 Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。 当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。 学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作 YAML语言介绍 YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。 <heima> <age>15</age> <address>Beijing</address> </heima> heima: age: 15 address: Beijing YAML的语法比较简单,主要有下面几个: 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格( 低版本限制 ) 缩进的空格数不重要,只要相同层级的元素左对齐即可 ‘#‘表示注释 YAML支持以下几种数据类型: 纯量:单个的、不可再分的值 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary) 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) # 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期 # 1 布尔类型 c1: true (或者True) # 2 整型 c2: 234 # 3 浮点型 c3: 3.14 # 4 null类型 c4: ~ # 使用~表示null # 5 日期类型 c5: 2018-02-17 # 日期必须使用ISO 8601格式,即yyyy-MM-dd # 6 时间类型 c6: 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 # 7 字符串类型 c7: heima # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 c8: line1 line2 # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格 # 对象 # 形式一(推荐): heima: age: 15 address: Beijing # 形式二(了解): heima: {age: 15,address: Beijing} # 数组 # 形式一(推荐): address: - 顺义 - 昌平 # 形式二(了解): address: [顺义,昌平] 小提示:
kubectl 安装 kind 安装 创建一个集群 查看集群 删除集群 kubernetes 安装比较复杂,用于学习可以搭建单机集群安装。 推荐使用 linux 系统安装实验。 找不到目录, 传送门:Kubernetes 总纲及脑图 kubernetes有多种部署方式,目前主流的方式有kind、kubeadm、minikube、二进制包 kind: 一个基于 Docker 安装的 kubernetes 工具(推荐) minikube:一个用于快速搭建单节点 kubernetes 的工具 kubeadm:一个用于快速搭建 kubernetes 集群的工具 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解 kubernetes 组件更加有效 kubectl 安装 参考: https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux/ kubectl 是 kubernetes 运行命令工具,用于部署应用、监测和管理集群资源以及查看日志。 # 下载安装 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" # 添加权限,复制到/bin下,方便全局使用 chmod +x kubectl mkdir -p ~/.local/bin/kubectl mv ./kubectl ~/.local/bin/kubectl # 验证安装是否成功 kubectl version --client kind 安装 官网:https://kind.sigs.k8s.io/ 下载二进制包,无须其它依赖 https://github.com/kubernetes-sigs/kind/releases
应用部署方式演变 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.