Kubernetes学习路线计划
Kubernetes学习路线/计划
官方文档:Kubernetes 文档 | Kubernetes
概念
金丝雀部署**(Canary Deployment)** 漫谈金丝雀部署(Canary Deployment) - 知乎 (zhihu.com)
学习路线/计划
如何学习 Kubernetes(完整路线图) - 知乎 (zhihu.com)
如今学习 Kubernetes 似乎变得越来越有必要,Kubernetes 是一个复杂的容器编排系统,具有陡峭的学习曲线。但是如果有了正确的学习路线和对基本概念的理解,任何开发人员或运维人员都可以学习 Kubernetes。
在这份 Kubernetes 学习路线规划中,我会聊聊学习 Kubernetes 的先决条件和完整的 Kubernetes 学习路径,涵盖了从基础到高级的 Kubernetes 概念。
一、学习 Kubernetes 的预备知识
在开始学习 kubernetes 之前,你需要深入了解一些底层技术和概念。
分布式系统:了解分布式系统基础知识以及它在现代 IT 基础架构中的用例。
身份验证和授权:这是 在IT 中非常基本的一个概念。然而,资历尚浅的工程师往往也没能很好掌握这块知识,所以这块要好好理解学习。
键值存储:这是一种 NoSQL 数据库。你需要了解它的基础知识和用例。
API: Kubernetes 是一个 API 驱动的系统。因此,你需要了解 RESTFUL API。另外,还要尝试了解 gRPC API。
YAML:它是一种数据序列化语言,可用于数据存储和配置文件。它非常容易学习,从 Kubernetes 的角度来看,我们将把它用于配置文件。所以理解 YAML 语法非常重要。
容器:容器是 kubernetes 的基本构建块。Kubernetes 的主要工作是编排容器。你需要学习所有容器基础知识,并具有使用 Docker 或 Podman 等容器工具的实践经验。我还建议阅读有关Open container initiative和 Container Runtime Interface (CRI) 的文章
服务发现:这在 Kubernetes 中是很重要的一块。你需要具备客户端和服务器端服务发现的基本知识。简而言之就是,在客户端服务发现中,请求进入服务注册中心以获取可用于后端服务的端点。在服务器端服务发现中,请求转到负载均衡器,负载均衡器使用服务注册表来获取后端服务的结束。
网络基础
- L4 和 L7 层(OSI 层)
- SSL/TLS:单向和双向 TLS
- 代理人
- 域名系统
- IP表
- IPVS
- 软件定义网络 (SDN)
- 虚拟接口
- 覆盖网络
二、学习 Kubernetes 架构
要弄清 Kubernetes 的架构并非易事。Kubernetes 有许多活动部件,只有了解了这些部件才能深入了解发生在系统表面下的事。而在学习架构时,还会遇到我们在第一节中谈到的那些预备知识。
Kubernetes 是一整个复杂的系统,学习它的核心架构可能会让人有点不知从何下手。不过,随着实践经验的逐渐累积,你将会更好地理解它的核心架构。
下面是我的建议。了解 Kubernetes 中所涉及的高级架构和关键组件,如果无法掌握这些知识,你可以花时间对特定主题进行更多的学习,或者在动手实践的同时学习这个概念。
可以查看Kubernetes 架构指南,详细了解所有的 Kubernetes 组件。
总的来说,你需要学习以下内容:
- 控制平面组件:了解每个组件的作用,如 API 服务器、etcd、调度程序和控制器管理器。
- 工作节点组件:了解 Kube Proxy、Kubelet、Container Runtime
- 插件组件: CoreDNS、网络插件(Calico、weave 等)、Metric Server
- 集群高可用性:大多数组织使用托管 Kubernetes 服务(GKE、EKS、AKS 等)。因此,云提供商负责集群控制平面的高可用性。但是,了解在多区域和区域中扩展集群的高可用性概念非常重要。
- 网络设计:虽然在开放网络中不受限制地设置集群很容易,但在公司网络中却不是那么容易。作为 DevOps 工程师,你应该了解 Kubernetes 网络设计和要求,以便更好地与网络团队协作。例如,当我在谷歌云上使用 kubernetes 设置时,我们使用了一个在公司网络中不可路由的 CIDR pod 范围。作为解决方法,我们必须为 pod 网络部署 IP 伪装。
三、Kubernetes 集群设置
设置 Kubernetes 集群有很多方式,不妨选择你喜欢的方式。
以下是我对集群设置的建:。
- **Kubernetes the Hard Way:**我建议你从 Kubernetes the hard way setup 开始。它可以帮助你了解引导 kubernetes 集群所涉及的所有配置。该设置基于谷歌云。
- **Kubeadm Cluster Setup**:学习 kubeadm 集群设置可以帮助你准备Kubernetes 认证。此外,它还可以帮助你使用最佳实践自动化 Kubernetes 集群设置。
- Minikube: 如果你想要一个最小的开发集群设置,minikube 是最好的选择。
- Kind: Kind 是另一种本地开发 Kubernetes 集群设置。
- Vagrant Automated Kubernetes:如果你更喜欢基于多虚拟机的本地 Kubernetes 集群设置,你可以尝试使用 Kubeadm 引导集群的自动化 vagrant 设置。
此外,还可以使用免费的云积分并设置托管 Kubernetes 集群。
- GKE(谷歌云——300 美元免费赠金)
- EKS(AWS – 300 美元的免费 POC 积分)
- DO Kubernetes(数字海洋——200 美元免费积分)
- Linode Kubernetes Engine(Linode Cloud – 100 美元免费积分)
四、了解 Kubeconfig 文件
**Kubeconfig
**文件是一个 YAML 文件,包含了所有集群信息和连接到集群的凭据。
作为一名 Devops 工程师,你应该学习使用 Kubeconfig 文件以不同方式连接到 kubernetes 集群。因为你要负责为 CI/CD 系统设置集群身份验证,还为开发人员提供集群访问等等。
所以花一些时间,了解 Kubeconfig 文件结构和相关参数吧。
请点击查看完整的 Kubeconfig 文件指南,了解有关 Kubeconfig 文件的所有信息。
五、了解 Kubernetes 对象和资源
你会经常遇到“Kubernetes 对象”和“Kubernetes 资源”这两个名称。
首先,你需要了解 Kubernetes 中对象和资源之间的区别。
简单来说,用户在 Kubernetes 中创建并持久化的任何东西都是一个对象。例如命名空间、pod、Deployment configmap、Secret 等。
在创建对象之前,我们会用 YAML 或 JSON 格式来表示它。它被称为对象规范(Spec)。我们在 Object Spec 上声明对象的所需状态。创建对象后,我们可以使用 Kubectl 或客户端库从 Kubernetes API 检索其详细信息。
正如我们之前在先决条件部分讨论的那样,Kubernetes 中的一切都是 API。为了创建不同的对象类型,Kubernetes API 服务器提供了 API 端点。那些特定于对象的 api 端点称为资源。例如,创建 pod 的端点称为pod 资源。
因此,当尝试使用 Kubectl 创建 Kubernetes 对象时,它会将 YAML 规范转换为 JSON 格式并将其发送到 Pod 资源(Pod API 端点)。
六、了解 Pod 和相关资源
了解完了 Kubernetes 对象和资源,下一步就可以从原生 Kubernetes 对象 Pod 入手。Pod 是 Kubernetes 的基本构建块。
你应该了解所有与 Pod 相关的概念及其相关对象,如 Service、Ingress、Persistent Volume、Configmap 和 Secret。一旦了解了有关 pod 的所有内容,就可以很容易地了解其他依赖于 pod 的对象,如部署、Daemonset 等。
首先,了解 Pod 对象规范 (YAML)。典型的 Pod YAML 包含以下高级构造:
- Kind 种类
- Metadata 元数据
- Annotations 注释
- Labels 标签
- Selectors 选择器
对上述内容有了基本的了解后,还要继续进行实践学习。只有亲自实践动手时,对这些概念的了解才会更深入。
以下是了解 Pod 及其关联对象的实践小联系:
- 部署一个 pod
- 在特定工作节点上部署 pod
- 向 pod 添加服务
- 使用 Nodeport 公开 pod 服务
- 使用 Ingress 公开 Pod 服务
- 设置 Pod 资源和限制
- 使用启动、活动和就绪探测设置 Pod。
- 将 Persistent Volume 添加到 pod。
- 将 configmap 附加到 pod
- 将 Secret 添加到 pod
- 多容器 pod(sidecar 容器模式)
- 初始化容器
- 临时容器
- 静态 Pod
- 学习对 Pod 进行故障排除
还有一点点高级 pod 调度概念:
- Pod 抢占和优先级
- Pod 中断预算
- 使用节点选择器放置 Pod
- Pod 亲和性和反亲和性
七、了解 Pod 相关对象
现在你对 Pod 和独立的 kubernetes 资源有了更好的了解,就可以开始学习依赖于 pod 对象的对象。在学习这一点的过程中,会遇到 HPA(水平 Pod 自动缩放)和 VPA(验证 Pod 自动缩放)等概念
- Replicaset 复制集
- Deployment 部署
- Daemonsets 守护进程
- Statefulset 状态集
- Jobs & Cronjobs
八、学习入口和入口控制器
为了将应用程序暴露给外界或最终用户,kubernetes 有一个名为 ingress 的原生对象。
由于对 Ingress 控制器的了解较少,许多工程师对 Ingress 感到困惑。所以确保你了解 Ingress 和 Ingress 控制器的概念并正确理解它。因为它是将应用程序暴露给外界的基础。
你可以从以下综合指南开始。
此外,了解Kubernetes Gateway API。它提供了优于 Ingress 的高级功能。
九、在 Kubernetes 上部署端到端应用程序
一旦了解了这些对象的基础知识,就可以尝试在 Kubernetes 上部署端到端应用程序。
我建议获得一个域名并尝试从头开始设置微服务应用程序并将其托管在域中。
无需为此开发应用程序。选择任何基于开源微服务的应用程序并进行部署。我的建议是选择开源的基于spring boot的 pet clinic microservice application
以下是一些难度较高的练习任务:
- 为所有服务构建 Docker 镜像。确保优化 Dockerfile 以减小 Docker Image 的大小。
- 为所有服务创建清单。(部署、状态集、服务、配置图、机密等)
- 暴露服务类型为 ClusterIp 的前端
- 部署 Nginx Ingress 控制器并使用服务类型 Loadbalancer 公开它
- 将 Loadbalancer IP 映射到域名。
- 创建一个带有 DNS 名称的入口对象,后端作为前端服务名称。
- 验证应用程序。
十、了解如何保护 Kubernetes 集群
安全性是 Kubernetes 很关键的一点。从构建安全的容器镜像开始,有很多方法可以在 Kubernetes 中实施安全最佳实践。
遵循在 kubernetes 中实现安全性的方法:
- 服务帐号
- Pod 安全上下文
- Seccomp 和 AppArmor
- 基于角色的访问控制 (RBAC)
- 基于属性的访问控制 (ABAC)
- 网络政策
以下是您需要查看的开源工具。
- Open Policy Agent
- Kyverno
- Kube-bench
- Kube-hunter
- Falco
十一、了解 Kubernetes 配置管理工具
现在你已经很好地了解了所有 Kubernetes 对象和在 Kubernetes 上部署应用程序,下卖弄可以开始学习 Kubernetes 配置管理工具。
当开始在组织中处理实时项目时,会看到使用配置管理工具在 Kubernetes 上部署应用程序。
因为在组织中,有不同的环境,如开发、阶段、预生产和生产。您不能为每个环境创建单独的 YAML 文件并手动管理它们。所以你需要一个系统来有效地管理 Kubernetes YAML 配置。
以下是用于管理 YAML 的流行且广泛采用的 Kubernetes 工具。
十二、了解 Kubernetes 操作符模式
Kubernetes Operators 是一个高级概念。
要了解 Operator,首先需要了解以下 Kubernetes 概念:
- Custom resource definitions
- Admission controllers
- Validating & Mutating Webhooks
要开始使用操作符,你可以尝试在 Kubernetes 上设置以下操作符:
- Prometheus Operator
- MySQL 运算符
如果你是 Go 开发人员或者想学习扩展/自定义 kubernetes,我建议使用 Golang 创建自己的运算符。
十三、了解重要的 Kubernetes 配置
在学习 kubernetes 时,你可能会在开放网络连接中使用集群。因此,大多数任务都可以毫无问题地执行。但是,在公司网络上设置的集群并非如此。
因此,以下是你应该注意的一些自定义集群配置。
- 自定义 DNS 服务器
- 自定义镜像注册表
- 将日志传送到外部日志系统
- Kubernetes OpenID 连接
- 为 PCI 和 PII 工作负载分离和保护节点
十四、学习 Kubernetes 最佳实践
以下是可能在最佳实践方面对 Kubernetes 学习过程有所帮助的资源。
12 Factor Apps:这是一种讨论如何编码、部署和维护基于现代微服务的应用程序的方法。由于 Kubernetes 是一个云原生微服务平台,它是 DevOps 工程师必须了解的概念。因此,当处理实时 kubernetes 项目时,你可以实施这些 12 要素原则。
Kubernetes Failure Stories:Kubernetes 失败故事是一个网站,其中包含一系列讨论 Kubernetes 实施失败的文章。如果您阅读了这些故事,就可以避免在 kubernetes 实施中犯下这些错误。
来自组织的案例研究:花时间研究组织发布的关于 Kubernetes 使用和扩展的用例。你可以从他们那里学到很多东西。以下是一些值得一读的案例研究。