软件开发人员 Kubernetes 入门指南|Part 1

软件,开发人员,kubernetes,入门,指南,part · 浏览次数 : 72

小编点评

**Kubernetes 文档简介** Kubernetes 文档是 Kubernetes 控制平台的官方文档,它包含所有关于 Kubernetes 控制平台的知识和指导。文档以 YAML 格式编写,可以帮助您在 Kubernetes 集群中创建和管理容器。 **核心概念** * **Kubernetes 集群 (Cluster):** Kubernetes 集群是一个控制节点集群,它包含多个 Kubernetes 控制节点。 * **控制节点 (Node):** 控制节点是 Kubernetes 集群中的一个控制节点,它负责管理容器和网络。 * ** pod (Pod):** pod 是 Kubernetes 控制平台中的一个容器,它包含一个 Kubernetes控制节点和多个容器。 * **Deployment (Deployment):** Deployment 是 Kubernetes 控制平台中的一个容器,它包含多个 pod。 * **Kubernetes Controller (Controller):** Kubernetes Controller 是 Kubernetes 集群中的一个控制节点,它负责管理 pod、deployment、网络和监控。 **基本操作** * 创建 Kubernetes 集群 * 创建和管理 pod * 创建和管理 deployment * 查看 Kubernetes 集群状态 **网络管理** * Kubernetes 集群包含多个 Kubernetes 控制节点,每个控制节点可以网络连接到其他控制节点。 * Kubernetes 控制节点可以通过网络连接到 Kubernetes 集群中的其他 pod。 * Kubernetes 控制节点可以通过网络连接到 Kubernetes 集群中的 Kubernetes Controller。 **监控** * Kubernetes 集群可以监控容器状态和网络状态。 * Kubernetes Controller 可以通过网络监控容器状态。 * Kubernetes Controller 可以通过监控 Kubernetes 集群状态进行实时操作。 **示例** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginxspec replicas: 3 selector: matchLabels: app: nginx spec: containers: - name: nginx image: nginx:latest ``` **学习 Kubernetes** * Kubernetes 官方文档:Kubernetes 文档 * Kubernetes 官方视频:Kubernetes 控制平台视频教程 * Kubernetes 官方课程:Kubernetes 课程

正文

Kubernetes 是一个用于部署和管理容器的编排系统。使用 Kubernetes,用户可以通过自动执行管理任务(例如在跨节点间扩展容器并在容器停止时重新启动任务),在不同环境中可靠地运行容器。
 

Kubernetes 提供的抽象可以让你从 Pod(容器)、Services(网络端点)和 Jobs(一次性任务)等应用组件的角度进行思考。它有一个声明式配置模型,可简化设置并防止漂移,也就是用户可以定义环境应该是什么样子,然后系统会自动应用操作来实现这种状态。
 

软件开发人员为何要学习 Kubernetes?

了解如何使用 Kubernetes 的开发人员可以轻松复制生产基础设施,并更多地参与运维。无论是在您的机器上本地部署,还是在云中以生产规模部署,您可以使用相同的工具和流程,将您的工作部署到任何环境中。
 

了解 Kubernetes 还能让您对系统拥有更大的自主权。您可以做出有影响力的改变,改善自己和他人的部署和操作体验。当所有应用环境都使用 Kubernetes 运行时,每个人都在按照相同的共享部署模板工作,这样减少了错误和差异的发生。如果操作员因生产中的问题而要求更改,您可以自行测试和验证,而无需等待他们的反馈。这样就缩短了开发周期,提高了工作效率。
 

过去几年中,人们对 Kubernetes 的兴趣日益高涨,因此熟悉 Kubernetes 也有助于未来的职业发展。Dynatrace 的一项 2023 年调查报告显示,2022 年期间,Kubernetes 的采用率增长了 127%,CNCF 调查结果显示 96% 的组织正在使用或评估该技术。Kubernetes 是一种流行技术,因此了解其工作原理、对应用程序的影响方式以及如何使用,可以增加您的就业前景。
 

Kubernetes 的关键组件

正如我们已经简要提到的,Kubernetes 有自己的对象类型词汇表,代表集群内不同类型的资源。有些组件是集群本身的一部分,如节点(Nodes),而其他组件,如 Pod 和服务(Services),则是应用程序的模型部分。在深入学习本指南时,您需要熟悉这些术语。
 

Pods

Pods 是 Kubernetes 集群中的计算单元。Pod 的每个实例可容纳一个或多个容器,所有容器都调度到集群中的同一个节点。与单个 Pod 的手动交互相对较少。它们通常由更高级别的控制器(如 ReplicaSets[1] 和 Deployments[2])创建,这些控制器为您管理 Pod 的复制和扩展。
 

Nodes

Nodes 是集群中的一台物理机器。它运行一个名为 kubelet 的代理进程,负责与控制平面保持通信。Nodes 负责运行容器。当你创建一个新 Pod 时,控制平面会根据资源利用率和你设置的任何 Nodes 选择器等标准,选择运行资源的最佳 Nodes 。被选中的 Node 会提取所需的镜像并启动容器。如果 Node离线,Kubernetes 会注意到它的缺席,并将 Pod 重新安排到集群的不同成员。
 

Deployments

Deployments 是 Kubernetes 的对象,促进 Pod 的声明式更新,用于部署应用程序的主容器,而无需手动创建和维护 Pod 对象。
 

Deployments 有几个优点。将 Deployment 添加到群集时,您可以定义要运行的容器镜像和要创建的副本数量。Kubernetes 会根据请求的副本数量自动创建正确数量的 Pod,并将它们分布到集群中的节点上。通过修改 Deployment 对象的配置来添加更多副本,Kubernetes 将自动启动更多 Pod 来满足该情况。如果减少副本数量,Kubernetes 将删除较旧的 Pod 以缩小规模。
 

Deployment 还允许您暂停扩展更改的推出,然后稍后恢复。您也可以回滚到以前的版本,确保快速缓解和解决新应用版本遇到的任何问题。
 

集群

Kubernetes 集群是应用程序运行的整体环境。它包括集群中的 Nodes,以及管理整个系统的控制平面组件。
 

集群的控制平面包括与你交互的 API 服务器、将 Pod 分配给 Nodes 的调度器,以及实现特定集群行为的控制器。这还包括一个用于持久化集群状态的 etcd 数据存储。
 

Namespace

Namespace 允许您将集群资源组织到不同的逻辑组中。
 

集群中的对象名称只需在每个 Namespace 内是唯一的即可。

 

Namespace 通常用于将集群划分为多个环境,如development和 production。它允许多个用户和应用程序在一个群集中共存。您可以通过设置配额来控制 Namespace 内的资源利用率,防止单个 Namespace 占用所有可用容量。
 

基本命令和操作

一旦建立了 Kubernetes 集群,就可以使用前面提到的 kubectl 与之交互。它是官方的命令行客户端应用程序。让我们来介绍几个可以开始使用的简单命令。
 

kubectl run

kubectl run集群中启动一个新 Pod,运行指定的容器镜像。这将启动一个名为 nginx的 Pod,运行nginx:latest镜像:

$ kubectl run nginx --image nginx:latest 
pod/nginx created

 

kubectl get

get命令会列出特定类型集群中的所有对象,如pod:

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          81s

 

kubectl describe

describe 提供特定命名对象的详细信息:

$ kubectl describe pod nginx
Name:             nginx
Namespace:        default
Priority:         0
Service Account:  default
Node:             minikube/192.168.49.2
Start Time:       Sat, 06 May 2023 13:21:07 +0100
Labels:           run=nginx
Annotations:      <none>
Status:           Running
IP:               10.244.0.8
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m9s  default-scheduler  Successfully assigned default/nginx to minikube
  Normal  Pulling    2m8s  kubelet            Pulling image "nginx:latest"
  Normal  Pulled     2m    kubelet            Successfully pulled image "nginx:latest" in 8.202082294s (8.202097725s including waiting)
  Normal  Created    2m    kubelet            Created container nginx
  Normal  Started    2m    kubelet            Started container nginx

 

当你需要排查特定对象的问题时,比如 Pod 为何停留在pending状态而不是running状态,请使用该命令。 describe输出底部的Events列表包含有关 Kubernetes 所采取的行动的有用信息。
 

kubectl delete

使用delete命令从集群中删除命名对象:

$ kubectl delete pod nginx 
pod "nginx" deleted

 

在 Kubernetes 中部署应用程序

您可以通过多种方式将应用程序部署到 Kubernetes。Helm 是一种用于生产的流行解决方案,它为 Kubernetes 工作负载提供了一种包管理器体验。当然,kubectl CLI 也是理想的入门工具。
 

在下面的步骤中,我们将演示如何通过创建 Deployment 对象,在 Kubernetes 中运行 NGINX Web 服务器的多个副本。
 

如果您没有可用的 Kubernetes 集群,可以尝试使用 minikube 在你的机器上快速启动一个。

 

创建 Deployment

您可以使用以下 kubectl 命令创建新的部署:

$ kubectl create deployment nginx --image nginx:latest --replicas 3
deployment.apps/nginx created

 

添加一个名为nginx 的 Deployment 对象,该对象运行nginx:latest容器镜像。运行以下命令即可看到该对象:

$ kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           45s

 

此输出确认已请求了三个副本,并且三个副本都已准备就绪。Deployment 已自动创建 Pod 以运行容器:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          113s
nginx-654975c8cd-7mkwk   1/1     Running   0          113s
nginx-654975c8cd-bbphv   1/1     Running   0          113s

 

根据您指定的副本数量,有三个 Pod。现在尝试删除其中一个:

$ kubectl delete pod nginx-654975c8cd-bbphv
pod "nginx-654975c8cd-bbphv"

 

现在重复命令列出 Pod:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          2m57s
nginx-654975c8cd-7mkwk   1/1     Running   0          2m57s
nginx-654975c8cd-vrkvb   1/1     Running   0          19s

 

集群中仍有三个 Pod。在您删除旧的 Pod 后,Deployment 发现与您请求的三个副本有偏差。它自动添加了一个新 Pod 以恢复可用性。
 

扩展 Deployment

您可以使用 kubectl scale 命令更改副本数量。确定要更改的 Deployment 和要应用的新副本数量:

$ kubectl scale deployment nginx --replicas 5
deployment.apps/nginx scaled

 

Deployment 控制器会自动向群集添加两个新 Pod,以满足更新后的副本数量:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-74rjx   1/1     Running   0          5m11s
nginx-654975c8cd-7mkwk   1/1     Running   0          5m11s
nginx-654975c8cd-b7hg6   1/1     Running   0          37s
nginx-654975c8cd-hnklt   1/1     Running   0          37s
nginx-654975c8cd-vrkvb   1/1     Running   0          2m33s

 

更新 Deployment

您可以通过运行kubectl edit来更改 Deployment 的属性。这将在默认编辑器中打开 Deployment 的 YAML 清单:

$ kubectl edit deployment nginx

 

向下滚动文件,找到 spec.template.spec.containers 部分。将 image 属性的值从 nginx:latest 改为 nginx:stable-alpine。

 

保存并关闭文件。
 

Deployment 会将 Pod 替换为使用 stable-alpine 图像标记的新 Pod。使用 kubectl 列出群集的 Pod 或 Deployment,并监控推出情况:

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   4/5     5            4           10m

 

回滚 Deployment

有时,您应用的更改可能不正确或不理想。例如,你可能选择了错误的镜像或指定了不正确的副本数量。Kubernetes 可通过一条命令回滚来处理这些情况:

$ kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back

 

Deployment 的配置会恢复到之前的状态。
 

您可以选择指定要恢复的特定版本号:

$ kubectl rollout undo deployment nginx --to-revision=1

 

声明式管理 Deployment

上述示例使用 kubectl 命令来定义和管理 Deployment。这对入门很方便,也可以编写 YAML 清单来创建对象。这些清单可以作为源代码的一部分进行版本控制。
 

下面是与之前创建的 Deployment 相对应的 YAML 清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest

 

这部分演示了我们之前介绍过的标签和选择器机制。该 Deployment 包括一个 Pod 的清单模板,每个 Pod 都分配了 app: nginx 标签。其配置了相应的标签选择器(label selector),因此标记 app: nginx 的 Pod 将成为该 Deployment 的一部分。
 

将 YAML 保存为 deployment.yaml,然后使用以下命令将其应用到集群中:

$ kubectl apply -f deployment.yaml
deployment.apps/nginx created

 

要修改 Deployment ,只需编辑原始 YAML 文件即可。尝试将 spec.replicas 字段改为 5,然后重复该命令以应用您的更改:

$ kubectl apply -f deployment.yaml
deployment.apps/nginx configured

 

Kubernetes 会自动将集群转换到新的理想状态,添加新的 Pod 以实现更新的副本数:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-654975c8cd-8xqd8   1/1     Running   0          91s
nginx-654975c8cd-mjwjp   1/1     Running   0          91s
nginx-654975c8cd-ngnvv   1/1     Running   0          6s
nginx-654975c8cd-qkf2d   1/1     Running   0          6s
nginx-654975c8cd-tb6z6   1/1     Running   0          91s

 

总结

Kubernetes 可跨物理节点集群协调容器部署,使用 Pod 和 Deployment 等对象有效地建模应用程序组件。您可以扩展容器副本,而无需自己管理故障、依赖关系、网络和存储。
 

学习 Kubernetes:

  • 掌握一项多年来在快速发展的云原生运维领域炙手可热的技能;

  • 更清楚地了解代码是如何在生产中到达用户的;

  • 掌握运维团队用来部署实时应用程序的相同工具;

  • 可以运行自己的本地 Kubernetes 集群,在开发人员工作站上准确复制生产基础架构,从而减少环境之间的差异。
     

现在,你已经了解了 Kubernetes 的基本概念,并看到了如何管理简单的容器部署。在本系列的第 2 部分,我们将更深入地了解 Kubernetes 网络和监控,以便您在集群中进行实际应用。
 

原文链接:
https://komodor.com/blog/a-software-developers-guide-to-getting-started-with-kubernetes-part-1/
参考链接:
[1]https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
[2]https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

 

与软件开发人员 Kubernetes 入门指南|Part 1相似的内容:

软件开发人员 Kubernetes 入门指南|Part 1

Kubernetes 是一个用于部署和管理容器的编排系统。使用 Kubernetes,用户可以通过自动执行管理任务(例如在跨节点间扩展容器并在容器停止时重新启动任务),在不同环境中可靠地运行容器。 Kubernetes 提供的抽象可以让你从 Pod(容器)、Services(网络端点)和 Jobs(

软件开发人员 Kubernetes 入门指南|Part 2

在第 1 部分中,我们讲解了 Kubernetes 的核心组件,Kubernetes 是一种开源容器编排器,用于在分布式环境中部署和扩展应用程序;我们还讲解了如何在集群中部署一个简单的应用程序,然后更改其副本数量以扩大或缩小其规模。 在本文中,我们将为您深入讲解 Kubernetes 提供的网络和监

读Bilgin Ibryam 新作 《Dapr 是一种10倍数 平台》

Bilgin Ibryam 最近加入了开发者软件初创公司Diagrid Inc,他是Apache Software Foundation 的 committer 和成员。他也是一个开源的布道师,并且是书籍 Kubernetes设计模式 和 Camel Design Patterns 的作者。早在20

如何基于 Kubernetes 实现优质开发者平台体验?

内部开发者平台(或 IDP)是使开发团队能够更快、更轻松、更一致地交付应用程序的基础设施。Kubernetes 本身是一个功能强大的平台,但它引入了太多复杂性和功能,因此不能简单地将其作为 IDP 交给开发团队。若要期望他们能取得成功,非常重要的一点是要设置一些防护措施,使他们能够有效地使用 K8s

DevSecOps 需要知道的十大 K8s 安全风险及建议

Kubernetes (K8s)是现代云原生世界中的容器管理平台。它实现了灵活、可扩展地开发、部署和管理微服务。K8s 能够与各种云提供商、容器运行时接口、身份验证提供商和可扩展集成点一起工作。然而 K8s 的集成方法可以在任何基础设施上运行任何容器化应用程序,这使得围绕 K8s 和其上的应用程序堆

软件开发人员必须阅读的20本书

本文翻译自国外论坛 medium,原文地址:https://irina-seng.medium.com/top-20-books-a-software-developer-must-read-updated-b24bcc9ee3d > 持续学习的心态是软件开发人员想要保持专业相关性并增长自身价值的关

推荐!十个平台工程工具助力开发人员提升效率和体验

平台工程是为软件开发人员创建高效生态系统的过程,帮助他们自主执行软件开发生命周期的端到端操作。平台工程旨在减少开发人员的整体认知负荷并消除流程中的瓶颈,让开发团队的体验更佳。平台工程工具通过改善开发人员体验来支持开发人员。通过消除瓶颈并减少日常摩擦来帮助开发人员完成工作,这意味着开发人员最终可以用更

[转帖]编译器优化那些事儿(7):Cache优化

https://bbs.huaweicloud.com/forum/thread-02101103793043210063-1-1.html 引言 软件开发人员往往期望计算机硬件拥有无限容量、零访问延迟、无限带宽以及便宜的内存,但是现实却是内存容量越大,相应的访问时间越长;内存访问速度越快,价格也更

IDP 与 DevOps平台:相似之处与关键差异

软件开发是一个复杂而动态的过程,涉及许多工具、技术和实践。为了更快、更好地交付软件,开发人员需要有效地协作,自动执行任务,并管理环境。然而,由于软件架构的日益复杂,工具和平台的多样性,以及对安全和合规性的要求越来越高,软件开发变得极具挑战。 为了更好地应对开发挑战,企业根据自身情况分别选择内部开发者

事务相关知识集锦

作者:李玉亮 引言 数据库事务与大多数后端软件开发人员的工作密不可分,本文从事务理论、事务技术、事务实践等方面对常用的相关事务知识进行整理总结,供大家参考。 事务理论介绍 事务定义 在数据库管理系统中,事务是单个逻辑或工作单元,有时由多个操作组成,在数据库中以一致模式完成的逻辑处理称为事务。一个例子