Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job.CronJob 配置文件示例如下: ① batch/v2alpha1 是当前 CronJob 的 apiVersion. ② 指明当前资源的类型为 CronJob. ③ schedule 指定什么时候运行 Job,其格式与 Linux cron 一致.这里 */1 * * * * 的含义是每一分钟启动一次. ④ jobTemplate 定义 Job 的模板,格式与前面…
有时,我们希望能同时运行多个 Pod,提高 Job 的执行效率.这个可以通过 parallelism 设置. 这里我们将并行的 Pod 数量设置为 2,实践一下: Job 一共启动了两个 Pod,而且 AGE 相同,可见是并行运行的. 我们还可以通过 completions 设置 Job 成功完成 Pod 的总数: 上面配置的含义是:每次运行两个 Pod,直到总共有 6 个 Pod 成功完成.实践一下: DESIRED 和 SUCCESSFUL 均为 6,符合预期.如果不指定 completio…
Rexy-Ray 支持多种 backend,上一节我们已经安装配置了 Rex-Ray,今天演示如何配置 VirtualBox backend. 在 VirtualBox 宿主机,即我的笔记本上启动 vboxwebsrv 服务:vboxwebsrv -H 0.0.0.0 执行如下命令关闭 VirtualBox 的登录认证:VBoxManage setproperty websrvauthlibrary null 在关机状态下修改虚拟机 docker1 和 docker2 的 Storage 配置:…
前面我们安装部署了 Rex-Ray,并且成功配置 VirtualBox backend,今天演示如何创建和使用 Rex-Ray volume. 在 docker1 或 docker2 上执行如下命令创建 volume: docker volume create --driver rexray --name=mysqldata --opt=size=2 volume mysqldata 创建成功,大小为 2GB.在 VirtualBox 宿主机中也能看到 mysqldata. 因为 Virtual…
上一节我们在 docker1 上的 MySQL 容器中使用了 Rex-Ray volume mysqldata,更新了数据库.现在容器已经删除,今天将演示在 docker2 中重新使用这个卷. 在 dokcer2 上执行如下命令,启动 MySQL 容器: docker run --name mydb_on_docker2 -v mysqldata:/var/lib/mysql -d mysql 新容器也使用相同的卷 mysqldata,不过这次不需要指定环境变量 MYSQL_ROOT_PASSW…
当 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…
上一节介绍了 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…
前面我们已经介绍了ps/top/stats.Sysdig.Weave Scope.cAdvisor 和 Prometheus 多种容器监控工具和方案,是时候做一个比较了.下面将从五个方面来对比它们之间的优劣. 部署容易度 ps/top/stats 无疑是最容易使用的,它们是 Docker 自带的子命令,随时随地都可以用来快速了解容器的状态.其余几种也都能以容器的方式运行,总的来说都不算复杂.相对而言,Prometheus 涉及的组件比较多,搭建整个方案需要运行的容器数量也要多些,部署和管理的难道…
高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需要 debug 问题时有些容器可能已经不存在了.因此,一套集中式的日志管理系统是生产环境中不可或缺的组成部分. 本章我们将讨论监控容器的各种可用技术和方案,首先会介绍 Docker 自带的 logs 子命令,然后讨论 Docker 的 logging driver,接下来通过实践学习几个已经广泛应用…
从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群.所以先来讨论一个重要的概念 - 集群化(Clustering). 服务器集群由一组网络上相互连接的服务器组成,它们一起协同工作.一个集群和一堆服务器最显著的区别在于: 集群能够像 单个 系统那样工作,同时提供高可用.负载均衡和并行处理. 如果我们部署应用和服务时选择的是多个独立的服务器而非集群,资源的整体利用率则很难达到最优,因为我们无法提前知道如何分布这些应用才能达到资源利用的最大化.而且,应用使用资源的趋势是…
本节我们将创建三节点的 swarm 集群. swarm-manager 是 manager node,swarm-worker1 和 swarm-worker2 是 worker node. 所有节点的 Docker 版本均不低于 v1.12.我们的实验环境 node 的操作系统为 Ubuntu 16.04,当然其他 Linux 也是可以的. 在 swarm-manager 上执行如下命令创建 swarm. docker swarm init --advertise-addr 192.168.5…
上一节我们创建好了 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_…
上一节部署了只有一个副本的 Service,不过对于 web 服务,我们通常会运行多个实例.这样可以负载均衡,同时也能提供高可用. swarm 要实现这个目标非常简单,增加 service 的副本数就可以了.在 swarm-manager 上执行如下命令: docker service scale web_server=5 副本数增加到 5,通过 docker service ls 和 docker service ps 查看副本的详细信息. 5 个副本已经分布在 swarm 的所有三个节点上.…
前面我们已经学习了如何部署 service,也验证了 swarm 的 failover 特性.不过截止到现在,有一个重要问题还没有涉及:如何访问 service?这就是本节要讨论的问题. 为了便于分析,我们重新部署 web_server. ① docker service rm 删除 web_server,service 的所有副本(容器)都会被删除. ② 重新创建 service,这次直接用 --replicas=2 创建两个副本. ③ 每个 worker node 上运行了一个副本. 好了,…
微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 service 运行了若干容器.在这样的架构中,service 之间是必然要通信的. 服务发现 一种实现方法是将所有 service 都 publish 出去,然后通过 routing mesh 访问.但明显的缺点是把 memcached 和 mysql 也暴露到外网,增加了安全隐患. 如果不 p…
在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本. 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务.同时,在更新的过程中,总是有副本在运行的,因此也保证了业务的连续性. 下面我们将部署三副本的服务,镜像使用 httpd:2.2.31,然后将其更新到 httpd:2.2.32. 创建服务: docker service create --name my_web --replicas=3 httpd:2.2.31 将 serv…
service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一:打包在容器里. 显然不行.除非数据不会发生变化,否则,如何在多个副本直接保持同步呢? 选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里. 位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢? 选项三:利用 Docker 的 volum…
容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 Dockerfile 中的 CMD 或 ENTRYPOINT 启动一个进程,这个进程的状态就是 docker ps STATUS 列显示容器的状态.   命令显示: 有的容器正在运行,状态为 UP. 有的容器已经正常停止了,状态是 Exited (0). 有的则因发生故障停止了,退出代码为非 0,例…
什么是 stack ?在回答这个问题之前我们先回忆一下前面部署 WordPress 应用的过程: 首先创建 secret. 然后创建 MySQL service,这是 WordPress 依赖的服务. 最后创建 WordPress service. 也就是说,这个应用包含了两个 service:MySQL 和 WordPress,它们之间有明确的依赖关系,必须先启动 MySQL. 为了保证这个依赖关系,我们控制了 docker secret 和 docker service 命令的执行顺序,只不…
定义好了 stack YAML 文件,就可以通过 docker stack deploy 命令部署应用. Docker 会按照 YAML 的内容来创建各种资源.为了不重名,所有资源都会加上 stack 名称作为前缀,我们这里是 wpstack_*. 部署完成后可以通过相关命令查看各种资源的状态.   如果想更新 stack 的某些属性,直接修改 YAML 文件,然后重新部署.比如将 WordPress 的端口由 8000 改为 8888. 再次执行 docker stack deploy 命令.…
stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,stack 有明显的优势. YAML 描述的是 What,是 stack 最终要达到的状态.比如 service 有几个副本?使用哪个 image?映射的端口是什么?而脚本则是描述如何执行命令来达到这个状态,也就是 How.显而易见,What 更直观,也更容易理解.至于如何将 What 翻译成 How,这就是 Docker swarm…
据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数量的容器和工作负载.在积累了这么多年的经验后,Google 决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益. 这个项目就是 Kubernetes.简单的讲,Kubernetes 是 Google Omega 的开源版本. 从 2014 年第一个版本发布以来,Kubernetes 迅…
本节带领大家快速体验 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. k8s-master 是 Master,k8s-node1 和 k8s-node2 是 Node. 所有节点的操作系统均为 Ubuntu 16.04,当然其他 Linux 也是可以的. 官方安装文档可以参考 https://kubernetes.io/docs/setup/independent/install-kubeadm/ 注意:Kubernetes 几乎所有的安装组件和 Docker 镜像都放在 goolge 自己的网站上,这…
上节我们通过 kubeadm 在 k8s-master 上部署了 Kubernetes,本节安装 Pod 网络并添加 k8s-node1 和 k8s-node2,完成集群部署. 安装 Pod 网络 要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信. Kubernetes 支持多种网络方案,这里我们先使用 flannel,后面还会讨论 Canal. 执行如下命令部署 flannel: kubectl apply -f https://raw.…
上一节我们讨论了 Kubernetes 架构 Master 上运行的服务,本节讨论 Node 节点. Node 是 Pod 运行的地方,Kubernetes 支持 Docker.rkt 等容器 Runtime. Node上运行的 Kubernetes 组件有 kubelet.kube-proxy 和 Pod 网络(例如 flannel). kubelet kubelet 是 Node 的 agent,当 Scheduler 确定在某个 Node 上运行 Pod 后,会将 Pod 的具体配置信息(…
为了帮助大家更好地理解 Kubernetes 架构,我们部署一个应用来演示各个组件之间是如何协作的. 执行命令 kubectl run httpd-app --image=httpd --replicas=2 等待一段时间,应用部署完成. Kubernetes 部署了 deployment httpd-app,有两个副本 Pod,分别运行在 k8s-node1 和 k8s-node2. 详细讨论整个部署过程. ① kubectl 发送部署请求到 API Server. ② API Server…