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

news2024/9/22 3:44:59

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/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维码智慧门牌管理系统:提升社会治理水平,创新市民服务方式

文章目录 前言一、适应市域社会治理现代化二、解决地名地址管理核心问题三、拓展多元化服务 前言 随着科技的不断发展&#xff0c;社会治理的方式和方法也在不断更新和升级。近年来&#xff0c;市域社会治理现代化已成为社会发展的必然趋势&#xff0c;而二维码智慧门牌管理系…

011:获取上证50的所有股票代码,并下载各个股K线数到excel表中

我们结合《获取上证50的所有股票代码》&#xff0c;《根据股票代码和起始日期获取K线数据到excel表》两文中的脚本&#xff0c;搞出新的脚本&#xff1a; import tkinter as tk from tkinter import messagebox from tkcalendar import Calendar import pandas as pd import…

阿里8年经验之谈 —— 如何编写有效的接口测试?

阿里妹导读&#xff1a;在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守…

web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 文章目录 深拷贝和浅拷贝的区别浅拷贝示例深拷贝示例 特殊对象…

LeetCode-145-二叉树的后序遍历

文章目录 递归法非递归法 题目描述&#xff1a; 题目链接&#xff1a;LeetCode-145-二叉树的后序遍历 递归法 解题思路&#xff1a;递归&#xff0c;具体可以参考 LeetCode-144-二叉树的前序遍历 代码实现&#xff1a; class Solution {List<Integer> listnew ArrayList…

数据结构中常见的排序及其代码C语言版本

这里非常抱歉 没有做好动图 等我做好了动态单独做一期博客到时候大家结合动图将本篇博客联系起来看 更容易理解一些喔 常见的数据结构中的排序算法有冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等。 冒泡排序&#xff1a;比较相邻的元素&#xff0c;…

京东数据分析软件:京东销售数据在哪里看?

京东数据分析可以帮助企业了解京东平台上的销售数据和用户行为数据&#xff0c;以便更有效地制定营销策略和优化经营。例如&#xff0c;通过分析京东销量数据&#xff0c;店家可以了解自己店铺的销售情况&#xff0c;发现问题并及时调整。这对于店家来说具有重要的作用&#xf…

塔望食观察 | 中国海参产业发展现状及挑战

海参&#xff0c;一个古老的物种&#xff0c;堪称海底活化石&#xff0c;据资料显示&#xff0c;海参在地球上存活超过6亿年&#xff0c;比恐龙还早。海参的药用、食疗和营养滋补价值极高&#xff0c;清朝学者赵学敏编的《本草纲目拾遗》有这样的叙述&#xff1a;“海参性温补&…

SpringBoot通过配置切换注册中心(多注册中心nacos和eureka)

场景&#xff1a; 因项目需要&#xff0c;一个springcloud微服务工程需要同时部署到A,B两个项目使用&#xff0c;但A项目使用Eureka注册中心&#xff0c;B项目使用Nacos注册中心&#xff0c;现在需要通过部署时修改配置来实现多注册中心的切换。 解决思路&#xff1a; 如果同时…

算法通关村第17关【黄金】| 跳跃游戏问题

1. 跳跃游戏 思路&#xff1a;每个nums[i]i代表当前最后覆盖范围&#xff0c;这里和字符串分割那道题一样求覆盖区间&#xff0c;取cur的最大值 class Solution {public boolean canJump(int[] nums) {int len nums.length;if(len 1){return true;}int cur 0;for(int i 0;…

如何建立线上线下相结合的数字化新零售体系?

身处今数字化时代&#xff0c;建立线上线下相结合的数字化新零售体系是企业成功的关键。蚓链数字化营销系统致力于帮助企业实现数字化转型&#xff0c;打通线上线下销售渠道&#xff0c;提升品牌影响力和用户黏性&#xff0c;那么具体是如何建立的&#xff1f; 1. 搭建数字化中…

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南 介绍 冻干周期的工艺开发在冻干中起着至关重要的作用&#xff0c;因为它可以优化关键工艺参数&#xff0c;以实现理想的产品质量和工艺一致性。优化冻干工艺还可以缩短运行时间&#xff0c;尽早发现关键错误&…

基于threejs的3d可视化工厂示例

源码下载地址在文章末尾&#xff01; 效果演示 总览 内部设备 选中机器展示数据 源码下载地址 https://download.csdn.net/download/qq_43185384/88415706

torch-scatter安装失败解决办法

安装torch-scatter时可以直接下载whl安装&#xff0c;但是会遇到版本不一致的问题&#xff0c;虽然可以安装但是会提示.so文件不存在或者undefined symbol: 的问题&#xff0c;可以在下面的地址中找到跟自己的torch和cuda版本对应的torch-scatter安装文件。 https://pytorch-ge…

我的AI存储实践及思考

前言 我从2020年进入人工智能行业&#xff0c;开始为AI训练提供存储解决方案及技术支持&#xff0c;随着这几年行业以及公司的发展&#xff0c;采用的存储方案经历了几次大的演变 &#xff0c;最开始使用的是分布式并行文件系统Lustre&#xff0c;接着是BeeGFSCeph&#xff0c…

leetcode(力扣) 221. 最大正方形(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1…

SQLAlchemy 使用封装实例

类封装 database.py #! /usr/bin/env python # -*- coding: utf-8 -*-import sys import json import logging from datetime import datetimefrom core.utils import classlock, parse_bool from core.config import (MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASS,MYSQL_DA…

calc方法和vue中calc不生效踩坑

calc方法 calc()方法是css用来计算的,比如一个场景,上下固定高度,中间自适应,就可以使用这个方法。 预编译less也是可以使用这个方法的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…

AR动态贴纸SDK,让创作更加生动有趣

在当今的社交媒体时代&#xff0c;视频已经成为了人们表达自我、分享生活的重要方式。然而&#xff0c;如何让你的视频在众多的信息中脱颖而出&#xff0c;吸引更多的关注和点赞呢&#xff1f;答案可能就在你的手中——美摄AR动态贴纸SDK。 美摄AR动态贴纸SDK是一款专为视频编辑…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…