10个步骤成为K8S云原生工程师

简介: 10个步骤成为K8S云原生工程师

看到这篇文章的时候,你很可能已经了解到了使用 kubernetes 管理多服务架构的好处。本文不会讨论为什么要使用 kubernetes,而是重点讨论你已经确定将kubernetes作为你的解决方案后,如何使用它。

网上有许多 kubernetes 的学习资源,这当然很好,但这也使得我们很难知道从哪里以及如何开始学习这项庞大的技术。本文将提供一系列学习路径和资源,涵盖在 K8s 集群上运行应用程序微服务的不同方面。

我们将介绍一些概念,并为实际的学习提供外部资源,这将是你成为全面的 K8s 工程师的一站式指南。



一、十个步骤

STEP 1:在本地安装 Minikube 并熟悉 Control Plane 组件

Minikube 将为我们模拟一个多服务集群环境,它安装快速简便,文档可在此处找到。Minikube 比较占用机器资源(它非常占用 RAM),因此请记住这一点。

了解 k8s 集群组件的作用很重要。在继续第 2 步之前,请访问此简短教程。关注驻留在Control Plane(主节点)上的组件。

  1. Kube-apiserver:为k8s api对象(如pods)配置数据
  2. Kubelet:向 api-server 注册一个节点
  3. Kube-controller-manager:一个嵌入 k8s 核心控制循环的守护进程
  4. Kube-scheduler:确定哪些节点是每个 Pod 的有效位置
  5. Kube-proxy:将发往服务的流量定向到正确的后端 Pod

STEP 2:安装并熟悉 Kubectl

kubernetes命令行界面或 Kubectl 用于从主节点(稍后讨论)或您的本地机器向 K8s 环境中的工作节点发出调度命令。要安装命令行工具,请单击此处。您可以此处学习基本命令,但我强烈建议您在深入了解 Kubectl 之前先完成第 3 步并了解不同类型的 k8s yaml 配置对象。

STEP 3:了解不同的 yaml k8s api 对象

我认为最省时的方法是在高层次上学习核心 K8s 配置 yaml api 对象的目的。

不要记住文件结构或语言,因为 Helm(在下一步中有详细说明)会自动创建 yaml 配置结构。此处有个简短的教程,重点了解以下各项的作用:

  1. 部署
  2. 服务
  3. 服务帐户
  4. ingress(不要与后面讨论的 nginx-ingress-controller 混淆)
  5. hpa(水平 pod 自动缩放器)
  6. ConfigMap 和 Secrets

STEP 4:使用 Helm 为你的各种微服务编写 yaml 自定义文件

Helm 自动为您创建的每个“chart”创建默认的 yaml 配置文件。每个“chart”代表您架构中的一个单独的微服务。“chart”目录包含在集群上部署此微服务所需的所有配置文件。由于微服务是使用定义文件部署的,因此可以灵活轻松地更改和重新部署。最佳实践是将所有 helm 目录推送到(私有)git 存储库中,以便您稍后可以使用单个命令在不同的集群上重新安装所有服务。“动态” kubectl 命令不提供这种可重用性。

在大多数情况下,需要在每个Helm Chart中编辑的唯一文件是 values.yaml 文件。该文件为每个微服务创建了一个“单一的事实来源”。有关如何创建 Helm 图表的完整指南,我们会放在另一篇文章

STEP 5:使用 KOPS 构建具有工作节点自动缩放功能的高可用云设置

一旦您看到您的 Helm chart服务在 Minikube 中成功相互通信,您就正式准备好设置云环境了。高可用云设置被定义为在不同区域中至少有两个工作节点,每个节点托管您的应用程序入口控制器和服务。如果一个数据中心因风暴着火,另一个节点驻留在一个完全不同的“计算机群”中,并将继续不间断地处理传入请求。您的最终客户将不受干扰。不用担心,K8s 会在几分钟内自动创建在火灾中丢失的 Node 工作线程。

第一步,从您的云提供商处购买一台便宜、低 CPU/RAM 的机器。在这台便宜的机器上安装 Kubectl、KOPS 和 Helm。这台机器将被称为主节点,它将负责连接、交互和设置集群和驻留在其中的 pod。详细介绍,我们会在另一篇文章说明。

确保将所有 KOPS 命令记录在 sh 脚本文件中,这样您的基础设施构建过程就会被记录为代码,并且可以轻松复制,以防出现可能需要重新设置集群的错误。“基础设施即代码”的概念通过使用 KOPS 和 Helm 得到了很好的体现。

STEP 6:设置您的 Nginx 入口控制器和微服务入口 yaml 以满足您的需求

Nginx 入口控制器将管理到集群的流量。它可以配置为向服务提供外部可访问的 URL、负载平衡流量、终止 SSL/TLS 并提供基于名称的虚拟主机。下一篇文章我们将带您逐步了解如何部署带有 aws LoadBalancer 的 Nginx 入口控制器。

Helm 自动创建的入口 yaml 定义文件是不同的。它提供特定于服务的入口配置。annotations 字段是您定义 https 转发规则、任何请求大小限制和超时或与传入请求处理相关的其他重要配置的地方。这些规则通常会因集群中的服务而异,这就是为什么每个微服务都有自己的入口。

STEP 7:理解pod水平自动伸缩和集群自动伸缩的关系

您的某些服务可能需要定义一个 hpa(水平 pod 自动缩放器)yaml 文件以允许自动缩放。调度程序将根据您在部署 yaml 文件中定义的 cpu/ram 阈值自动生成更多 pod。一旦 Node 用 Pod 填满了它的资源限制,它就会自动创建一个额外的 Node 并在其上恢复 Pod 的调度。类似地,如果微服务上的工作负载下降,k8s 将神奇地“释放”或终止它产生的 pod 以及它在变得不必要时自动创建的新节点。

STEP 8:使用 taints、tolerations、affinity 和 anti-affinity 将 pod 自动安排在适当的节点上

“污染”节点,包括在其上放置一个标签,部署可以“容忍”(或换句话说,允许在被污染的节点上进行调度)或不允许(禁止调度)。Tolerations 在部署 yaml 文件的 pod spec 部分中指定,而污点则使用 Node.js 上的 Kubectl 命令进行标记。官方文档可以在这里找到。

一个类似的 yaml 配置调度功能是节点选择器 pod 规范。它赋予 Pod 对特定节点污点的亲和(或喜欢),或对节点污点的反亲和(不喜欢)。当尝试在具有特殊功能(高 CPU、GPU、高内存)的节点上调度特定 pod 时,节点亲和性非常强大。它最常用于防止在主节点上调度 Pod(为控制平面 Pod 保留)。

有时希望确保两个 Pod 不会自动部署到同一台机器上。为此,我们有Pod 间关联规则。例如,假设我们有两个 Pod(属于相同的部署/副本集),每个都需要 70% 的节点 CPU。在这种情况下,我们每个节点只能运行一个 Pod,两个 Pod 会导致 CPU 过载。一个不需要资源跟踪的简单解决方案是在部署中放置一个 pod anti-affinity 到它自己。这将实现每个工作节点关系一个 pod。

STEP 9:使用 Prometheus 和 Grafana 进行监控

最基本的性能监控工具是指标服务器。这是使用水平 pod 自动缩放器的基本先决条件,您可以使用它执行“Kubectl top”命令来检索 pod 或节点的 CPU 使用率。这很重要,因为在 K8s 中,每个设置为水平自动缩放的部署都必须在 yaml 配置中定义 CPU/RAM 要求(和限制)。

请注意,您可能会发现指标服务器本身并没有提供足够的洞察力。如果您的服务是 RAM/CPU 密集型的,您将需要一个可视化工具来精确测量每个 Pod 的资源使用情况。更好的监控意味着更少的意外和更少的 Pod 由于限制过度使用或技术术语 OOM 终止而崩溃。

我们会在另一篇文章中介绍有关如何使用helm charts安装 Grafana 和 Prometheus 的详细指南。Prometheus 将测量资源使用情况,而 Grafana 提供了一个可视化界面,用于在 x 时间轴上查看不同的资源指标。

STEP 10:使用 Elastic Search 和 Kibana 聚合日志记录

可以使用以下命令查看每个 pod 的实时 STDOUT:

kubectl logs -f <insert-pod-name>

这本身是不够的。

日志查看器显示 pod 写入 STDOUT 的最新打印的一部分。我们需要查看日志的一个常见原因是错误导致 pod 崩溃。在 pod 崩溃的情况下,日志将被擦除,并且无法恢复它们或调查源错误。

这个时候就得Elastic Search登场了!

它很容易与 Helm Charts 一起安装,并将集中和记录集群中所有 pod 的所有日志。Kibana 将为我们提供一个界面,我们可以从中搜索日志,或者缩小属于特定 pod 或时间段的日志。


二、总结

近期我们将提供一套免费的课程。它涵盖了我上面讨论的所有内容甚至更多,对于那些喜欢动手实践的人来说,这将会是一套非常全面的课程。



文丨Soundhearer

图丨来源于网络



相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
2天前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
53 1
|
2天前
|
消息中间件 Cloud Native 应用服务中间件
阿里云云原生工程师认证(Alibaba Cloud Certified Associate,ACA)考试大纲
介绍阿里云云原生工程师认证(Alibaba Cloud Certified Associate,ACA)所需具备的知识及学习方法等。
385 1
|
2天前
|
运维 Kubernetes Cloud Native
构建高效云原生运维体系:Kubernetes最佳实践
【5月更文挑战第9天】 在动态和快速演变的云计算环境中,高效的运维是确保应用稳定性与性能的关键。本文将深入探讨在Kubernetes环境下,如何通过一系列最佳实践来构建一个高效且响应灵敏的云原生运维体系。文章不仅涵盖了容器化技术的选择与优化、自动化部署、持续集成/持续交付(CI/CD)流程的整合,还讨论了监控、日志管理以及灾难恢复策略的重要性。这些实践旨在帮助运维团队有效应对微服务架构下的复杂性,确保系统可靠性及业务的连续性。
|
2天前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
7 0
|
2天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
2天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
32 1
|
2天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
56 1
|
2天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:以Kubernetes为核心
【4月更文挑战第27天】 在当今数字化转型的浪潮中,企业急需构建灵活、可扩展的应用来应对不断变化的市场需求。云原生技术以其独特的优势应运而生,成为推动现代应用开发和部署的重要力量。本文深入探讨了云原生的核心组件之一——Kubernetes,解析其如何通过容器编排优化资源利用,提高应用的弹性和可维护性。同时,文章将展示如何在云平台上实现高效的服务发现、自动扩缩容以及持续集成和持续部署(CI/CD),进一步阐述云原生架构下的最佳实践和面临的挑战。
|
2天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
25 4
|
2天前
|
Kubernetes Cloud Native Docker
【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
Kubernetes 是一个开源平台,用于管理容器化工作负载和服务,提供声明式配置和自动化。源自 Google 的大规模运维经验,它拥有广泛的生态支持。本文档详细介绍了 Kubernetes 集群的搭建过程,包括服务器配置、Docker 和 Kubernetes 组件的安装,以及 Master 和 Node 的部署。此外,还提到了使用 Calico 作为 CNI 网络插件,并提供了集群功能的测试步骤。
251 0