从本章开始,我们将通过实践深入学习 Kubernetes 的各种特性.作为容器编排引擎,最重要也是最基本的功能当然是运行容器化应用,这就是本章的内容. Deployment 前面我们已经了解到,Kubernetes 通过各种 Controller 来管理 Pod 的生命周期.为了满足不同业务场景,Kubernetes 开发了 Deployment.ReplicaSet.DaemonSet.StatefuleSet.Job 等多种 Controller.我们首先学习最常用的 Deployment.…
容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容器就退出. Kubernetes 的 Deployment.ReplicaSet 和 DaemonSet 都用于管理服务类容器:对于工作类容器,我们用 Job. 先看一个简单的 Job 配置文件 myjob.yml: ① batch/v1 是当前 Job 的 apiVersion. ② 指明当前资源…
上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd 部署 service 的命令形式与运行容器的 docker run 很相似,--name 为 service 命名,httpd 为镜像的名字. 通过 docker service ls 可以查看当前 swarm 中的 service. REPLICAS 显示当前副本信息,0/1 的意思是 web_…
既然要用 YAML 配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常类似. 还是以 nginx-deployment 为例,配置文件如下图所示: ① apiVersion 是当前配置格式的版本.② kind 是要创建的资源类型,这里是 Deployment.③ metadata 是该资源的元数据,name 是必需的元数据项.④ spec 部分是该 Deployment 的规格说明.⑤ replicas 指明副本…
伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数.Deployment nginx-deployment 初始是两个副本. k8s-node1 和 k8s-node2 上各跑了一个副本.现在修改 nginx.yml,将副本改成 5 个. 再次执行 kubectl apply: 三个新副本被创建并调度到 k8s-node1 和 k8s-node2 上. 出于安全考虑,默认配置下 Kubernetes 不会将 Pod 调度到 Master 节点.如果希望将 k8s-master…
本节以 Prometheus Node Exporter 为例演示如何运行自己的 DaemonSet. Prometheus 是流行的系统监控方案,Node Exporter 是 Prometheus 的 agent,以 Daemon 的形式运行在每个被监控节点上. 如果是直接在 Docker 中运行 Node Exporter 容器,命令为: docker run -d \ -v "/proc:/host/proc" \ -v "/sys:/host/sys" \…
本节带领大家快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新. 部署应用 执行命令: kubectl run kubernetes-bootcamp \ --image=docker.io/jocatalin/kubernetes-bootcamp:v1 \ --port=8080 这里我们通过 kubectl run 部署了一个应用,命名为 kubernetes-bootcamp. Docker 镜像通过 --image 指定. --port 设置应用对外…
在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用. Master Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行.Master 运行 Linux 操作系统,可以是物理机或者虚拟机.为了实现高可用,可以运行多个 Master. Node Node 的职责是运行容器应用.Node 由…
Kubernetes Cluster 由 Master 和 Node 组成,节点上运行着若干 Kubernetes 服务. Master 节点 Master 是 Kubernetes Cluster 的大脑,运行着如下 Daemon 服务:kube-apiserver.kube-scheduler.kube-controller-manager.etcd 和 Pod 网络(例如 flannel). API Server(kube-apiserver) API Server 提供 HTTP/HTT…
为了帮助大家更好地理解 Kubernetes 架构,我们部署一个应用来演示各个组件之间是如何协作的. 执行命令 kubectl run httpd-app --image=httpd --replicas=2 等待一段时间,应用部署完成. Kubernetes 部署了 deployment httpd-app,有两个副本 Pod,分别运行在 k8s-node1 和 k8s-node2. 详细讨论整个部署过程. ① kubectl 发送部署请求到 API Server. ② API Server…
默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node.不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node:或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上. Kubernetes 是通过 label 来实现这个功能的. label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性.比如执行如下命令标注 k8s-node1 是配置了 SSD 的节点. k…
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonSet 的典型应用场景有: 在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph. 在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash. 在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 coll…
本节详细分析两个 k8s 自己的 DaemonSet:kube-flannel-ds 和 kube-proxy . kube-flannel-ds 下面我们通过分析 kube-flannel-ds 来学习 DaemonSet. 还记得之前是如何部署 flannel 网络的吗?我们执行了如下两个命令: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel…
Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job.CronJob 配置文件示例如下: ① batch/v2alpha1 是当前 CronJob 的 apiVersion. ② 指明当前资源的类型为 CronJob. ③ schedule 指定什么时候运行 Job,其格式与 Linux cron 一致.这里 */1 * * * * 的含义是每一分钟启动一次. ④ jobTemplate 定义 Job 的模板,格式与前面…
本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性.换句话说,Pod 是脆弱的,但应用是健壮的. 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod 对外提供服务(比如…
滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用,初始镜像为 httpd:2.2.31,然后将其更新到 httpd:2.2.32. httpd:2.2.31 的配置文件如下: 通过 kubectl apply 部署. 部署过程如下: 创建 Deployment httpd 创建 ReplicaSet httpd-551879778 创建三个 Pod 当前…
本节我们将安装和部署 Helm 客户端和 Tiller 服务器. Helm 客户端 通常,我们将 Helm 客户端安装在能够执行 kubectl 命令的节点上,只需要下面一条命令: curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash 执行 helm version 验证. 目前只能查看到客户端的版本,服务器还没有安装. helm 有很多子命令和参数,为了提高使用命令行的效率,通常建议安装…
Kubernetes 开发了一个 Elasticsearch 附加组件来实现集群的日志管理.这是一个 Elasticsearch.Fluentd 和 Kibana 的组合.Elasticsearch 是一个搜索引擎,负责存储日志并提供查询接口:Fluentd 负责从 Kubernetes 搜集日志并发送给 Elasticsearch:Kibana 提供了一个 Web GUI,用户可以浏览和搜索存储在 Elasticsearch 中的日志. 部署 Elasticsearch 附加组件本身会作为 K…
本节在实践时使用的是 Prometheus Operator 版本 v0.14.0.由于项目开发迭代速度很快,部署方法可能会更新,必要时请参考官方文档. 下载最新源码 git clone https://github.com/coreos/prometheus-operator.git cd prometheus-operator 为方便管理,创建一个单独的 Namespace monitoring,Prometheus Operator 相关的组件都会部署到这个 Namespace. kube…
本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheus 架构 Prometheus 是一个非常优秀的监控工具.准确的说,应该是监控方案.Prometheus 提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.Prometheus 的架构如下图所示: 官网上的原始架构图比上面这张要复杂一些,为了避免注意力分散,这里只保留了最重要的组件. Pr…
前面我们介绍了 Kubernetes 的两种监控方案 Weave Scope 和 Heapster,它们主要的监控对象是 Node 和 Pod.这些数据对 Kubernetes 运维人员是必须的,但还不够.我们通常还希望监控集群本身的运行状态,比如 Kubernetes 的 API Server.Scheduler.Controller Manager 等管理组件是否正常工作,负荷是否过大等? 本节我们将学习监控方案 Prometheus Operator,它能回答上面这些问题. Prometh…
创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其职,有足够的资源满足应用的需求.Kubernetes 是一个复杂系统,运维团队需要有一套工具帮助他们获知集群的实时状态,并为故障排查提供及时和准确的数据支持. 本章重点讨论 Kubernetes 常用的监控方案,下一章会讨论日志管理. Weave Scope Weave Scope 是 Docker 和 Kubernetes 可视化监控工具.Scope 提供了至上而下的集群…
Rex-Ray 是一个优秀的 Docker volume driver,本节将演示其安装和配置方法. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很简单,在需要使用 Rex-Ray driver 的主机 docker1 和 docker2 上运行如下命令: curl -sSL https://dl.bintray.com/emccode/rexray/install | sh - 然后创建并编辑 Rex-Ray 的配置文件 /etc/rexray/c…
Rexy-Ray 支持多种 backend,上一节我们已经安装配置了 Rex-Ray,今天演示如何配置 VirtualBox backend. 在 VirtualBox 宿主机,即我的笔记本上启动 vboxwebsrv 服务:vboxwebsrv -H 0.0.0.0 执行如下命令关闭 VirtualBox 的登录认证:VBoxManage setproperty websrvauthlibrary null 在关机状态下修改虚拟机 docker1 和 docker2 的 Storage 配置:…
当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. 在本章中,我们将讨论几个目前比较常用的容器监控工具和方案,为大家构建自己的监控系统提供参考. 首先我们会讨论 Docker 自带的几个监控子命令:ps, top 和 stats.然后是几个功能更强的开源监控工具 sysdig, Weave Scope, cAdvisor 和 Prometheus.最后我们会对这些不同的工具和方案做一个比较. Docker 自带的监控子命令 ps docker conta…
Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解.监控和控制容器.千言万语不及一张图,先感受一下. 下面开始实践 Weave Scope. 安装 执行如下脚本安装运行 Weave Scope. curl -L git.io/scope -o /usr/local/bin/scope chmod a+x /usr/local/bin/scope scope launch scope launch 将以容器方式启动 Weave Scope. 根据提示,…
除了监控容器,Weave Scope 还可以监控 Docker Host. 点击顶部 HOSTS 菜单项,地图将显示当前 host. 与容器类似,点击该 host 图标将显示详细信息. host 当前的资源使用情况和历史曲线一览无余.除此之外也能很方便地查看 host 上运行的进程和容器列表,点击容器名字还可以打开此容器的信息页面. host 页面上部有一个按钮,点击可直接打开 host 的 shell 窗口,这个远程管理功能真的很贴心. 多主机监控 前面我们已经领略了 Weave Scope…
cAdvisor 是 google 开发的容器监控工具,我们来看看 cAdvisor 有什么能耐. 在 host 中运行 cAdvisor 容器. docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true…
本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usage_bytes_webapp1 来记录 webapp1 的内存使用数据.假如每1分钟取一次样,那么在数据库里就会有类似下面的记录. 好,现在需求发生了点变化,我们需要知道所有 webapp 容器的内存使用情况.如果还是采用前面的方法,就不得不增加新的指标 container_memory_usage…
上一节介绍了 Prometheus 的核心,多维数据模型.本节演示如何快速搭建 Prometheus 监控系统. 环境说明 我们将通过 Prometheus 监控两台 Docker Host:192.168.56.102 和 192.168.56.103,监控 host 和容器两个层次的数据. 按照架构图,我们需要运行如下组件: Prometheus Server Prometheus Server 本身也将以容器的方式运行在 host 192.168.56.103 上. Exporter Pr…