类似推荐
编辑推荐
Kubernetes容器编排系统实践:分布式应用部署与管理
内容简介
Kubernetes容器编排系统,能帮助我们妥善地管理分布式应用的部署结构和线上流量,高效地组织容器和服务。Kubernetes作为数据中心操作系统,在我们设计软件系统时,能尽量降低我们在底层网络和硬件设施上的心理负担。本书旨在教会读者如何在Kubernetes上部署分布式容器应用。本书开始部分概要介绍了Docker和Kubernetes的由来和发展,然后通过在Kubernetes里部署一个应用程序,并不断为其增加功能,逐步加深读者对于Kubernetes架构的理解,提升读者的实践能力。在本书的其余部分,读者也可以学习到诸如监控、调试及伸缩等方面的一些高阶主题。
作者简介
Marko Luksa是一位拥有20年以上专业开发经验的软件工程师,经手项目小到简单的Web应用,大到ERP系统、框架和中间件软件,应有尽有。在为Red Hat工作期间,他从Google App Engine API实现的开发起步, 这些API将基于Red Hat的JBoss中间件产品,之后他一直在为CDI/Weld、Infinispan/JBoss DataGrid等项目贡献力量。2014后, 他加入Red Hat的Cloud Enablement团队,负责 Kubernetes和相关技术开发的更新,保障公司的中间件软件能将Kubernetes与OpenShift特性的潜能用到极致。
译者简介
七牛容器云 (KIRK)团队,是负责七牛云基于自身公有云业务在容器方面的多年实践经验,针对企业应用快速部署、便捷运维打造的容器云计算平台。提供持续集成、弹性伸缩、应用市场等功能特性,使企业专注于业务逻辑开发,缩短业务上线周期,优化资源利用率,提高服务响应效率的一支技术团队。
章节目录
版权信息
内容简介
推荐序
译者序
前言
致谢
关于本书
关于作者
关于封面插画
1 Kubernetes介绍
1.1 Kubernetes系统的需求
1.1.1 从单体应用到微服务
1.1.2 为应用程序提供一个一致的环境
1.1.3 迈向持续交付:DevOps和无运维
1.2 介绍容器技术
1.2.1 什么是容器
1.2.2 Docker容器平台介绍
1.2.3 rkt——一个Docker的替代方案
1.3 Kubernetes介绍
1.3.1 初衷
1.3.2 深入浅出地了解Kubernetes
1.3.3 Kubernetes集群架构
1.3.4 在Kubernetes中运行应用
1.3.5 使用Kubernetes的好处
1.4 本章小结
2 开始使用Kubernetes和Docker
2.1 创建、运行及共享容器镜像
2.1.1 安装Docker并运行Hello World容器
2.1.2 创建一个简单的Node.js应用
2.1.3 为镜像创建Dockerfile
2.1.4 构建容器镜像
2.1.5 运行容器镜像
2.1.6 探索运行容器的内部
2.1.7 停止和删除容器
2.1.8 向镜像仓库推送镜像
2.2 配置Kubernetes集群
2.2.1 用Minikube运行一个本地单节点Kubernetes集群
2.2.2 使用Google Kubernetes Engine托管Kubernetes集群
2.2.3 为kubectl配置别名和命令行补齐
2.3 在Kubernetes上运行第一个应用
2.3.1 部署Node.js应用
2.3.2 访问Web应用
2.3.3 系统的逻辑部分
2.3.4 水平伸缩应用
2.3.5 查看应用运行在哪个节点上
2.3.6 介绍Kubernetes dashboard
2.4 本章小结
3 pod:运行于Kubernetes中的容器
3.1 介绍pod
3.1.1 为何需要pod
3.1.2 了解pod
3.1.3 通过pod合理管理容器
3.2 以YAML或JSON描述文件创建pod
3.2.1 检查现有pod的YAML描述文件
3.2.2 为pod创建一个简单的YAML描述文件
3.2.3 使用kubectl create来创建pod
3.2.4 查看应用程序日志
3.2.5 向pod发送请求
3.3 使用标签组织pod
3.3.1 介绍标签
3.3.2 创建pod时指定标签
3.3.3 修改现有pod的标签
3.4 通过标签选择器列出pod子集
3.4.1 使用标签选择器列出pod
3.4.2 在标签选择器中使用多个条件
3.5 使用标签和选择器来约束pod调度
3.5.1 使用标签分类工作节点
3.5.2 将pod调度到特定节点
3.5.3 调度到一个特定节点
3.6 注解pod
3.6.1 查找对象的注解
3.6.2 添加和修改注解
3.7 使用命名空间对资源进行分组
3.7.1 了解对命名空间的需求
3.7.2 发现其他命名空间及其pod
3.7.3 创建一个命名空间
3.7.4 管理其他命名空间中的对象
3.7.5 命名空间提供的隔离
3.8 停止和移除pod
3.8.1 按名称删除pod
3.8.2 使用标签选择器删除pod
3.8.3 通过删除整个命名空间来删除pod
3.8.4 删除命名空间中的所有pod,但保留命名空间
3.8.5 删除命名空间中的(几乎)所有资源
3.9 本章小结
4 副本机制和其他控制器:部署托管的pod
4.1 保持pod健康
4.1.1 介绍存活探针
4.1.2 创建基于HTTP的存活探针
4.1.3 使用存活探针
4.1.4 配置存活探针的附加属性
4.1.5 创建有效的存活探针
4.2 了解ReplicationController
4.2.1 ReplicationController的操作
4.2.2 创建一个ReplicationController
4.2.3 使用ReplicationController
4.2.4 将pod移入或移出ReplicationController的作用域
4.2.5 修改pod模板
4.2.6 水平缩放pod
4.2.7 删除一个ReplicationController
4.3 使用ReplicaSet而不是ReplicationController
4.3.1 比较ReplicaSet和ReplicationController
4.3.2 定义ReplicaSet
4.3.3 创建和检查ReplicaSet
4.3.4 使用ReplicaSet的更富表达力的标签选择器
4.3.5 ReplicaSet小结
4.4 使用DaemonSet在每个节点上运行一个pod
4.4.1 使用DaemonSet在每个节点上运行一个pod
4.4.2 使用DaemonSet只在特定的节点上运行pod
4.5 运行执行单个任务的pod
4.5.1 介绍Job资源
4.5.2 定义Job资源
4.5.3 看Job运行一个pod
4.5.4 在Job中运行多个pod实例
4.5.5 限制Job pod完成任务的时间
4.6 安排Job定期运行或在将来运行一次
4.6.1 创建一个CronJob
4.6.2 了解计划任务的运行方式
4.7 本章小结
5 服务:让客户端发现pod并与之通信
5.1 介绍服务
5.1.1 创建服务
5.1.2 服务发现
5.2 连接集群外部的服务
5.2.1 介绍服务endpoint
5.2.2 手动配置服务的endpoint
5.2.3 为外部服务创建别名
5.3 将服务暴露给外部客户端
5.3.1 使用NodePort类型的服务
5.3.2 通过负载均衡器将服务暴露出来
5.3.3 了解外部连接的特性
5.4 通过Ingress暴露服务
5.4.1 创建Ingress资源
5.4.2 通过Ingress访问服务
5.4.3 通过相同的Ingress暴露多个服务
5.4.4 配置Ingress处理TLS传输
5.5 pod就绪后发出信号
5.5.1 介绍就绪探针
5.5.2 向pod添加就绪探针
5.5.3 了解就绪探针的实际作用
5.6 使用headless服务来发现独立的pod
5.6.1 创建headless服务
5.6.2 通过DNS发现pod
5.6.3 发现所有的pod——包括未就绪的pod
5.7 排除服务故障
5.8 本章小结
6 卷:将磁盘挂载到容器
6.1 介绍卷
6.1.1 卷的应用示例
6.1.2 介绍可用的卷类型
6.2 通过卷在容器之间共享数据
6.2.1 使用emptyDir卷
6.2.2 使用Git仓库作为存储卷
6.3 访问工作节点文件系统上的文件
6.3.1 介绍hostPath卷
6.3.2 检查使用hostPath卷的系统pod
6.4 使用持久化存储
6.4.1 使用GCE持久磁盘作为pod存储卷
6.4.2 通过底层持久化存储使用其他类型的卷
6.5 从底层存储技术解耦pod
6.5.1 介绍持久卷和持久卷声明
6.5.2 创建持久卷
6.5.3 通过创建持久卷声明来获取持久卷
6.5.4 在pod中使用持久卷声明
6.5.5 了解使用持久卷和持久卷声明的好处
6.5.6 回收持久卷
6.6 持久卷的动态卷配置
6.6.1 通过StorageClass资源定义可用存储类型
6.6.2 请求持久卷声明中的存储类
6.6.3 不指定存储类的动态配置
6.7 本章小结
7 ConfigMap和Secret:配置应用程序
7.1 配置容器化应用程序
7.2 向容器传递命令行参数
7.2.1 在Docker中定义命令与参数
7.2.2 在Kubernetes中覆盖命令和参数
7.3 为容器设置环境变量
7.3.1 在容器定义中指定环境变量
7.3.2 在环境变量值中引用其他环境变量
7.3.3 了解硬编码环境变量的不足之处
7.4 利用ConfigMap解耦配置
7.4.1 ConfigMap介绍
7.4.2 创建ConfigMap
7.4.3 给容器传递ConfigMap条目作为环境变量
7.4.4 一次性传递ConfigMap的所有条目作为环境变量
7.4.5 传递ConfigMap条目作为命令行参数
7.4.6 使用configMap卷将条目暴露为文件
7.4.7 更新应用配置且不重启应用程序
7.5 使用Secret给容器传递敏感数据
7.5.1 介绍Secret
7.5.2 默认令牌Secret介绍
7.5.3 创建Secret
7.5.4 对比ConfigMap与Secret
7.5.5 在pod中使用Secret
7.6 本章小结
8 从应用访问pod元数据以及其他资源
8.1 通过Downward API传递元数据
8.1.1 了解可用的元数据
8.1.2 通过环境变量暴露元数据
8.1.3 通过downwardAPI卷来传递元数据
8.2 与Kubernetes API服务器交互
8.2.1 探究Kubernetes REST API
8.2.2 从pod内部与API服务器进行交互
8.2.3 通过ambassador容器简化与API服务器的交互
8.2.4 使用客户端库与API服务器交互
8.3 本章小结
9 Deployment:声明式地升级应用
9.1 更新运行在pod内的应用程序
9.1.1 删除旧版本pod,使用新版本pod替换
9.1.2 先创建新pod再删除旧版本pod
9.2 使用ReplicationController实现自动的滚动升级
9.2.1 运行第一个版本的应用
9.2.2 使用kubectl来执行滚动式升级
9.2.3 为什么kubectl rolling-update已经过时
9.3 使用Deployment声明式地升级应用
9.3.1 创建一个Deployment
9.3.2 升级Deployment
9.3.3 回滚Deployment
9.3.4 控制滚动升级速率
9.3.5 暂停滚动升级
9.3.6 阻止出错版本的滚动升级
9.4 本章小结
10 StatefulSet:部署有状态的多副本应用
10.1 复制有状态pod
10.1.1 运行每个实例都有单独存储的多副本
10.1.2 每个pod都提供稳定的标识
10.2 了解Statefulset
10.2.1 对比Statefulset和ReplicaSet
10.2.2 提供稳定的网络标识
10.2.3 为每个有状态实例提供稳定的专属存储
10.2.4 Statefulset的保障
10.3 使用Statefulset
10.3.1 创建应用和容器镜像
10.3.2 通过Statefulset部署应用
10.3.3 使用你的pod
10.4 在Statefulset中发现伙伴节点
10.4.1 通过DNS实现伙伴间彼此发现
10.4.2 更新Statefulset
10.4.3 尝试集群数据存储
10.5 了解Statefulset如何处理节点失效
10.5.1 模拟一个节点的网络断开
10.5.2 手动删除pod
10.6 本章小结
11 了解Kubernetes机理
11.1 了解架构
11.1.1 Kubernetes组件的分布式特性
11.1.2 Kubernetes如何使用etcd
11.1.3 API服务器做了什么
11.1.4 API服务器如何通知客户端资源变更
11.1.5 了解调度器
11.1.6 介绍控制器管理器中运行的控制器
11.1.7 Kubelet做了什么
11.1.8 Kubernetes Service Proxy的作用
11.1.9 介绍Kubernetes插件
11.1.10 总结概览
11.2 控制器如何协作
11.2.1 了解涉及哪些组件
11.2.2 事件链
11.2.3 观察集群事件
11.3 了解运行中的pod是什么
11.4 跨pod网络
11.4.1 网络应该是什么样的
11.4.2 深入了解网络工作原理
11.4.3 引入容器网络接口
11.5 服务是如何实现的
11.5.1 引入kube-proxy
11.5.2 kube-proxy如何使用iptables
11.6 运行高可用集群
11.6.1 让你的应用变得高可用
11.6.2 让Kubernetes控制平面变得高可用
11.7 本章小结
12 Kubernetes API服务器的安全防护
12.1 了解认证机制
12.1.1 用户和组
12.1.2 ServiceAccount介绍
12.1.3 创建ServiceAccount
12.1.4 将ServiceAccount分配给pod
12.2 通过基于角色的权限控制加强集群安全
12.2.1 介绍RBAC授权插件
12.2.2 介绍RBAC资源
12.2.3 使用Role和RoleBinding
12.2.4 使用ClusterRole和ClusterRoleBinding
12.2.5 了解默认的ClusterRole和ClusterRoleBinding
12.2.6 理性地授予授权权限
12.3 本章小结
13 保障集群内节点和网络安全
13.1 在pod中使用宿主节点的Linux命名空间
13.1.1 在pod中使用宿主节点的网络命名空间
13.1.2 绑定宿主节点上的端口而不使用宿主节点的网络命名空间
13.1.3 使用宿主节点的PID与IPC命名空间
13.2 配置节点的安全上下文
13.2.1 使用指定用户运行容器
13.2.2 阻止容器以root用户运行
13.2.3 使用特权模式运行pod
13.2.4 为容器单独添加内核功能
13.2.5 在容器中禁用内核功能
13.2.6 阻止对容器根文件系统的写入
13.2.7 容器使用不同用户运行时共享存储卷
13.3 限制pod使用安全相关的特性
13.3.1 PodSecurityPolicy资源介绍
13.3.2 了解runAsUser、fsGroup和supplementalGroup策略
13.3.3 配置允许、默认添加、禁止使用的内核功能
13.3.4 限制pod可以使用的存储卷类型
13.3.5 对不同的用户与组分配不同的PodSecurityPolicy
13.4 隔离pod的网络
13.4.1 在一个命名空间中启用网络隔离
13.4.2 允许同一命名空间中的部分pod访问一个服务端pod
13.4.3 在不同Kubernetes命名空间之间进行网络隔离
13.4.4 使用CIDR隔离网络
13.4.5 限制pod的对外访问流量
13.5 本章小结
14 计算资源管理
14.1 为pod中的容器申请资源
14.1.1 创建包含资源requests的pod
14.1.2 资源requests如何影响调度
14.1.3 CPU requests如何影响CPU时间分配
14.1.4 定义和申请自定义资源
14.2 限制容器的可用资源
14.2.1 设置容器可使用资源量的硬限制
14.2.2 超过limits
14.2.3 容器中的应用如何看待limits
14.3 了解pod QoS等级
14.3.1 定义pod的QoS等级
14.3.2 内存不足时哪个进程会被杀死
14.4 为命名空间中的pod设置默认的requests和limits
14.4.1 LimitRange资源简介
14.4.2 LimitRange对象的创建
14.4.3 强制进行限制
14.4.4 应用资源requests和limits的默认值
14.5 限制命名空间中的可用资源总量
14.5.1 ResourceQuota资源介绍
14.5.2 为持久化存储指定配额
14.5.3 限制可创建对象的个数
14.5.4 为特定的pod状态或者QoS等级指定配额
14.6 监控pod的资源使用量
14.6.1 收集、获取实际资源使用情况
14.6.2 保存并分析历史资源的使用统计信息
14.7 本章小结
15 自动横向伸缩pod与集群节点
15.1 pod的横向自动伸缩
15.1.1 了解自动伸缩过程
15.1.2 基于CPU使用率进行自动伸缩
15.1.3 基于内存使用进行自动伸缩
15.1.4 基于其他自定义度量进行自动伸缩
15.1.5 确定哪些度量适合用于自动伸缩
15.1.6 缩容到0个副本
15.2 pod的纵向自动伸缩
15.2.1 自动配置资源请求
15.2.2 修改运行中pod的资源请求
15.3 集群节点的横向伸缩
15.3.1 Cluster Autoscaler介绍
15.3.2 启用Cluster Autoscaler
15.3.3 限制集群缩容时的服务干扰
15.4 本章小结
16 高级调度
16.1 使用污点和容忍度阻止节点调度到特定节点
16.1.1 介绍污点和容忍度
16.1.2 在节点上添加自定义污点
16.1.3 在pod上添加污点容忍度
16.1.4 了解污点和污点容忍度的使用场景
16.2 使用节点亲缘性将pod调度到特定节点上
16.2.1 指定强制性节点亲缘性规则
16.2.2 调度pod时优先考虑某些节点
16.3 使用pod亲缘性与非亲缘性对pod进行协同部署
16.3.1 使用pod间亲缘性将多个pod部署在同一个节点上
16.3.2 将pod部署在同一机柜、可用性区域或者地理地域
16.3.3 表达pod亲缘性优先级取代强制性要求
16.3.4 利用pod的非亲缘性分开调度pod
16.4 本章小结
17 开发应用的最佳实践
17.1 集中一切资源
17.2 了解pod的生命周期
17.2.1 应用必须预料到会被杀死或者重新调度
17.2.2 重新调度死亡的或者部分死亡的pod
17.2.3 以固定顺序启动pod
17.2.4 增加生命周期钩子
17.2.5 了解pod的关闭
17.3 确保所有的客户端请求都得到了妥善处理
17.3.1 在pod启动时避免客户端连接断开
17.3.2 在pod关闭时避免客户端连接断开
17.4 让应用在Kubernetes中方便运行和管理
17.4.1 构建可管理的容器镜像
17.4.2 合理地给镜像打标签,正确地使用ImagePullPolicy
17.4.3 使用多维度而不是单维度的标签
17.4.4 通过注解描述每个资源
17.4.5 给进程终止提供更多的信息
17.4.6 处理应用日志
17.5 开发和测试的最佳实践
17.5.1 开发过程中在Kubernetes之外运行应用
17.5.2 在开发过程中使用Minikube
17.5.3 发布版本和自动部署资源清单
17.5.4 使用Ksonnet作为编写YAML/JSON manifest文件的额外选择
17.5.5 利用持续集成和持续交付
17.6 本章小结
18 Kubernetes应用扩展
18.1 定义自定义API对象
18.1.1 CustomResourceDefinitions介绍
18.1.2 使用自定义控制器自动定制资源
18.1.3 验证自定义对象
18.1.4 为自定义对象提供自定义API服务器
18.2 使用Kubernetes服务目录扩展Kubernetes
18.2.1 服务目录介绍
18.2.2 服务目录API服务器与控制器管理器介绍
18.2.3 Service代理和OpenServiceBroker API
18.2.4 提供服务与使用服务
18.2.5 解除绑定与取消配置
18.2.6 服务目录给我们带来了什么
18.3 基于Kubernetes搭建的平台
18.3.1 红帽OpenShift容器平台
18.3.2 Deis Workflow与Helm
18.4 本章小结
A 在多个集群中使用kubectl
A.1 在Minikube和Google Kubernetes引擎之间切换
A.2 在多集群或多命名空间下使用kubectl
A.2.1 配置kubeconfig文件的路径
A.2.2 了解kubeconfig文件中的内容
A.2.3 查询、添加和修改kube配置条目
A.2.4 在不同的集群、用户和上下文中使用kubectl
A.2.5 切换上下文
A.2.6 列出上下文和集群
A.2.7 删除上下文和集群
B 使用kubeadm配置多节点集群
B.1 设置操作系统和所需的软件包
B.1.1 创建虚拟机
B.1.2 为虚拟机配置网络适配器
B.1.3 安装操作系统
B.1.4 安装Docker和Kubernetes
B.1.5 克隆虚拟机
B.2 使用kubeadm配置主节点
B.2.1 了解kubeadm如何运行组件
B.3 使用kubeadm配置工作节点
B.3.1 配置容器网络
B.4 在本地使用集群
C 使用其他容器运行时
C.1 使用rkt替换Docker
C.1.1 配置Kubernetes使用rkt
C.1.2 使用Minikute尝试rkt
C.2 通过CRI使用其他容器运行时
C.2.1 CRI-O容器运行时简介
C.2.2 使用虚拟机代替容器运行应用
D Cluster Federation
D.1 认识Cluster Federation
D.2 架构介绍
D.3 了解连接API对象
D.3.1 了解Kubernetes资源的联合版本
D.3.2 了解联合资源的用途
KubernetesinAction中文版是2019年由电子工业出版社出版,作者【美】MarkoLuksa。
得书感谢您对《KubernetesinAction中文版》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。