【云原生 | 从零开始学Kubernetes】六、Kubernetes核心技术Pod

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 我们以具体实例来说,拉取策略就是 imagePullPolicy

上篇的知识补充


Pod镜像拉取策略


我们以具体实例来说,拉取策略就是 imagePullPolicy


拉取策略主要分为了以下几种


·IfNotPresent:默认,镜像在宿主机上不存在才拉取


·Always:每次创建Pod都会重新拉取一次镜像


·Never:Pod永远不会主动拉取这个镜像


Pod资源限制


也就是我们Pod在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod调度是使用的资源是 2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度


这里分了两个部分


·request:表示调度所需的资源


·limits:表示最大所占用的资源


Pod重启机制


因为Pod中包含了很多个容器,假设某个容器出现问题了,那么就会触发Pod重启机制


重启策略主要分为以下三种


·Always:当容器终止退出后,总是重启容器,用在nginx等,需要不断提供服务的情况。


·OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。


·Never:当容器终止退出,从不重启容器,适用于批量任务(只执行一次的任务)。


Pod健康检查


通过容器检查,原来我们使用下面的命令来检查


kubectl get pod


但是有的时候,程序可能出现了 Java 堆内存溢出,程序还在运行,但是不能对外提供服务了,这个时候就不能通过 容器检查来判断服务是否可用了


这个时候就可以使用应用层面的检查


存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy【重启策略】来操作


livenessProbe


就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除


readinessProbe


Pod调度策略


Pod 是 Kubernetes 中最基本的部署调度单元,可以包含 container,逻辑上表示某种应用的一个实例。例如一个 web 站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个 container 的 pod。


创建Pod流程


·首先创建一个pod,然后创建一个API Server 和 Etcd【把创建出来的信息存储在etcd中】


客户端提交创建 Pod 的请求,可以通过调用 API Server 的 Rest API 接口,也可以通过 kubectl 命令行工具。如 kubectl apply -f filename.yaml(资源清单文件)


apiserver 接收到 pod 创建请求后,会将 yaml 中的属性信息(metadata)写入 etcd。


apiserver 触发 watch 机制准备创建 pod,信息转发给调度器 scheduler,调度器使用调度算法选择 node,调度器将 node 信息给 apiserver,apiserver 将绑定的 node 信息写入 etcd.


·然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法,把pod调度某个node上


调度器用一组规则过滤掉不符合要求的主机。比如 Pod 指定了所需要的资源量,那么可用资源比 Pod 需 要的资源量少的主机会被过滤掉。


scheduler 查看 k8s api ,类似于通知机制。


首先判断:pod.spec.Node == null? 若为 null,表示这个 Pod 请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的 node。


然后将信息在 etcd 数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点) ps:同样上述操作的各种信息也要写到 etcd 数据库中


·在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点上的pod,然后通过docker创建容器


apiserver 又通过 watch 机制,调用 kubelet,指定 pod 信息,调用 Docker API 创建并启动 pod 内的容器。


创建完成之后反馈给 kubelet, kubelet 又将 pod 的状态信息给 apiserver, apiserver 又将 pod 的状态信息写入 etcd。


31.png


master 节点:kubectl -> kube-api -> kubelet -> CRI 容器环境初始化


节点亲和性


节点亲和性 nodeAffinity 和 之前nodeSelector 基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上


·硬亲和性:约束条件必须满足


·软亲和性:尝试满足,不保证


支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists


反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等


node 节点亲和性调度:nodeAffinity


[root@k8smaster ~]# kubectl explain pods.spec.affinity 
KIND: Pod 
VERSION: v1 
RESOURCE: affinity <Object> 
DESCRIPTION: 
  If specified, the pod's scheduling constraints 
  Affinity is a group of affinity scheduling rules. 
FIELDS: 
  nodeAffinity <Object> 
  podAffinity <Object> 
  podAntiAffinity <Object> 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity 
KIND: Pod 
VERSION: v1 
RESOURCE: nodeAffinity <Object> 
DESCRIPTION: 
Describes node affinity scheduling rules for the pod. 
Node affinity is a group of node affinity scheduling rules. 
FIELDS: 
preferredDuringSchedulingIgnoredDuringExecution <[]Object> 
requiredDuringSchedulingIgnoredDuringExecution <Object> 
prefered 表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性 
require 表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
KIND: Pod 
VERSION: v1 
RESOURCE: requiredDuringSchedulingIgnoredDuringExecution <Object> 
DESCRIPTION: 
FIELDS: 
nodeSelectorTerms <[]Object> -required- 
Required. A list of node selector terms. The terms are ORed. 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSe
lectorTerms 
KIND: Pod 
VERSION: v1 
RESOURCE: nodeSelectorTerms <[]Object> 
DESCRIPTION: 
 Required. A list of node selector terms. The terms are ORed. 
 A null or empty node selector term matches no objects. The requirements of 
 them are ANDed. The TopologySelectorTerm type implements a subset of the 
 NodeSelectorTerm. 
FIELDS: 
 matchExpressions <[]Object> 
 matchFields <[]Object> 
matchExpressions:匹配表达式的 
matchFields: 匹配字段的 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSe
lectorTerms.matchFields 
KIND: Pod 
VERSION: v1 
RESOURCE: matchFields <[]Object> 
DESCRIPTION: 
FIELDS: 
 key <string> -required- 
 values <[]string> 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions 
KIND: Pod 
VERSION: v1 
RESOURCE: matchExpressions <[]Object>
DESCRIPTION: 
FIELDS: 
 key <string> -required- 
 operator <string> -required- 
 values <[]string> 
key:检查 label 
operator:做等值选则还是不等值选则 
values:给定值 
例 1:使用 requiredDuringSchedulingIgnoredDuringExecution 硬亲和性 
在node1和2用docker拉取nginx镜像
[root@k8smaster ~]# vim pod-nodeaffinity-demo.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-node-affinity-demo 
  namespace: default 
    labels: 
      app: myapp 
      tier: frontend 
spec: 
  containers: 
  - name: myapp 
    image: nginx
  affinity: 
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
        nodeSelectorTerms: 
        - matchExpressions: 
        - key: zone 
          operator: In 
          values: 
            - foo 
            - bar 
我们检查当前节点中有任意一个节点拥有 zone 标签的值是 foo 或者 bar,就可以把 pod 调度到这个 node 节点的 foo 或者 bar 标签上的节点上 
[root@k8smaster ~]# kubectl apply -f pod-nodeaffinity-demo.yaml
[root@k8smaster ~]# kubectl get pods -o wide | grep pod-node 
pod-node-affinity-demo 0/1 Pending 0 k8snode
status 的状态是 pending,上面说明没有完成调度,因为没有一个拥有 zone 的标签的值是 foo 或者 bar,而且使用的是硬亲和性,必须满足条件才能完成调度 
[root@k8smaster ~]# kubectl label nodes xianchaonode1 zone=foo 
给这个 node 节点打上标签 zone=foo,在查看 
[root@k8smaster ~]# kubectl get pods -o wide 显示如下: 
pod-node-affinity-demo 1/1 Running 0 k8snode
例 2 使用 preferredDuringSchedulingIgnoredDuringExecution 软亲和性 
[root@k8smaster ~]# vim pod-nodeaffinity-demo-2.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-node-affinity-demo-2 
  namespace: default 
    labels: 
      app: myapp 
      tier: frontend 
spec: 
  containers: 
  - name: myapp 
    image: ikubernetes/myapp:v1 
  affinity: 
    nodeAffinity: 
      preferredDuringSchedulingIgnoredDuringExecution: 
    - preference: 
        matchExpressions: 
       - key: zone1 
         operator: In 
         values: 
         - foo1 
         - bar1 
           weight: 60 
[root@k8smaster ~]# kubectl apply -f pod-nodeaffinity-demo-2.yaml 
[root@k8smaster ~]# kubectl get pods -o wide |grep demo-2 
pod-node-affinity-demo-2 1/1 Running 0 k8snode1
上面说明软亲和性是可以运行这个 pod 的,尽管没有运行这个 pod 的节点定义的 zone1 标签 
Node 节点亲和性针对的是 pod 和 node 的关系,Pod 调度到 node 节点的时候匹配的条件 


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2
|
6天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
4天前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
6天前
|
Cloud Native 持续交付 云计算
云原生技术入门与实践
【10月更文挑战第37天】本文旨在为初学者提供云原生技术的基础知识和实践指南。我们将从云原生的概念出发,探讨其在现代软件开发中的重要性,并介绍相关的核心技术。通过实际的代码示例,我们展示了如何在云平台上部署和管理应用,以及如何利用云原生架构提高系统的可伸缩性、弹性和可靠性。无论你是云原生领域的新手,还是希望深化理解的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
|
4天前
|
弹性计算 Kubernetes Cloud Native
云原生技术的实践与思考
云原生技术的实践与思考
18 2
|
5天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用架构中的实践与思考
【10月更文挑战第38天】随着云计算的不断成熟和演进,云原生(Cloud-Native)已成为推动企业数字化转型的重要力量。本文从云原生的基本概念出发,深入探讨了其在现代应用架构中的实际应用,并结合代码示例,展示了云原生技术如何优化资源管理、提升系统弹性和加速开发流程。通过分析云原生的优势与面临的挑战,本文旨在为读者提供一份云原生转型的指南和启示。
19 3
|
4天前
|
边缘计算 Cloud Native 安全
云原生技术的未来发展趋势
云原生技术的未来发展趋势
16 1
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术在现代应用架构中的实践与挑战####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在实际项目中的应用案例,分析了企业在向云原生转型过程中面临的主要挑战及应对策略。不同于传统摘要的概述性质,本摘要强调通过具体实例揭示云原生技术如何促进应用的灵活性、可扩展性和高效运维,同时指出实践中需注意的技术债务、安全合规等问题,为读者提供一幅云原生技术实践的全景视图。 ####
|
6天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
26 1
|
4天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####