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 通常用于将集群划分为多个环境,如developmentproduction。它允许多个用户和应用程序在一个群集中共存。您可以通过设置配额来控制 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的更多相关文章

  1. Let’s do this!新手程序员的入门指南(转)

    计算机科学(Computer Science)无疑是现在最热门的学科之一,这领域的工作薪水高.工作时间弹性,而且科技业对工程师.开发者的需求至今有增无减,科技龙头们随时虎视眈眈着出色的程式开发者.创意 ...

  2. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  3. Java程序员的Golang入门指南(上)

    Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...

  4. ReactJS入门指南

    ReactJS入门指南 本文旨在介绍ReactJS的基本知识,并一步步详细介绍React的基本概念和使用方法等,以及相应的Demo.本文在很大程度上参考了React官方文档和官方指南.如果你英语还不错 ...

  5. Microsoft Orleans 之 入门指南

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  6. web前端基础知识及快速入门指南

    web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...

  7. (转载)李剑英的CSLight入门指南结合NGUI热更新

    原地址:http://www.xuanyusong.com/archives/3075 李剑英的CSLight入门指南文档撰写者:GraphicQQ: 1065147807 一. CSLIGHT 作者 ...

  8. 【转】tmux入门指南

    按照官方说明,tmux是一个终端复用软件.我接触tmux也就是这几天的事情,但已经发现其强大.作为一个文艺程序员,有必要向大家分享一下,这么好的东东怎敢藏着掖着. 先用起来再说 假设你已经装好tmux ...

  9. ASP.NET SignalR 2.0入门指南

    ASP.NET SignalR 2.0入门指南 介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功 ...

  10. CI Weekly #21 | iOS 持续集成快速入门指南

    搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...

随机推荐

  1. linux 服务器上如何判断网络是否开通

      项目上由于升级了kafka需要测试下网络是否是通的,因此需要使用命令 nc -zv ip地址 端口这个命令来跑一下网络是否是通的,最后发现是新的kafka的config使用了新的端口,没有开通网络 ...

  2. Mysql数据库常见故障

    Mysql数据库常见故障 1.报错现象 Host is blocked because of many connection errors; unblock with 'mysqladmin flus ...

  3. Transaction rolled back because it has been marked as rollback-only大概问题及解决方法

    Transaction rolled back because it has been marked as rollback-only 问题:前几天遇到一个问题,代码没有抛出我想要的带自定义提示消息的 ...

  4. XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!

    今天使用 hbuilder 运行到 ios 真机的时候,突然发现还需要 ipa 签名,这是什么东东呢? 1.IPA 签名是什么? 因苹果公司禁止企业证书用于非企业内部开发者.所以开发者无法再使用DCl ...

  5. Matlab学习1

    Matlab 数据类型 数字 字符和字符串 矩阵 元胞数组 结构体 清空环境变量及命令 cls % 清除Command Windows中的所有命令 clear all % 清除Workspace*中的 ...

  6. React中编写操作树形数据的自定义Hook

    什么是 Hook hook 即为钩子,是一种特殊的函数,它可以让你在函数式组件中使用一些 react 特性,目前在 react 中常用的 hook 有以下几类 useState: 用于在函数组件中定义 ...

  7. P3755 [CQOI2017]老C的任务题解

    如果询问 \(x_1, y_1, x_2, y_2\), 那么询问 \((x_2, y_2)\), \((x_2, y_1 - 1)\), \((x_1 - 1, y_2)\) \((x_1 - 1, ...

  8. day-3 路由底层源码

    1. 定义路由本质 比如在url.py定义以下路由,浏览器中输入http://192.168.0.1:8000/user/2003-04-21可以访问 意味着此url http://192.168.0 ...

  9. [Spring+SpringMVC+Mybatis]框架学习笔记(八):Mybatis概述

    第8章 Mybatis概述 8.1 几个概念 ORM Object-Relationship Mapping 对象关系映射,它是一种思想,它的实质是将数据库中的数据用对象的形式表现出来. JPA Ja ...

  10. React函数式组件渲染、useEffect顺序总结

    参考资料: 深入React的生命周期(上):出生阶段(Mount) 深入React的生命周期(下):更新(Update) 精读<useEffect 完全指南> React组件重新渲染理解 ...