【云原生】k8s核心概念—Pod & Controller & Service & Serect & ConfigMap介绍——20230213

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【云原生】k8s核心概念—Pod & Controller & Service & Serect & ConfigMap介绍——20230213

一、Pod


1. pod概述

Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod提供存储等等,k8s 不会直接处理容器,而是 Pod。Pod 是由一个或多个 container 组成。


每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod还包含一个或多个紧密相关的用户业务容器,如下图。

808835eeae29428ca2373f0a6293eb4e.png

POD特性:

  1. 资源共享

一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如namespace,cgroups 或者其他的隔离资源。

多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod的 IP 进行通信。

一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上。

  1. 生命周期短暂

Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的Pod 没有半毛钱关系。

  1. 平坦的网络

K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其他 Pod 的 IP 地址来实现访问。


总结:

  • 最小部署单元
  • 包含多个容器(一组容器的集合)
  • 一个pod中容器共享网络命名空间(NameSpace)
  • pod是短暂的

(1)Pod vs 应用

每个 Pod 都是应用的一个实例,有专用的 IP。

(2)Pod vs 容器

一个 Pod 可以有多个容器,彼此间共享网络和存储资源,每个 Pod 中有一个 Pause 容器保存所有的容器状态, 通过管理 pause 容器,达到管理 pod 中所有容器的效果。

(3)Pod vs 节点

同一个 Pod 中的容器总会被调度到相同 Node 节点,不同节点间 Pod 的通信基于虚拟二层网络技术实现。

(4)Pod vs Pod

普通的 Pod 和静态 Pod。

①普通 Pod

普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,则会将这个 Node 上的所有 Pod 重新调度到其它节点上。

②静态 Pod

静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且kubelet 也无法对它们进行健康检查。


2. pod存在意义

  1. 创建容器使用docker,一个docker对应的是一个容器,一个容器有进程,一个容器运行一个应用程序
  2. pod是多进程设计,运行多个应用程序
    一个pod有多个容器,一个容器里面运行一个应用程序
    原因参考这篇文章
  3. pod存在为了亲密性
    ①两个应用之间进行交互
    ②网络之间调用
    ③两个应用需要频繁调用


3. Pod实现机制

1)共享网络

通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个namespace中,从而实现网络共享。

  • pod实现共享网络机制

①创建Pause容器(也叫info容器,也叫根容器)

②创建业务容器1,2,……

③业务容器一次加入到info容器(pause容器)中,创建出独有的IP,mac地址,port

使得所有业务容器在同一个namespace中,实现网络共享。

d25918478463440f973cce0d2dd6d057.png


2)共享存储

通过引用数据卷概念Volumn,使用数据卷进行持久化存储

  • pod实现共享存储机制

现有2个node节点

①node1中pod产生的数据会存储到数据卷中持久化存储

②node1宕机/挂掉后

③node1中的pod会到node2中继续运行,通过读取数据卷中存储的数据

从而实现持久化存储。

d334a14b0e94454f9f6ab86cb7ff2a0e.png

4. pod镜像拉取策略

f571efd869804ae18994e2e9310b8911.png

5. pod资源限制

817edf7f3141400b90736b1367247b9f.png

6. pod重启机制

以nginx为例,假如说我们现在创建了一个nginx服务,nginx在node1上运行,且未对nginx产生的数据做持久化存储(没有挂载)。如果因为某种情况使得node1宕机,nginx服务会被调度到node2上运行,相当于重新在node2上创建pod,这时候就需要重新拉取新的nginx镜像,重新部署nginx服务,node2里面也就没有nginx之前的数据了。

原因是因为配置文件中“imagePullPolicy:Always”这个设定。

ab7bd1e26c754e89b02df196e25075f6.png

7. pod健康检查

5bd043a6622546f5bcaeb102cf350638.png

8. 创建pod流程

e26c5efa78104b399b6d999afe01c21e.png


9. pod调度

1、影响调度的属性

pod资源限制对pod调度产生影响每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额

的计算资源有 CPU 与 Memory 两种,其中 CPU 的资源单位为 CPU 数量,是一个绝对值而非相对值。Memory 配额也是一个绝对值,它的单 位是内存字节数。


2、节点选择器标签影响pod调度

85c6b696ea62429687a578bf579ff42d.png

节点选择器工作流程⬇

41a32dc51ed74c188f68c777202ae80a.png

3、节点亲和性影响pod调度
节点亲和性 nodeAffinity 和之前 nodeSelector 基本一样的,根据节点上标签约束来绝对pod调度到哪些节点上。

6b1db24a5d8d49f6acd5d22b18eeb541.png

4、污点和污点容忍

33acd5b3c3924b58baf47fbd8bf784c4.png

d96ecf476f4d4a889ba803ec67496c9c.png


二、Controller


1. 什么是Controller

在集群上管理和运行容器的对象

2. Pod和Controller关系

(1)Pod是通过Controller实现应用的运维,比如伸缩、滚动升级等等

(2)Pod和Controller之间通过label标签关系

3. deployment应用场景

(1)部署无状态应用

(2)管理Pod和ReplicaSet

(3)部署,滚动升级等功能

应用场景:web服务,微服务

4. 使用deployment部署应用(yaml)

# 第一步:导出yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
# 第二部:使用yaml部署应用
kubectl apply -f web.yaml
# 第三部:对外发布(暴露对外端口号)
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml
kubectl get pods,svc
# ip+端口能否访问nginx


5. 应用升级回滚和弹性伸缩

# 应用升级
kubectl set image deployment web nginx=nginx:1.15
# 查看升级状态
kuectl rollout status deployment web
# 查看升级版本
kubectl rollout history deployment web
# 回滚到上一个版本
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
# 弹性伸缩
kubectl scale deployment web --replicas=10


6. StatefulSet 部署有状态应用——无状态和有状态

(1)无状态:

①认为Pod都是一样的

②没有顺序要求

③不用考虑在哪个node运行

④随意进行伸缩和扩展

(2)有状态

上面因素都要考虑到

①让每个Pod都是独立的,保持pod启动顺序和唯一性

②唯一的网络标识符,持久储存

③有序,比如MySQL主从


7. 部署有状态应用

  • 无头service:通俗讲就是将ClusterIP值设为none,即ClusterIP:none
    (1)StatefulSet部署有状态应用

73902b9a60e0413f946f66b8224471fa.png

9886708ca4ed41c0b2b82408ff28ec60.png

a0c0630b3a574b7c8c58bcffd8e591bf.png

8. 部署守护进程DaemonSet

(1)在每个node上运行一个pod,新加入的node也同样在一个pod里面

例子:在每个node节点安装数据采集工具

4b1c5d1d93c44a9ea18e2af660aeb40c.png

9. job(一次性任务)

10. cronjob(定时任务)


三、service

1. Service存在意义

(1)防止Pod失联(服务发现)

(2)定义一组Pod访问策略(负载均衡)

7adfef5b604c4f989dd17d5a96b4f074.png

2. Pod和Service关系

根据label和selector标签建立关联

ea026624130f4b94a51ac902626961be.png

3. 常用Service类型

(1)ClusterIP:集群内部使用

(2)NodePort:对外访问应用使用

(3)LoadBalancer:对外访问应用使用,公有云

node内网部署应用,外网一般不能访问到的

  • 找到一台可以进行外网访问机器,安装nginx,反向代理
    ** 手工把可以访问节点添加到nginx里面
    LoadBalancer:公有云,把负载均衡,控制器


四、配置管理—Serect

作用:加密数据,存在etcd里面,让pod容器以挂载Volume方式进行访问。

场景:凭证

  1. 创建serect加密数据

9d11739bd3b64055a604206611e07968.png

2、以变量形式挂载到容器中

kubectl exec:在指定容器内执行命令

adb2d529b6e3496ba99e8452260972eb.png

3、以Volume形式挂在到Pod容器中

135c4f07bdde4a19a0404b045e5cf067.png

五、配置管理—ConfigMap


作用:存储不加密数据到etcd,以变量或者Volume挂载到pod容器中。

场景:配置文件

  1. 创建配置文件
  2. 创建configmap

924f05a0445f4bdfba8c533609b26bb7.png

以Volume挂载到pod容器中

e2467ff2678a41fd9fd82bb85090ae14.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
97 2
|
2天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
18 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
12天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
70 24
|
14天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
89 6
|
28天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
1月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
65 1
|
1月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####