了解和使用 Kubernetes

news2025/2/12 20:08:32

文章目录

  • 前言
  • Kubernetes 集群安装
  • Kubernetes 功能
  • Kubernetes 核心概念
  • Kubernetes 部署应用
    • 发布部署脚本
    • 发布服务
    • 使用 Ingress
    • 配置自动伸缩
  • Kubernetes 常用命令
  • Kubernetes 故障排查

前言

通过 《容器集群管理工具 Docker Swarm》可以知道,在部署、调度、扩展和管理较多的容器时,如果有一个工具帮忙做这些事,那无疑会大大提高工作效率了。那 Docker Swarm 就是这样的工具,同样 Kubernetes(简称k8s)也是这样的一个工具,相对于 Docker Swarm, Kubernetes 生态比较庞大,有更多的支持、服务和工具。至于用哪个,萝卜青菜各有所爱吧。

本文对 Kubernetes 的概念、常用命令、部署脚本进行简单介绍,更多详细内容可以前往 Kubernetes官网 或 Kuboard 官网 (推荐)进行了解。

Kuboard 是一款免费的 Kubernetes 图形化管理工具,相较于 Kubernetes Dashboard 的管理界面功能和体验友好的多。当然也有其他的 Kubernetes 图形化管理工具 ,比如 Kubesphere。

老样子下面还有投票,一起参与进来吧👍

Kubernetes 集群安装

Kubernetes官网 和 Kuboard 官网 都有详细介绍,这里不做过多赘述,由于官网中的下载地址为外网,网络不稳定,推荐 Kuboard 的安装教程。

Kubernetes 功能

Kubernetes 除部署外还支持自动伸缩、故障自愈、服务发现和负载均衡、金丝雀多种部署模式以及监控等功能,可以非常健壮地运行分布式系统。

  • 服务发现和负载均衡:通过 Kubernetes 部署,同一应用的容器可以实现负载均衡的效果,也不用担心容器的 IP 的变动。
  • 自动伸缩:Kubernetes会根据部署时的声明对容器的实际运行状态进行调整。比如,设置最小及最大副本数量,根据 cpu 使用率进行动态伸缩。
  • 故障自愈:Kubernetes 可以重启已经停机的容器;替换、kill 那些不满足自定义健康检查条件的容器。
  • 金丝雀发布:通过对 Pod 打相同的 Label,可以请求到同一应用的不同版本,达到灰度效果。

Kubernetes 核心概念

很多初学者在入门 Kubernetes 时,都会被各种名词所困扰,比如:Pod、Deployment、Service,可以通过下图进行理解。

在这里插入图片描述

  • Kubernetes Master:集群中的主节点,起部署、调度、管理容器等作用,所有操作在此节点。
  • Node :集群中的工作节点,相当于一个物理机或虚拟机。
  • Pod : 最小调度的单位,可以承载多个 Docker 容器,可以理解成容器的“容器”。
  • Service :同 Docker Swarm 中的 Service,可以起到相同 Pod 的负载作用,并且同 Service 中的 Pod 可以相互通信。
  • Label:为 Pod 打标签,可以起到分流、金丝雀部署的效果或者指派开发、测试、生产环境。
  • Deployment:Deployment 指示 Kubernetes 如何创建和更新应用程序的实例,这个实例就是被包含在 Pod 中的容器。

Kubernetes 部署应用

so,如何部署一个应用,首先要声明一个 Deployment 脚本,在 Kubernetes 集群中发布 Deployment 后,master 节点将应用程序实例调度到集群中的具体的节点上。

发布部署脚本

这里创建一个部署文件 nginx-deployment.yaml,内容如下:

apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment    #配置的类型,部署是 Deployment
metadata:           #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment    #Deployment 的名称
  labels:       #标签
    app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #replicas 副本集应该维护几个 Pod 副本(实例),这里指使用该Deployment创建一个应用程序实例,
  selector:     #标签选择器,与上面的标签共同作用
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:     #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:       #期望Pod实现的功能(即在pod中部署)
      containers:   #生成container,与docker中的container是同一种
      - name: nginx #container的名称
        image: nginx:1.7.9  #使用镜像nginx:1.7.9创建container,该container默认80端口可访问

执行 kubectl apply -f nginx-deployment.yaml 进行部署之后,通过 kubectl get pods 查看部署情况。

发布服务

应用在发布后只能在集群内部进行访问,且需要获得容器的 IP,如何通过节点 IP 即可访问服务?Kubernetes 中的 Service 提供了这样的功能,且 Service 提供了 Pods(容器组)的负载均衡。

为 Nginx Deployment 创建一个 Service 脚本 nginx-service.yaml,内容如下:

apiVersion: v1
kind: Service #配置的类型,服务是 Service
metadata:
  name: nginx-service   #Service 的名称
spec:       #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:     #标签选择器
    app: nginx  #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port    #端口的名字
    protocol: TCP       #协议类型 TCP/UDP
    port: 80            #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80  #将请求转发到匹配 Pod 的 80 端口
  type: NodePort    # Serive的类型,ClusterIP(默认)/NodePort/LoaderBalancer

执行 kubectl apply -f nginx-service.yaml 进行部署之后,就可以通过集群中<任意节点的 IP>:32600 访问服务。

使用 Ingress

Ingress 可以将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。

为 Nginx Service 创建一个 Service 脚本 nginx-ingress.yaml,内容如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress  # Ingress 的名字,仅用于标识
spec:
  rules:                      # Ingress 中定义 L7 路由规则
  - host: demo.com   # 根据 virtual hostname 进行路由(请使用您自己的域名)
    http:
      paths:                  # 按路径进行路由
      - path: /
        backend:
          serviceName: nginx-service  # 指定后端的 Service 为之前创建的 nginx-service
          servicePort: 80

配置自动伸缩

Kubernetes 中 Horizontal Pod Autoscaler 根据观察到的 CPU 利用率(或某些由应用程序提供的指标)自动调整 Pod 的数量。

以文中的 nginx-deployment 为例子,部署脚本中对其进行资源限制,发布后创建自动伸缩指令,脚本内容如下:

apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment    #配置的类型,部署是 Deployment
metadata:           #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment    #Deployment 的名称
  labels:       #标签
    app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #replicas 副本集应该维护几个 Pod 副本(实例),这里指使用该Deployment创建一个应用程序实例,
  selector:     #标签选择器,与上面的标签共同作用
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:     #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:       #期望Pod实现的功能(即在pod中部署)
      containers:   #生成container,与docker中的container是同一种
      - name: nginx #container的名称
        image: nginx:1.7.9  #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
        resources:
          limits:
            cpu: 1000m # 该容器使用的cpu资源不能超过1核
          requests:
            cpu: 500m # 该容器最少使用的cpu资源为0.5核

发布后执行自动伸缩指令,这条指令的意思是 nginx-deployment 在 1 到 10 个副本之间伸缩,通过增加或减少 Deployment 的副本数,使得所有 Pod 的平均 CPU 利用率维持在 50% 左右。

kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10

Kubernetes 常用命令

# 部署资源
kubectl apply -f
# 删除部署资源
kubectl delete -f
# 查看 Deployment
kubectl get deployments
# 查看 service
kubectl get service
# 查看 Pod
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes
#查看Pod的信息
kubectl describe pod
#查看Deployment的信息
kubectl describe deployment
#查看Pod内的容器打印的日志
kubectl logs -f 
#在Pod中运行bash
kubectl exec -it pod-xxxxxx /bin/bash
#查看名称空间
kubectl get namespaces 
#查看名称空间的概要信息
kubectl describe namespaces
#创建命名空间
kubectl create namespace
#删除命名空间
kubectl delete namespace
#切换命名空间
kubectl config use-context
#查看当前命名空间
kubectl config current-context

Kubernetes 故障排查

在Kubernetes中进行故障排除可能是一项艰巨的任务,从下至上解决问题:从Pod开始,然后通过Service和Ingress向上移动堆栈。可以参考下图:Deployment 故障排除图解。

在这里插入图片描述

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

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

相关文章

计算机时间到底是怎么来的?程序员必看的时间知识!

参考文章&#xff1a;https://xie.infoq.cn/article/22d762b26daee8b3f404f60a6 <title>计算机时间到底是怎么来的&#xff1f;程序员必看的时间知识&#xff01;_操作系统_Kaito_InfoQ写作社区</title><meta name"description" content"大家好&…

【阿里云OSS: Java端提供签名,vue+elementUI+axios 实现直传文件到OSS 实例】

文章目录 java代码&#xff08;包含后端上传文件、删除文件、提供签名&#xff09;前端代码postman 测试截图 java代码&#xff08;包含后端上传文件、删除文件、提供签名&#xff09; {private final static String OSS_BUCKET_NAME "test";private final static …

Day06 Python入门必知必会

文章目录 第一章 Python环境搭建1.1. 计算机基础1.1.1. 什么是编程1.1.2. 什么是进制1.1.2.1. 进制的简介1.1.2.2. 进制的分类1.1.2.3. 进制的表示1.1.2.4. 进制的转换1.1.2.5. 原反补(了解)数据的转换负数的表示补码的引入 1.2. Python的介绍1.3. Python的安装与使用1.3.1. Py…

PMP证书能直接升级项目管理专业人员能力评价(CSPM)三级吗?

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

【6.14 代随_57day】 回文子串、最长回文子序列

回文子串、最长回文子序列 回文子串1.方法图解步骤代码 最长回文子序列1.方法图解步骤代码 回文子串 力扣连接&#xff1a;647. 回文子串&#xff08;中等&#xff09; 1.方法 确定dp数组以及下标的含义 dp数组是要定义成一位二维dp数组。 布尔类型的dp[i][j]&#xff1a;表示…

Three.js教程:光源对物体表面影响

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 光源对物体表面影响 实际生活中物体表面的明暗效果是会受到光照的影响&#xff0c;threejs中同样也要模拟光照Light对网格模型Mesh表面的影响。 你可以打开课件中案例源码&am…

5.2.12 IP分组的转发(三)

5.2.12 IP分组的转发&#xff08;三&#xff09; 示例&#xff1a;例&#xff1a;某网络拓扑如图所示&#xff0c;从图中我们可以看出该网络拓扑中有两个局域网&#xff0c;由两台路由器&#xff0c;其中路由器R1有两个以太网口&#xff0c;分别是E1和E2连接了两个局域网&…

这是我见过最通俗易懂的装饰者模式讲解!

关注“Java架构栈”微信公众号&#xff0c;回复暗号【Java面试题】即可获取大厂面试题 前言 本文主要讲述装饰者模式&#xff0c;文中使用通俗易懂的案例&#xff0c;使你更好的学习本章知识点并理解原理&#xff0c;做到有道无术。 什么是装饰者模式 装饰者模式是23种设计模式…

jmeter如何进行http压力测试

目录 前言&#xff1a; 1、添加线程组&#xff1a; 2、添加采样器&#xff1a; 3、添加监视器 压力测试知识说明 前言&#xff1a; JMeter是一个基于Java的开源压力测试工具&#xff0c;可用于评估Web应用程序的性能&#xff0c;包括HTTP、HTTPS、FTP、SOAP、Restful、JD…

试试前端自动化测试(基础篇)

众所周知的原因&#xff0c;前端作为一种特殊的 GUI 软件&#xff0c;做自动化测试困难重重。在快速迭代&#xff0c;UI 变动大的业务中&#xff0c;自动化测试想要落地更是男上加男 &#x1f436;。 近期的学习过程中&#xff0c;翻阅了众多前端自动化测试相关的文章&#xf…

JAVA中的拦截器、过滤器

JAVA变成拦截器、过滤器 一、拦截器1、简介说明2、源码及方法说明3、拦截器自定义应用 二、过滤器1、简介说明2、源码及方法说明3、过滤器的自定义应用 三、Springboot中的WebMvcConfigurer1、简介2、主要方法3、添加拦截器 四、区别1、原理2、触发3、其他 一、拦截器 1、简介…

Scala学习笔记

累了&#xff0c;基础配置不想写了&#xff0c;直接抄了→Scala的环境搭建 这里需要注意的是&#xff0c;创建新项目时&#xff0c;不要用默认的Class类&#xff0c;用Object&#xff0c;原因看→scala中的object为什么可以直接运行 一、Scala简介 1.1 图解Scala和Java的关系 1…

HQChart实战教程63-自定义手机端K线tooltip显示数据

HQChart实战教程63-自定义手机端K线tooltip显示数据 手机端K线tooltip步骤1. 配置手机端tooltip2. 替换k线tooltip格式化输出函数2. 格式化输出函数说明HQChart插件源码地址完整的demo源码手机端K线tooltip hqchart手机端内置一个tooltip,显示手势所在K线的信息。默认显示 日期…

了解D-Galactopyranose pentaacetate,CAS号25878-60-8的性质和应用

​ 中文名称&#xff1a;1,2,3,4,6-D-葡萄糖五乙酸酯 英文名称&#xff1a;D-Galactopyranose pentaacetate 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;25878-60-8 分子式&#xff1a;C16H22O11 分子量&#xff1a;390.34 熔点&#xff1a;113C 沸点&#xff1a;451C 密…

迷宫生成算法

迷宫生成 ① 十字分割 递归版本 ② BFS&#xff08;即广度算法&#xff09; 十字分割方法生成 要求初始时迷宫内全是通路&#xff0c;然后随机十字建墙&#xff0c;然后随机在三面墙上打洞&#xff0c;使四个子空间连通。 要求&#xff1a;十字点横纵坐标均要求为偶数&…

【unity】URP的shader开发中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 区别

项目里有一个其他同事实现的shader&#xff0c;美术那边希望能支持多个光源&#xff0c; 我一看代码里面&#xff0c; frag 函数里已经实现了 #ifdef _ADDITIONAL_LIGHTSuint pixelLightCount GetAdditionalLightsCount();for (uint lightIndex 0u; lightIndex < pixelL…

什么决定了我们的命运?

一、什么决定了我们的命运&#xff1f; 一个学生时代看起来特别优秀的人&#xff0c; 后来成了特别平凡的人&#xff1b; 而那时候看起来平淡无奇的一些人&#xff0c; 后来做出了一些似乎超越了他水平的事情。 不禁想问&#xff0c;到底是什么决定了我们的命运&#xff1f; 关…

Transformer在CV领域有可能替代CNN吗?

目前已经有基于Transformer在三大图像问题上的应用&#xff1a;分类&#xff08;ViT&#xff09;&#xff0c;检测&#xff08;DETR&#xff09;和分割&#xff08;SETR&#xff09;&#xff0c;并且都取得了不错的效果。那么未来&#xff0c;Transformer有可能替换CNN吗&#…

uniapp创建vue3项目(持续更新)

一.项目全局配置 1. 创建项目 使用Hbuilderx工具创建项目, 使用Hbuilderx工具创建项目&#xff0c;选择uni-ui项目模版&#xff0c;VUE3 2.底部菜单栏配置tabBar uniapp官网&#xff1a; 全局文件--pages.json页面路由 -- tabBar 项目文件&#xff1a;pages.json--文件底部…

MM32F3273G8P火龙果开发板MindSDK开发教程18 -sfud库的移植

MM32F3273G8P火龙果开发板MindSDK开发教程18 -sfud库的移植 1、sfud简介 SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库 推荐查看官方文档&#xff1a;一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2、实验设备 主控&#xff1a;MM32F3273G8P火龙…