当前位置:   article > 正文

k8s知识点_maxsurge

maxsurge

1 学习 Kubernetes路径

  1. 了解 Docker。Kubernetes 是一个容器编排平台,因此你需要先了解 Docker 容器的概念和使用方法。
  2. 学习 Kubernetes 基础概念。包括 Pod、Service、Deployment、Node 等概念的含义和用法等。
  3. 学习 Kubernetes 的 YAML 配置文件语法。你需要学习如何编写 Kubernetes 的 YAML 文件来定义 Pod 和 Deployment 等资源对象。
  4. 熟悉 Kubernetes 的命令行工具 kubectl。这是 Kubernetes 的主要命令行工具之一,你需要熟练掌握 kubectl 的使用方法。
  5. 学习 Kubernetes 资源编排模型。包括 Replication Controller、ReplicaSet、Deployment 等资源对象,以及资源的创建、扩容、缩容、滚动升级等操作。
  6. 学习 Kubernetes 的服务发现和负载均衡机制。Kubernetes 能够自动管理容器网络和服务发现,你需要了解 Service、Ingress 等对象的定义和使用。
  7. 学习 Kubernetes 中的存储管理。Kubernetes 支持多种存储类型,包括本地存储、云存储、网络存储等。
  8. 掌握 Kubernetes 中的调度和自动扩展机制。Kubernetes 提供丰富的调度和自动扩展机制,你需要了解如何配置和使用这些机制。
  9. 了解 Kubernetes 中常用的附加工具。例如 Helm、Istio、Prometheus、Grafana 等,它们能够更方便的对 Kubernetes 集群进行管理和监控。

总之要想真正掌握 Kubernetes,需要不断学习练习、深入了解其中的原理和机制,并结合实际场景灵活使用 Kubernetes。

2 Kubernetes 基础概念

Kubernetes 是 Google 团队开源的一个容器编排和管理工具,它被广泛应用于云原生应用场景中。在学习 Kubernetes 之前,首先需要了解以下几个基础概念:

  1. Pod:是 Kubernetes 最小的调度单位,它是一组容器的集合,这些容器共享一个网络命名空间和存储卷。Pod 中的容器通常一起运行,它们共享应用的资源和生命周期,并且可以通过容器间的 IPC 通信。

  2. Node:是 Kubernetes 集群中运行着容器化应用的三层体系结构中最底层的计算节点,也是 Kubernetes 架构中的基础节点。Node 可以是物理机,也可以是虚拟机,它负责运行容器并提供计算、存储、网络和监控等基础设施支持。
    Node 是 Kubernetes 中一个基本的概念,指的是 Kubernetes 集群中的一台物理或虚拟机器,也可以是一台裸机或云服务器,通常用于运行和承载容器。

  3. Service:负责将一组 Pod 组成的逻辑应用暴露为 Kubernetes 网络中的一个服务,便于其他 Pod 或 Service 访问。Service 可以通过 Cluster IP、Node IP 和 LoadBalancer 等方式对外提供服务,并支持负载均衡和动态服务发现。

  4. Label:是 Kubernetes 中一种用于标识 Pod、Service 或其他资源对象的元数据标签,可以定义多个键值对组成的标签集合,并且可以通过 label selector 来选择与之匹配的资源对象。

  5. Namespace:是 Kubernetes 中一种逻辑隔离单元,用于将一组相关的资源对象划分到一个以名称为标识的工作空间中。每个 Namespace 都有自己的一套资源对象,例如 Pod、Service、ConfigMap 等。

  6. Volume:是 Kubernetes 中一种抽象的存储卷,用于提供独立于容器的持久化存储,可以将外部数据挂载到 Pod 中运行的容器内部,也可以共享 Pod 内部的数据存储。

除此之外,还有一些比较重要的概念,包括 Deployment、StatefulSet、ReplicaSet、Job、DaemonSet 等,不同的概念在不同的场景下拥有不同的作用。了解这些基础概念后,在实际应用中也可以更好地使用 Kubernetes 进行容器编排和管理。

2.1 Pod

学习 Kubernetes Pod 部分需要掌握以下几个方面的知识:

  1. Pod 的概念和特点

Pod 是 Kubernetes 中最小的调度单元,它是一个或多个紧密关联的容器的组合。Pod 具有以下特点:同一个 Pod 中的容器共享网络和存储,并能够轻松通信和协作。

  1. Pod 的生命周期和管理

1)理解 Pod 的状态和转换
Kubernetes 中的 Pod 状态主要有以下几种:

  1. Pending:即等待调度,Pod 的容器还没有分配到节点上。

  2. Running:即运行中,Pod 的容器已经被分配到节点上并且在运行。

  3. Succeeded:即完成,Pod 的容器已经执行完任务并退出,但是 Pod 的状态仍然可查询。

  4. Failed:即失败,Pod 的容器因为某种原因退出并且被 Kubernetes 重新启动,或者被删除,但是 Pod 的状态仍然可查询。

  5. Unknown:即未知,Pod 的状态无法被确定,通常是与集群通信失败,或者 Pod 在集群内不可识别造成的。

Pod 的状态转换是通过控制器(如 ReplicaSet、Deployment、DaemonSet 等)对 Pod 的控制,从而达到预期的状态。

  1. ReplicaSet:用来管理多个 Pod 的副本数量,当 Pod 的数量少于预期数量时,ReplicaSet 会自动创建新的 Pod 副本。当 Pod 数量多于预期时,ReplicaSet 会删除多余的 Pod。
  2. Deployment:基于 ReplicaSet 实现的控制器,用于实现 Pod 的滚动更新和回滚,以及管理应用的更新策略。Deployment 可以控制多个 ReplicaSet 并保持 Pod 的数量不变。

Deployment 控制器通过 ReplicationController 和 ReplicaSet 来创建和管理 Pod,使用 Deployment 控制器可以实现以下特性:

  1. 滚动更新(Rolling Updates):在保证服务的可用性的前提下,将应用的新版本无缝地应用到现有的 Pod,从而实现应用的平滑升级。
  2. 回滚(Rollback):当应用的新版本出现问题,可以通过回滚操作恢复到之前的版本。Deployment 可以自动回滚到先前的 Pod 副本,以便快速恢复原来的工作状态。 实际使用中,可以通过以下方法来进行 Deployment 的滚动更新和回滚操作:
  1. 滚动更新:在应用新版本之前,先通过 Deployment 指定的策略(如滚动更新策略)确定新版本的 Pod 副本需要保持的最小和最大数量,以及更新的最大并行度等参数。然后,Deployment 将自动更新 Pod 副本的数量,并逐步替换老旧 Pod 副本,直至完成全量更新。这样可以保证在更新过程中服务的稳定性和可用性。
  2. 回滚:当新版本出现问题时,可以通过几个简单的命令回滚到之前可工作版本中,Deployment 会自动将失败的 Pod 副本删除,同时恢复旧版本的 Pod 副本,以便快速解决问题并保障服务的稳定性。

总之,Deployment 向 Kubernetes 提供了管理服务的高级机制,使服务的部署、修补和更新变得更加安全、可靠和高效。

Deployment 控制器可以管理应用的更新策略,以确保应用的高可用性和平滑升级。具体而言,Deployment 控制器提供以下两种更新策略:

  1. RollingUpdate:滚动更新策略会在应用程序更新时逐步更新 Pod 副本。在进行滚动更新过程中,Deployment 控制器会控制新旧 Pod 副本的比例,逐步将旧的 Pod 副本替换为新的 Pod 副本,从而实现无缝升级。
    对于 RollingUpdate 策略,需要指定一些参数,包括:
  • maxSurge:表示可创建的超出设置的副本数,用于替换旧 Pod。
  • maxUnavailable:表示更新期间可以关闭的最大运行 Pod 数量。
  1. Recreate:重建策略在更新时会直接删除所有旧的 Pod 副本,然后创建新的 Pod 副本。这会导致应用程序停机时间更长,但它会确保应用程序进行了完整的重建。
    对于 Recreate 策略,只需要设置 updatingStrategy=Recreate 即可。可以通过 Kubernetes 的 API 或 kubectl 命令行工具等管理应用的更新策略及其参数。在实际使用中,应根据应用程序的特性和业务需求,选择合适的更新策略来管理应用程序的部署和更新。

2)了解如何通过 Pod Spec 进行 Pod 编排、管理和监控

在 Kubernetes 中,Pod Spec 是定义 Pod 的配置文件,它包含了 Pod 的所有信息,例如容器镜像、容器数量、容器启动命令、容器资源请求和限制等。通过 Pod Spec,可以对 Pod 进行编排、管理和监控。
以下是一些常见的 Pod Spec 字段:

  • metadata:包含 Pod 的元数据信息,例如名称、标签等。
  • spec:包含 Pod 的具体配置信息,例如容器镜像、容器数量、容器启动命令、容器资源请求和限制等。
  • restartPolicy:指定 Pod 失败后的重启策略。
  • terminationGracePeriodSeconds:指定 Pod 终止前等待的时间。
  • schedulerName:指定调度器名称。
  • affinity:指定 Pod 之间的亲和性规则。
  • tolerations:指定 Pod 对其他 Pod 的容忍程度。

3)如何使用 Kubernetes API、kubectl 等工具来管理和操作 Pod

使用 Kubernetes API、kubectl 等工具可以对 Pod 进行管理和操作。以下是一些常见的操作:

  • 创建 Pod:使用 kubectl 命令行工具创建 Pod,例如 kubectl create pod my-pod
  • 查看 Pod:使用 kubectl 命令行工具查看 Pod 的状态和详细信息,例如 kubectl describe pod my-pod
  • 更新 Pod:使用 kubectl 命令行工具更新 Pod,例如 kubectl patch pod my-pod --type json
  • 删除 Pod:使用 kubectl 命令行工具删除 Pod,例如 kubectl delete pod my-pod

此外,Kubernetes 还提供了其他一些工具来管理和操作 Pod,例如 kubeletkubectl applykubectl scale 等。这些工具可以帮助用户更好地管理 Kubernetes 集群中的资源,并确保应用程序的高可用性和高性能 。

  1. DaemonSet:用来在 Kubernetes 集群的每个节点上运行一个 Pod 副本,这种控制器通常用于部署对集群服务进行监控或日志采集的容器。

在 Kubernetes 集群中,可以使用 DaemonSet 来运行特定的容器,以在集群中的每个节点上收集特定的监控或日志信息。DaemonSet 会尽可能地自动创建 Pod,以确保在每个节点上都运行指定数量的容器。
在实现这种容器部署的过程中,通常需要执行以下步骤:

  1. 定义 DaemonSet:使用 YAML 文件或 Kubernetes API 配置文件定义要运行的容器和它们的参数,包括镜像名称、容器命令、容器端口等等。

例如,以下是一个简单的 YAML 文件示例,用于部署一个能够收集主机日志的容器:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-collector
spec:
  selector:
    matchLabels:
      app: log-collector
  template:
    metadata:
      labels:
        app: log-collector
    spec:
      containers:
      - name: log-collector
        image: mylogcollector:latest
        command: ["/bin/sh"]
        args: ["-c", "tail -f /var/log/messages"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. 创建 DaemonSet:使用 kubectl apply 命令将 YAML 文件中定义的 DaemonSet 创建到 Kubernetes 集群中。
    $ kubectl apply -f log-collector.yaml
  2. 查看 DaemonSet:可以使用 kubectl get 命令查看 DaemonSet 的状态及其运行的 Pod。
    $ kubectl get daemonset
    $ kubectl get pods -l app=log-collector

最终,部署完成后,每个节点上都会启动一个指定的容器,并且所有容器的日志信息都可以被收集和汇聚到中央集中式存储,以便后续分析和处理。
需要注意的是,在创建 DaemonSet 时,必须确保它的适用范围不会与其他控制器冲突,否则可能会导致部署错误或冲突,在实践中,可以根据实际需求和集群情况进行选择和配置。

在 Kubernetes 中,DaemonSet 是用于在集群中每个节点上运行一个 Pod 副本的控制器。因为 DaemonSet 需要在每个节点运行一个 Pod 副本,所以如果将它的作用范围与其他控制器冲突,就可能导致 Pod 副本数超出节点的实际限制,严重的情况甚至会因此影响整个集群的稳定运行。
比如,如果在同一个节点上同时运行了两个 DaemonSet 控制器,并且它们的 Pod 名称/配置相同,那么将会出现两个同名的 Pod 在同一个节点上运行的情况,这显然是不合理的。
另一方面,在同一个节点上同时运行多个 DaemonSet 还会对节点的资源(如 CPU、内存)造成不合理的压力,特别是当节点的资源较少时,这种情况更加明显。
因此,为了保证集群的稳定性和正常运行,创建 DaemonSet 的作用范围必须与其他控制器相互独立,且不会有重叠的部分。同时,还需要合理规划节点的资源和容量,以便容纳和支持 DaemonSet 中需要运行的 Pods。
在实际使用中,可以使用 label selector 来选择 DaemonSet 控制器的作用范围,避免与其他控制器冲突。比如,可以创建一个 Kubernetes nodes 的 label,然后在 DaemonSet 对象中使用该标签选择器来选择管理哪些节点。这样可以确保每个 DaemonSet 控制器只在其作用范围内运行 Pod,避免了与其他控制器的冲突和节点资源的浪费。

  1. StatefulSet:用于管理有状态应用(如数据库)的控制器,这些应用通常需要满足严格的顺序访问、固定的存储位置和唯一的网络标识等特性。

在 Kubernetes 中,StatefulSet 是用于管理容器化有状态应用程序的一种控制器。相比于 Deployment 等无状态应用的控制器,StatefulSet 需要保证有状态应用程序的唯一标识性、顺序性等特点。
对于有状态应用程序(如数据库),它们需要一个唯一的身份和可预见的持久化存储。而 StatefulSet 是基于标识符有序启动容器的控制器,可以为每个有状态应用程序提供一个唯一的网络标识符和标识持久存储的有序名称。基于这些特点,StatefulSet 在管理有状态应用程序时需要完成以下几个任务:

  1. 为每个有状态应用程序分配唯一的网络标识符(即 hostname)。
    可以在 StatefulSet 的配置文件中设置 Pod 的 hostname,这样每个 Pod 的网络标识符就会是 $(statefulset name)-$(ordinal index)
  2. 确保有序启动和删除有状态应用程序。
    StatefulSet 保证有序启动和删除有状态应用程序,即首先启动或删除索引较小的 Pod,并且等待 Pod 完全启动或删除后再启动或删除索引较大的 Pod。
  3. 确保有状态应用程序数据的持久化存储。
    StatefulSet 支持使用 Persistent Volumes 来为应用程序提供持久化存储,可以通过配置 volumeClaimTemplates 字段将 PV 挂载到 Pod 的指定目录。
    以下是一个基本的 StatefulSet 的配置文件示例,用于管理 MySQL 数据库。
apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: mysql
spec:
 selector:
   matchLabels:
     app: mysql
 serviceName: mysql
 replicas: 3
 template:
   metadata:
     labels:
       app: mysql
   spec:
     hostName: mysql
     containers:
    - name: mysql
     image: mysql:5.7
       env:
       - name: MYSQL_ROOT_PASSWORD
         value: password
       ports:
       - containerPort: 3306
         name: mysql
      volumeMounts:
       - name: mysql-persistent-storage
         mountPath: /var/lib/mysql
 volumeClaimTemplates:
 - metadata:
     name: mysql-persistent-storage
   spec:
     accessModes: [ "ReadWriteOnce" ]
     resources:
       requests:
         storage: 10Gi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在配置文件中,指定了 StatefulSet 的名称、选择器、服务名称和副本数量。每个 Pod 的 hostname 为 mysql-[0-2],并使用了三个副本。MySQL 数据库容器使用了一个名为 mysql-persistent-storage 的卷进行了持久化存储,并使用了一个名为 MYSQL_ROOT_PASSWORD 的环境变量设置了数据库的密码。
通过 StatefulSet,可以方便地管理有状态应用程序,并且可以提供更高的可用性和可靠性。

控制器是 Kubernetes 中的一种重要组件,它用来管理 Pod 的创建、更新、复制和扩展等操作,从而实现对应用的灵活部署和管理,避免了手动进行 Pod 的管理和操作。
通过控制器实现对 Pod 的控制,可以减少手动操作的错误和风险,使应用更加容易部署和管理。在实践中,需要结合集群的实际情况和应用的需求,选择适合自己的控制器进行使用和管理。
比如,将 Pod 的状态从 Pending 转换为 Running,就需要先进行容器调度,然后将容器放置在 Kubernetes 中的 Node 上并启动容器。如果某个 Node 上的容器因意外错误退出,控制器将会启动一个新的容器来替代它,从而保持 Pod 的期望状态。

Pod 的控制器会根据 Pod 的期望状态来自动进行调节,保证 Pod 总能保持在期望状态。例如,如果一个 Pod 中的某个容器失败,控制器会立即将其重启或清除并重新启动新的容器。如果节点上有故障,Pod 的控制器负责将其调度到可用节点上,以便恢复正常运行。

  1. Pod 的控制器

Pod 控制器是 Kubernetes 中用于创建、更新和删除 Pod 的组件,它可以保证 Pod 的期望状态和实际状态一致,常用的控制器包括 ReplicaSet、Deployment、StatefulSet、DaemonSet 等。

创建 Pod 副本:Pod 控制器可以按照指定的 Pod 配置,创建指定数量的 Pod 副本,并将它们分配到集群中的不同节点上。
$ kubectl create -f replicaset.yaml
$ kubectl create -f deployment.yaml
$ kubectl create -f statefulset.yaml
更新 Pod 副本:Pod 控制器可以根据指定的更新策略,在更新过程中自动替换旧的 Pod 副本,以实现无缝的应用程序升级。
$ kubectl set image replicaset my-replicaset nginx=nginx:1.8
$ kubectl set image deployment my-deployment nginx=nginx:1.9
缩减 Pod 副本:Pod 控制器可以按需缩减 Pod 副本数量,释放闲置资源并提高集群的效率。
$ kubectl scale rs my-replicaset --replicas=2
$ kubectl scale deployment my-deployment --replicas=2
删除 Pod 副本:Pod 控制器可以根据需求,从集群中删除 Pod 副本,以清理不必要的资源。
$ kubectl delete rs my-replicaset
$ kubectl scale deployment my-deployment --replicas=0
$ kubectl delete statefulset my-statefulset

  1. Pod 的存储和网络
    了解如何为 Pod 分配存储,包括使用 emptyDir、hostPath、PersistentVolumeClaim 等存储方式。此外,学习如何让 Pod 访问网络资源和提供服务,如通过 Service、Ingress 等方式进行网络代理和负载均衡。

1)Pod 的存储和网络

  • EmptyDir:空目录卷,会在 Pod 创建时创建一个空目录,任何容器都可以向其中写入和读取数据,一旦 Pod 被删除,该卷也会被删除。
  • HostPath:主机路径卷,可以将主机文件系统上的目录或文件挂载到 Pod 中,所有容器都可以访问这些文件。
  • PersistentVolumeClaim(PVC):持久化存储卷声明,用于申请持久化存储资源,包括本地存储和网络存储(如 NFS、AWS EBS、GCE PD、Azure Disk 等)。
  • ConfigMap:配置文件卷,用于将应用程序配置信息以文件或环境变量的形式传递给容器。
  • Secret:私密信息卷,用于安全地传递敏感信息(如密码、证书等)给容器。

2)如何为 Pod 分配存储

为了为 Pod 分配存储,可以使用 Kubernetes 中的 Volumes(卷)。Volume 是 Kubernetes
中的一种抽象概念,用于将磁盘或其他持久性存储附加到容器中,从而提供持久性存储。

以下是给 Pod 分配存储的步骤:

  1. 创建一个 Volume

可以使用 Kubernetes 中的各种类型的卷,例如 EmptyDir、HostPath、ConfigMap 和 Secret 等。

例如,可以使用 EmptyDir 类型的卷来为 Pod 分配存储:

apiVersion: v1 
kind: Pod 
metadata:   
	name: my-pod 
spec:  
	containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-volume
          mountPath: /data   
      volumes:
    	- name: my-volume
      	emptyDir: {} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. 在 Pod 中挂载 Volume

需要在 Pod 中声明 Volume,并在容器的 volumeMounts 属性中指定所需的挂载点。例如,在上面的示例中,我们将 my-volume 挂载到 /data 目录下。

  1. 保存数据到 Volume 中

当 Pod 启动时,Kubernetes 会为 Volume 分配存储空间,并将其挂载到容器中。容器可以像访问本地文件系统一样访问 Volume 中的数据。

需要注意的是,不同的 Volume 类型在容器重启或 Pod 迁移时的行为也可能会不同,需要根据应用程序的需要选择适当的 Volume 类型,以确保数据的持久性和可靠性。

另外,如果希望使用持久化存储来为 Pod 分配存储,可以使用 PersistentVolumeClaim(PVC)机制来申请存储资源。PVC 可以引用各种类型的存储后端,如本地存储、网络存储(如 NFS、AWS EBS、GCE PD、Azure Disk 等)等。使用 PVC 可以让 Pod 和存储资源的管理和配置分开,从而提高应用程序的可靠性和可维护性。

使用 PVC 的步骤如下:

  1. 配置 StorageClass
    Kubernetes 中的 StorageClass 定义了存储类别,可以包括存储类型、存储大小、存储位置等信息。在创建 PVC 之前,需要先配置 StorageClass,在其中指定要使用的存储类型和参数。例如,下面是一个使用 NFS 存储的 StorageClass 配置示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-nfs
provisioner: nfs-client
parameters:
  nfs-share: "10.0.0.1:/mydata"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 创建 PVC
    可以在 Pod 的 YAML 中定义 PVC,或者使用 kubectl 命令创建 PVC。例如,下面是一个创建 PVC 的 kubectl 命令示例:
kubectl apply -f my-pvc.yaml
  • 1

其中,my-pvc.yaml 文件内容如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: my-nfs
  resources:
    requests:
      storage: 10Gi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过这个 PVC,可以申请和保留 10GB 的存储空间,并且可以让 Pod 以 ReadWriteOnce(单节点读写)的方式访问这个存储空间。
3. 在 Pod 中使用 PVC
在 Pod 的 YAML 中,可以声明需要使用的 PVC,并将其挂载到容器中,例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-pvc
          mountPath: /data
  volumes:
    - name: my-pvc
      persistentVolumeClaim:
        claimName: my-pvc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

通过这个容器,可以访问 PVC 中的存储空间。

3)Pod 网络机制:

Pod 可以使用 Kubernetes 的服务(Service)来封装网络。Service 提供了一组 Pod 的稳定访问入口,并与一个
IP 地址和端口相关联。通过 Service,其他 Pod 或客户端可以通过域名或 IP 地址和定义的端口来访问 Pod 集合中的所有容器。

可以使用 spec.selector 字段将 Service 关联到 Pod 集合中。例如:

apiVersion: v1 
kind: Service 
metadata:   
	name: my-service 
	spec:  
		selector:
    		app: myapp   
    	ports:
  			- name: http
    		port: 80
    		targetPort: 8080 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上述配置将创建一个名为 my-service 的服务,并将该服务与标签为 app=myapp 的 Pod 关联。服务使用端口号 80 并将请求转发到 Pod 中端口号为 8080 的接收程序。

除了 Service,还可以使用 Ingress 来管理 Pod 集合的路由。它允许对 Pod 进行更细粒度的访问控制和路由,可以将流量转发到不同的后端 Pod 上,或者针对不同的路径和 URL 使用不同的后端服务。

4)如何让 Pod 访问网络资源和提供服务

在 Kubernetes 中,可以使用以下方式让 Pod 访问网络资源和提供服务:

  1. 使用 Service

Service 是 Kubernetes 中的一种抽象概念,用于将 Pod 封装为一组虚拟服务,通过一个虚拟 IP
地址提供服务访问入口,同时支持负载均衡和自动服务发现等功能。Service 可以通过选择器(selector)来选择一组符合条件的
Pod。例如,在下面的示例中,我们创建了一个名为 my-service 的 Service,并选择了标签 app=nginx 的 Pod:

apiVersion: v1 
kind: Service 
metadata:   
	name: my-service
	spec:   
	selector:
    	app: nginx   
    	ports:
    	- name: http
      	port: 80
      	targetPort: 80 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过这个 Service,可以使用 my-service:80 来访问这些 Pod,并且可以自动进行负载均衡和服务发现。

  1. 使用 Ingress

Ingress 可以将传入的请求路由到一组 Service 的规则集,以提供 HTTP 和 HTTPS 访问服务。Ingress
可以通过配置路由规则、HTTPS 证书、SSL 重定向等方式来提供 HTTP 和 HTTPS
访问服务。例如,在下面的示例中,我们创建了一个名为 my-ingress 的 Ingress,并配置了一个路由规则,将 /nginx
路径的请求转发到名为 my-service 的 Service:

 apiVersion: networking.k8s.io/v1 
 kind: Ingress 
 metadata:  
name: my-ingress 
spec:   
rules:
    - http:
        paths:
          - path: /nginx
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  name: http 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

通过这个 Ingress,可以使用 http:///nginx 来访问这个
Service,并且可以根据路由规则自动转发请求。

  1. 直接暴露 Pod

在某些情况下,也可以直接将 Pod 暴露出来,让其直接对外提供服务。可以使用 NodePort、LoadBalancer 或者
ExternalIP 等方式来实现。例如,在下面的示例中,我们创建了一个名为 my-pod 的 Pod,并通过 NodePort 类型的
Service 将其暴露出来:

apiVersion: v1 kind: Pod 
metadata:   
name: my-pod   
labels:
    app: nginx 
    spec:   
    containers:
    - name: my-container
      image: nginx
      ports:
        - name: http
          containerPort: 80
--- apiVersion: v1 
	kind: Service 
metadata:   
name: my-nodeport 
spec:   selector:
    app: nginx   ports:
    - name: http
      port: 80
      targetPort: 80   
      type: NodePort
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

通过这个 Service,可以使用 http://: 来访问这个 Pod,并且可以直接对外提供服务。

需要注意的是,使用 Service 和 Ingress 可以让 Pod
更加灵活地提供服务,并且可以根据需要进行扩展和管理。在设计服务方案时,需要根据应用程序的需要选择适当的方式,以确保服务的可靠性和可扩展性。

  1. 安全性及其他主题

学习如何使用 Kubernetes 的安全机制来保护 Pod,如使用 PodSecurityPolicy。同时,还需掌握 Pod 的扩容和缩容策略、Pod 的监控和日志收集,以及 Pod 的预定义执行策略和容器镜像管理等。
Kubernetes 提供了一系列的安全机制,来保护 Pod 的安全性和可靠性。以下是几个常见的措施:
1)如何使用 Kubernetes 的安全机制来保护 Pod

1. 特权模式

特权模式(privileged mode)允许容器访问主机的特权操作,可能会导致系统的安全性降低。为了避免这种情况,Kubernetes 允许禁用特权模式,并通过 podSecurityPolicy 对象来管理 Pod 安全策略。

例如,下面的 podSecurityPolicy 可以禁用特权模式:

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy 
metadata:  
	name: default 
	spec:   
		privileged: false   
# other security-related
configuration 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2. 安全上下文

可以使用安全上下文(security context)来指定 Pod 的安全策略。安全上下文中包含了容器的 UID、GID、SELinux 等相关信息。这些信息可以限制容器的操作权限,提高容器的安全性。

例如,下面的 YAML 文件配置了一个安全上下文,限制容器的权限:

apiVersion: v1 
kind: Pod 
metadata:   
	name: nginx   
	labels:
    	app: nginx 
spec:   
    securityContext:
   		runAsUser: 1000
    	runAsNonRoot: true   
	containers:
  	- name: nginx
    	image: nginx
    	ports:
    	- containerPort: 80 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面的配置中,securityContext 指定了容器的 runAsUserrunAsNonRoot 权限,这将限制容器运行时的权限,并提高容器的安全性。

3. 网络策略

Kubernetes 的网络策略(network policies)可以在 Pod 和 Service 级别限制网络流量的传输,从而增强
Pod 的安全性。

例如,下面的 YAML 文件限制了 default 命名空间内 my-nginx 的 Pod 只能接收来自其他命名空间的 TCP
流量,其他类型的流量都将被阻止:

apiVersion: networking.k8s.io/v1 
kind: NetworkPolicy 
metadata:
	name: test-network-policy   
	namespace: default 
spec:   	
	podSelector:
    	matchLabels:
      		app: my-nginx   
    policyTypes:
  	- Ingress   
  	ingress:
  	- from:
    	- namespaceSelector:
        matchLabels:
          name: allow-from-namespace
    	- podSelector:
      	  matchLabels:
          	role: db
    ports:
    - protocol: TCP
      port: 80 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

上述配置中,policyTypes 指定了限制入站流量,只允许来自 allow-from-namespace 命名空间或具有
role: db 标签的 Pod 的 TCP 流量传输。其他类型的流量都将被拦截。

2)如使用 PodSecurityPolicy

PodSecurityPolicy 是一种 Kubernetes 对象,用于限制 Pod 的安全策略。通过定义 PodSecurityPolicy,可以确保集群中所有的 Pod 都遵循指定的安全策略,从而增强 Pod 的安全性。

以下是使用 PodSecurityPolicy 的基本步骤:

  1. 创建 PodSecurityPolicy

首先,需要创建一个 PodSecurityPolicy 对象,该对象定义了安全策略的规则,比如禁止使用特权模式、只使用受信任的镜像等。例如,下面是一个 PodSecurityPolicy 对象的示例:

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy 
metadata:  
	name: restricted 
spec:   
	privileged: false   
	allowPrivilegeEscalation:false   
# other security-related 
configuration 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这个示例中,PodSecurityPolicy 禁用特权模式和特权升级。这表示 Pod 中的容器不会以特权方式运行。

  1. 授予 Pod 使用 PodSecurityPolicy

接下来,需要将 PodSecurityPolicy 授予使用它的用户或服务账户。可以通过 ClusterRoleBinding 或 RoleBinding 将 PodSecurityPolicy 绑定到用户或服务账户。例如,下面的 ClusterRoleBinding 将 production-deployer 服务账户与 restricted PodSecurityPolicy 绑定:

 kind: ClusterRoleBinding 
 apiVersion: rbac.authorization.k8s.io/v1beta1 
 metadata:   
 	name:read-secrets-clusterrolebinding 
 	subjects:
	- kind: ServiceAccount   
	name: production-deployer   
	namespace: default 
roleRef:   
	kind: PodSecurityPolicy   
	name: restricted  
	apiGroup: extensions 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这个示例中,restricted PodSecurityPolicy 被绑定到 production-deployer 账户,该账户只有在 default 命名空间中的 Pod 上下文中才能使用 restricted PodSecurityPolicy。

  1. 在 Pod 中使用 PodSecurityPolicy

最后,在 Pod 的定义中引用 PodSecurityPolicy。使用 securityContext 指定 Pod 的安全上下文,并启用 PodSecurityPolicy。

apiVersion: v1 
kind: Pod 
metadata:   
	name: nginx   
	labels:
    	app: nginx 
spec:   
	securityContext:
    	seLinuxOptions:
      		type: spc_t   
    containers:
  	- name: nginx
    	image: nginx
    securityContext:
      runAsUser: 1000
      capabilities:
        drop:
        - ALL
      readOnlyRootFilesystem: true   
      securityContext:
    	seLinuxOptions:
      		type: spc_t 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这个示例中,securityContext 用于指定 Pod 的安全上下文,并且在容器中使用了 securityContext 来控制容器的权限。

注意,PodSecurityPolicy 只会影响新创建的 Pod,对于已创建的 Pod 不会生效。因此,需要重新创建 Pod,以便 PodSecurityPolicy 生效。

3)Pod 的扩容和缩容策略

Pod 的扩容和缩容策略是 Kubernetes 集群中非常重要的一部分,它可以帮助我们在不同的部署场景下,实现自动化的容器扩缩容,从而降低资源浪费和成本。

在 Kubernetes 中,常见的 Pod 扩缩容策略有两种,分别为:

  1. 基于 CPU 负载进行扩缩容
  2. 基于外部信号进行扩缩容,如 HTTP 请求、消息队列等

这里我们详细介绍这两种 Pod 扩缩容策略:

1. 基于 CPU 负载进行扩缩容

基于 CPU 负载进行扩缩容,是 Kubernetes 中最基本也是最常用的扩缩容策略。这种策略是根据 Pod 中容器的 CPU 使用率动态地增加或减少 Pod 实例的数量。

例如,我们可以通过创建 HorizontalPodAutoscaler 对象,来进行 Pod 的 CPU 扩缩容。下面的 YAML
文件示例演示了基于 CPU 指标自动扩缩容的配置:

apiVersion: autoscaling/v1 
kind: HorizontalPodAutoscaler
metadata:   
	name: my-autoscaler 
spec:   
	scaleTargetRef:
    	apiVersion: apps/v1
    	kind: Deployment
    	name: my-deployment   
    minReplicas: 1   
    maxReplicas: 10   
    targetCPUUtilizationPercentage: 50 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这个示例中,my-autoscaler 是一个针对 my-deployment Deployment 的 HorizontalPodAutoscaler 对象,可以自动扩缩容。它的 targetCPUUtilizationPercentage 为指定 Deployment 的 CPU 利用率%,达到此阈值之后将会触发自动扩缩容。

2. 基于外部信号进行扩缩容

基于外部信号的扩缩容策略是基于应用程序的实际使用情况,对应用程序的负载进行动态扩缩容的一种策略。

例如,我们可以通过创建 Keda 对象,来进行基于消息队列的扩缩容。下面的 YAML 文件示例演示了如何使用 Keda 进行基于 RabbitMQ 消息队列的扩缩容:

apiVersion: keda.sh/v1alpha1 
kind: ScaledObject 
metadata:  
	name: my-scaledobject 
spec:   
	scaleTargetRef:
    	name: my-deployment   
    triggers:
  	- type: rabbitmq
    	metadata:
      		queueName: my-queue
      		host: rabbitmq
      		username: guest
      		password: guest
      		routingKey: "#"
      		exchangeType: "topic"
      		exchange: "my-exchange"
    	authenticationRef:
      		name: my-rabbitmq-secret
    	queueLength:
      		averageValue: "5" 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这个示例中,my-scaledobject 对象是一个基于 RabbitMQ 消息队列自动扩缩容的配置对象。当消息队列的消息数量达到指定的阈值时,自动创建更多的 Pod 实例,以满足应用程序的负载需求。

4)Pod 的监控和日志收集

在 Kubernetes 集群中,容器的监控和日志收集是非常重要的任务。可以通过一些工具和方案来实现这些任务,例如 Prometheus、Grafana、ELK 等。

以下是几个常见的监控和日志收集方案:

1. Prometheus

Prometheus 是一种开源监控解决方案,可以帮助我们监控 Kubernetes 环境中的 Pod 和容器。它可以收集 CPU 使用率、内存使用率、网络流量等多种指标,并提供强大的查询语言和可视化工具。

使用 Prometheus 监控 Kubernetes 集群时,可以通过 Kubernetes 上的 Prometheus Operator 管理器来部署 Prometheus。Prometheus Operator 是一个 Kubernetes 控制器,它能够自动管理 Prometheus 实例,以便对集群进行全面监控。

2. Grafana

Grafana 是一种开源的数据可视化工具,可以帮助我们将 Prometheus 等监控数据可视化。它提供了强大的图表和面板,可以使我们更加直观地理解和分析监控数据。

使用 Grafana 可以容易地创建仪表板,显示 Kubernetes 集群、Pod、容器和服务等监控数据。同时,Grafana 还支持多种数据源,包括 Prometheus、Elasticsearch 等等。

3. ELK

ELK(Elasticsearch、Logstash、Kibana)是一种开源的日志收集和分析工具。它可以帮助我们从多个源收集并聚合日志数据,分析日志数据,从而识别潜在的问题。

在 Kubernetes 环境中,也可以通过 ELK 收集和分析日志数据。可以将 Kubernetes 集群、Pod、容器和服务等的日志数据采集到 Logstash 中,然后存储到 Elasticsearch 中。最后,通过 Kibana 对日志数据进行查询和可视化。

5)Pod 的预定义执行策略

在 Kubernetes 中,可以使用预定义的执行策略来控制 Pod 的调度和生命周期。以下是一些常用的 Pod 预定义执行策略:

  1. Always

Always 是 Kubernetes 中的默认执行策略。它意味着 Kubernetes 应始终尝试在节点上运行该 Pod,即使节点上的资源不充足或有更高优先级的任务正在运行。

  1. Never

Never 策略是指 Kubernetes 永远不会在任何节点上运行该 Pod。如果使用了该策略,那么该 Pod 将永远处于未调度状态。

  1. OnFailure

OnFailure 策略是指在 Pod 失败时再次运行该 Pod。如果运行该 Pod 的节点崩溃或 Pod 自身崩溃,则 Kubernetes 将在新节点上重新启动该 Pod。

  1. OnNodeFailure

OnNodeFailure 策略与 OnFailure 策略类似,但该 Pod 将仅在其存在的原始节点上失败。当节点失败时,Kubernetes 将重新启动该 Pod。

  1. RestartPolicy

Kubernetes 还提供了另一种执行策略,称为 RestartPolicy。RestartPolicy 适用于无限循环自我修复的进程,如 Nginx 或 Apache 等容器。在该策略下,Kubernetes 会尝试在容器终止时重启容器。

这些策略可以通过 Pod 定义文件(YAML)中的 restartPolicy 字段进行设置。例如:

apiVersion: v1 
kind: Pod 
metadata:   
	name: my-pod 
spec:  
	containers:
    - name: nginx
      image: nginx   
    restartPolicy: Always 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这个示例中,restartPolicy 字段被设置为 Always,这意味着 Kubernetes 将始终尝试在节点上重新启动该 Pod。

6)容器镜像管理

Pod 中容器镜像的管理是 Kubernetes 中的一个重要环节。以下是一些 Pod 容器镜像管理的最佳实践:

  1. 指定容器镜像版本

在 Pod 的 YAML 配置文件中,可以通过指定容器镜像名称及版本来确保容器镜像的正确性,例如:

apiVersion: v1 
kind: Pod 
metadata:   
	name: nginx-pod 
spec:  
	containers:
    - name: nginx-container
      image: nginx:latest 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这个例子中,image 字段指定了容器镜像名称及版本,即使用的是最新的 nginx 版本。

  1. 访问私有镜像仓库

除了使用公有的容器镜像仓库,还可以创建私有的镜像仓库,然后在 Pod 中使用私有的容器镜像。例如:

apiVersion: v1 
kind: Pod 
metadata:   
	name: nginx-pod 
spec:  
	containers:
    - name: nginx-container
      image: <私有镜像仓库地址>/nginx:latest
      imagePullSecrets:
        - name: my-registry-credentials 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这个例子中,image 字段指定了私有镜像仓库地址及版本号,并且 imagePullSecrets 字段保存了私有镜像仓库的凭据。

  1. 定期更新容器镜像

由于镜像随时可能被更新和发布新版本,我们需要定期更新容器镜像,保证容器镜像始终使用最新版本。可以使用 Kubernetes CronJob 定时任务来周期性地更新容器镜像版本。例如:

apiVersion: batch/v1beta1 
kind: CronJob 
metadata:   
	name:
	image-updater 
spec:   
	schedule: "0 1 * * *"   
	jobTemplate:
    	spec:
      		template:
        		spec:
          			containers:
            			- name: image-updater-container
              			image: <镜像仓库地址>/image-updater:v1
          			restartPolicy: OnFailure 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这个例子中,image 字段指定了一个名为 image-updater 的容器镜像,定期使用 CronJob 构建更新容器镜像的版本。

在学习过程中,建议利用 Kubernetes 官方网站提供的资源,如官方文档、代码样例、命令行工具和社区支持。同时,还可以参考书籍或者视频教程来深入了解 Kubernetes Pod 相关知识。在学习过程中,可以多实践并动手实现一些 Pod 相关的场景和案例,以更加深入地理解 Kubernetes Pod。

2.2 Node

在 Kubernetes 中,Node 代表集群中的一个工作节点,Node 上可以运行一个或多个容器实例。Node 负责维护 Pod 并保证它们在工作节点上运行。Node 由 Kubernetes Master 组件自动管理。
学习 Kubernetes Node 部分需要掌握以下几个方面的知识:

  1. 节点的组成和角色

节点是 Kubernetes 的工作节点,它可以是虚拟机、物理机或者云服务器等物理计算资源。节点包含 Node、Pod、容器运行时(container runtime如 Docker)和 Kubelet 集成这四大组件。

1) Kubelet

Kubelet 是节点上运行的一个代理,负责跟踪该节点上运行的容器,并与 Kubernetes Master 节点通信以确保容器处于活动状态。它运行在节点上,并与 Kubernetes API Server 通信,以保证集群中的 Pod 都能够正常工作。Kubelet 还负责存储 Pod 的状态、协调容器的创建和销毁等任务。

Kubelet如何跟踪该节点上运行的容器

在 Kubernetes 集群中,Kubelet 是运行在每个节点上的一个代理服务,它负责管理节点上的容器和 Pod。Kubelet 跟踪节点上运行的容器以及它们所属的 Pod,主要通过下面两个途径实现:

  1. 通过container runtime监视容器

Kubelet 在启动时会检测该节点上已安装的container runtime,例如 Docker、rkt 等,并与container runtime进行通信。Kubernetes 使用 CRI (Container Runtime Interface) 为各个容器运行时提供标准化的 API,Kubelet 通过 CRI 与容器运行时通信,获取关于节点上正在运行的容器和它们相关的元数据信息,比如容器状态、container runtime错误等。

  1. 通过云提供商的 API 获取容器信息

在公有云上运行的 Kubernetes 集群中,节点有可能是由云服务提供商通过虚拟化技术提供的,这种情况下,Kubelet 通常使用云服务提供商提供的 API 来获取节点上运行的容器信息。

总之,Kubelet 通过容器运行时的 API 或者云提供商的 API 来获取节点上运行的容器信息,并通过与 Kubernetes Master 节点的 API Server 进行通信,将节点上的容器状态信息上报到集群中,以便进行调度、监控、日志收集等操作。

Kubelet如何与 Kubernetes Master 节点通信

在 Kubernetes 集群中,Kubelet 是运行在每个节点上的一个代理服务,它负责管理节点上的容器和 Pod,并与 Kubernetes Master 节点通信,以确保集群中的 Pod 能够正常工作。Kubelet 与 Kubernetes Master 节点之间的通信基于下面两个核心组件:

  1. 与 API Server 进行交互
    Kubelet 和 Kubernetes Master 节点之间的核心通信是通过 API Server(Kubernetes API Server)进行的。Kubelet 定期向 API Server 发送心跳信息,并上传节点上容器和 Pod 的信息,包括状态、健康状况和使用资源等。API Server 也会向 Kubelet 下发一些命令,例如创建、删除或更新容器和 Pod 等,这些命令由 Kubelet 在节点上执行。在 Kubernetes 集群中,所有的组件都使用 API Server 作为它们的中心数据交换点,以保证它们能够互相通信和协作。

kubelet 与 API Server 进行的主要交互包括以下几个方面:

  1. 心跳监测
    kubelet 通过向 API Server 定期发送心跳消息来告知 API Server 该节点的状态信息,API Server 收到心跳请求之后会将节点和容器状态信息记录在 etcd 中。
  2. 事件通知
    kubelet 可以向 API Server 发出事件通知,包括容器创建和销毁、容器运行时状态更改等事件。这些事件通知可以被监控工具和 Kubernetes 插件用来识别和响应事件。
  3. 请求 Pod 的清单
    kubelet 定期通过 RESTful API 向 API Server 请求节点上所有的 Pod 清单,以便 kubelet 可以获取本地节点上所有的 Pod,并确保所有 Pod 的状态信息都是最新的。
  4. 接收调度指令
    当 Kubernetes 需要启动一个新的 Pod 时,API Server 会向 kubelet 下发调度指令,包括 Pod 的容器镜像、容器端口、容器环境变量等,kubelet 接收指令后将会在本地启动一个新的容器。
  5. 上报容器状态信息
    kubelet 定期向 API Server 上报节点和容器的状态信息,包括容器健康状态、资源利用情况、容器重启次数、容器事件等。API Server 可以根据这些状态信息判断容器是否运行正常,并进行恢复和重启等操作。
    总之,kubelet 通过与 Kubernetes API Server 的交互来管理节点和容器,包括心跳监测、事件通知、请求 Pod 的清单、接收调度指令以及上报容器状态信息等。只有与 Kubernetes API Server 进行密切的交互,kubelet 才能正常地运行和管理 Kubernetes 集群中的容器和 Pod。
  1. 使用 Kube-Proxy 进行服务发现
    另外,Kubelet 还使用 Kube-Proxy 进行服务发现和路由。Kube-Proxy 是 Kubernetes 集群中的网络代理,它负责负载均衡、端点切换、流量管理和服务发现。Kubelet 使用 Kube-Proxy 连接到 API Server,从而可以访问 Kubernetes 集群中的服务和 Pod,并将它们映射到节点中运行的相应容器。这样,Kubelet 可以将节点上运行的容器和 Pod 与 Kubernetes 集群中的服务和资源正确关联起来。
    Kube-Proxy 主要提供以下四个方面的功能:
  1. 负载均衡
    在 Kubernetes 集群中,一个服务可能会跨多个 Pod 进行部署。Kube-Proxy 可以使用 IPVS 等负载均衡工具,为具有相同服务 IP 的多个 Pod 提供负载均衡。可以使用 Round-robin 等负载均衡算法来均衡请求,确保每个 Pod 都能够承担相同的负载。
  2. 端点切换
    当一个 Pod 被标记为不健康、停止运行或从集群中删除时,Kube-Proxy 会协调通过请求哪个其它 node 上的 endpoint 来重新进行负载均衡,以确保请求的继续顺利进行。
  3. 流量管理
    Kube-Proxy 还提供了流量管理功能,可以在 Pod 和集群内部的服务之间进行端口转发。同时,还可以按需指定目标地址和 IP 端口。这些流量管理配置可以在集群中定义,并且可以通过 Kubernetes API Server 进行动态更新。
  4. 服务发现
    Kube-Proxy 还支持通过 DNS 等方式进行服务发现。Kubernetes 中的服务提供了一种透明的方式,允许客户端通过统一的服务名称来访问多个 Pod 实例。Kube-Proxy 可以负责处理 DNS 请求,并将这些请求转换为 Pod 实例的 IP 地址。

如何确保容器处于活动状态

在 Kubernetes 集群中,Kubelet 是运行在每个节点上的一个代理服务,它负责管理节点上的容器和 Pod,并确保它们处于活动状态。在 Kubelet 管理下,容器处于活动状态需要执行以下几个步骤:

  1. 容器生命周期管理

Kubelet 监控节点上的容器,有责任确保容器的状态、容器健康状况和运行状态都处于正常状态。如果容器出现故障或者崩溃,Kubelet 负责重启容器或者进行其他处理。

  1. 容器资源管理

Kubelet 监控容器的资源使用情况,例如 CPU、内存、网络和存储等,并确保容器不超出其允许使用的资源限制。

  1. 容器网络管理

Kubelet 管理容器的网络连接,并确保容器可以与其他容器、服务和集群外部进行通信。

  1. 容器存储管理

Kubelet 确保容器可以正常访问它们所需的存储卷,包括本地磁盘、云存储和网络存储等。

总之,Kubelet 确保容器处于活动状态的方式是通过对容器生命周期进行管理和监控,包括容器状态、容器健康状况、资源使用情况、网络连接和访问卷等。当容器运行出现故障或者异常情况时,Kubelet 负责重启它们或者进行相应的处理,从而确保它们一直处于活动状态,并持续提供服务。

Kubelet如何存储 Pod 的状态

在 Kubernetes 集群中,每个节点都有一个 Kubelet 代理,它负责运行容器,并通过与 Kubernetes API Server 通信来管理 Pod 和容器的状态。Kubelet 存储 Pod 状态主要通过三个途径实现:

  1. 通过内存缓存存储 Pod 状态

当 Kubelet 启动时,它会从 Kubernetes API Server 获取节点上已经分配的所有 Pod,存储在内存中的 Pod 缓存中。因此,在 Kubelet 运行期间,它维护着一个实时的 Pod 列表,记录了集群中所有在该节点上运行的 Pod 的状态信息。

  1. 通过 etcd 存储 Pod 状态

Kubelet 将所有的 Pod 状态信息存储在集群内部的 etcd 存储中。由于 Pod 可能会在不同节点上迁移和调度,etcd 存储节点的 Pod 状态信息可以跨节点访问。这样可以确保在 Kubelet 重启或者宕机时,Pod 状态信息不会丢失。

  1. 通过心跳检查定期上传节点上的 Pod 状态

Kubelet 通过向 Kubernetes API Server 发送心跳信息,更新节点和 Pod 的状态。Kubelet 可以根据 Pod 最近的状态更新实例来确定它的健康状态,并将这些信息发送给 API Server,以便 Kubernetes 控制平面可以根据 Pod 的状态进行相应的处理和调度。

总之,Kubelet 提供了多种方式来存储 Pod 的状态,并通过与 Kubernetes API Server 通信来更新、维护和保持 Pod 和节点的状态信息。这些状态信息对于 Kubernetes 集群中的 Pod 调度和管理至关重要,保证了容器的健康运行。

Kubelet如何协调容器的创建和销毁等任务

在 Kubernetes 集群中,Kubelet 是运行在每个节点上的一个代理服务,它负责管理节点上的容器和 Pod,并执行与 Kubernetes 控制平面交互的任务。Kubelet 协调容器的创建和销毁等任务主要通过以下几个途径实现:

  1. 接收和调度 Pod 的运行请求

Kubelet 接收来自 Kubernetes 控制平面下发的 Pod 运行请求,并根据 Pod 的各种需求开始调度。例如,如果容器需要使用某些特定的资源,Kubelet 将选择一个适当的节点将其部署到该节点上,并确保该节点上的硬件资源满足容器的需求。

  1. 监控容器、Pod 的生命周期

Kubelet 监控节点上的容器和
Pod,有责任确保容器的状态、容器健康状况和运行状态都处于正常状态。如果容器出现故障或者崩溃,Kubelet
负责重启容器或者进行其他处理。同时,Kubelet 也可以自动地扩容或缩容 Pod,以满足集群中的负载需求。

  1. 获取和处理容器运行时数据

Kubelet 获取并处理容器的运行时数据,包括容器日志、运行状态等。Kubelet 可以将这些信息发送给 Kubernetes
控制平面,以便 Kubernetes 进行进一步的分析和处理。此外,Kubelet
还可以使用第三方监控工具来监控容器的运行状态,确保容器处于良好的运行状态。

  1. 清理及回收资源

Kubelet 注重清理和回收不使用的容器,以便释放节点上的资源,包括 CPU、存储和内存等。Kubelet
可以管理节点上的各个资源,及时识别空闲的容器资源,并将其删除或移除,确保节点的资源得到最大的利用。

总之,Kubelet 协调了 Kubernetes 集群中容器的运行和管理,确保节点和集群中的容器处于预期的运行状态。Kubelet
执行的任务包括接收和调度 Pod 运行请求、监控和处理容器和 Pod 的生命周期、获取和处理容器运行时数据,清理及回收资源等。这些操作保证了
Kubernetes 集群的稳定和容器的正常运行。

2)容器运行时

容器运行时是一段用于管理容器的软件,通常包括 Docker、rkt 和 CRI-O 等。容器运行时负责在节点上创建和管理容器,并确保容器能够正确运行。

3)Kube-Proxy

基本概念:

  1. iptables:Kube-Proxy默认使用iptables来代理和负载均衡Service,iptables是一个Linux内核中的工具集,用于实现防火墙、网络地址转换和端口转发等功能。

  2. IPVS:除了iptables之外,Kube-Proxy还支持IPVS,IPVS是一个高性能的Linux虚拟服务器实现,支持多种负载均衡算法和协议。

  3. kube-proxy:Kubernetes中的服务代理和负载均衡组件,它的工作是为集群中的Service提供联网机制,包括映射Service内部IP和端口到Pod IP和端口,通过iptables和IPVS提供负载均衡服务等。

  4. kube-proxy modes:kube-proxy有三种工作模式,分别是User-space,Iptables和IPVS。User-space是早期的代理模式,现已淘汰。Iptables和IPVS是目前主流的两种模式,用于实现Service的负载均衡功能。

kube-proxy如何为集群中的Service提供联网机制?

  1. kube-proxy 监听 Service 的 ClusterIP 和 NodePort,并将请求转发到后端 Pod 上。
  2. 当 Service 的类型为 ClusterIP 时,kube-proxy 在每个节点上启动一个本地代理(local proxy),该代理会监听本地端口,并将请求转发到后端 Pod 上。
  3. 当 Service 的类型为 NodePort 时,kube-proxy 在每个节点上启动一个外部代理(external proxy),该代理会监听外部端口,并将请求转发到后端 Pod 上。
  4. 当 Service 的类型为 LoadBalancer 时,kube-proxy 在每个节点上启动一个负载均衡器(load balancer),该负载均衡器会将请求转发到后端 Pod 上。

作用:
实现Service的代理和负载均衡。Kube-Proxy通过以下方式发挥作用:

  1. Service代理:Kube-Proxy通过创建虚拟IP(VIP)来代理Service,并为每个Service创建对应的iptables规则或者IPVS规则,从而将Service映射到对应的后端Pod。

  2. 负载均衡:Kube-Proxy为Service提供负载均衡的能力,当一个Service有多个后端Pod时,Kube-Proxy会根据Service的负载均衡算法(如轮询、IP哈希等)来选择其中的一个Pod作为访问目标。

  3. 节点主机网络代理:当Pod需要连接集群外部的网络时,Kube-Proxy可以协助Pod进行SNAT/DNAT转发,实现访问外部网络的能力。

总的来说,Kube-Proxy的作用是为Kubernetes中的Service提供代理和负载均衡的能力,从而使得多个Pod能够组成一个服务并对外提供服务。这样能够方便地实现应用程序的高可用性和可扩展性。

工作方式:

Kube-Proxy 是负责 Kubernetes 集群内部的网络代理,它跟踪集群中每个节点的网络拓扑,并为 Pod 提供服务发现和负载均衡等功能。通过使用 Kube-Proxy,Kubernetes 能够将流量路由到正确的 Pod 上,从而确保集群中的服务能够正常工作。

4)存储介质

存储介质是指节点上的物理存储(如硬盘或 SSD),用于存储容器镜像和数据卷等数据。通常,节点中的存储介质会使用分布式存储或者存储卷插件来进行管理和使用。

5)Node 插件

Kubernetes 集群还提供了各种 Node 插件,用于提供额外的功能。例如,Container Network Interface 插件可用于管理容器网络,Device Plugin 插件可用于管理节点中的硬件资源等。

  1. 搭建和配置节点

在实验室环境中,可以使用 Minikube 或 Kind 来搭建单个节点。在生产环境中,可以使用 Kubeadm 等工具搭建一个 Kubernetes 集群,并对 Kubernetes Node 相关组件进行配置、优化和定制。

  1. Node 的调度和管理

了解 Kubernetes 调度器和调度算法,理解如何通过资源请求和限制、NodeSelector 和 PBD 等手段控制 Pod 的调度和分配。学习如何在 Kubernetes 中管理、监控和维护 Node,并优化 Node 资源。

  1. 附加组件

Node 的附加组件包括 Kubernetes DNS、kube-proxy、Kubelet、CNI 插件等,这些组件对于 Node 的管理和运行都至关重要,需要熟悉它们之间的协调与配合。

  1. 相关工具和技术

对于 Node 的管理和操作,可以使用 Kubernetes Dashboard、kubectl 等命令行工具,并深入理解 Linux、容器虚拟化、网络等底层知识。

Node 部分是 Kubernetes 的重点之一,需要建立从组成到工作原理的完整认知,只有深入理解 K8s Node,才能更好地运维和开发 Kubernetes 应用。

建议在学习过程中,关注官方文档和社区资料,并尝试动手实践和实验。如需更深入的学习,可以参考相关书籍和课程。

2.3 Service

学习 Kubernetes Service 部分需要掌握以下几个方面的知识:

  1. Service的概念和类型

Service 是 Kubernetes 中的一个抽象层,用于指定一组 Pod 的访问方式。了解各类型的 Service,如 ClusterIP、NodePort、LoadBalancer 和 ExternalName Service 等,以及它们不同的应用场景和限制。

  1. Service 的实现和配置

学习如何在 Kubernetes 中创建和管理 Service,如通过配置 Service YAML 文件或命令行工具 kubectl 创建服务,设置 Service Selector 和 Endpoint 等参数。

  1. Service 的工作原理

深入了解 Service 的工作原理,包括 Service 的不同访问方式、Service IP 和 Endpoint 的关系、Service 如何实现负载均衡、如何实现跨命名空间访问等。

3)service如何支持负载均衡和自动服务发现等功能

在 Kubernetes 中,Service 支持负载均衡和自动服务发现等功能。这些功能可以使应用程序更加高效且具有弹性。

具体来说,Service 通过在后面连接的 Pod 上为 Kubernetes 提供一个虚拟 IP
地址和端口,从而为客户端提供一个对应的服务入口。客户端可以通过 Service 的虚拟 IP 来访问后端的 Pod,而无需了解后端 Pod
的具体 IP 地址和端口。

在 Service 中,有两种类型的负载均衡方式:Round Robin 和 IP Hash。

  • Round Robin:默认情况下,Service 采用 Round Robin 的负载均衡策略。每个请求都会按顺序分配给不同的后端 Pod,从而分摊负载。

  • IP Hash:在 IP Hash 策略下,Service 基于客户端的 IP 地址计算哈希值,并将相同哈希值的请求分配给同一个后端 Pod,这可以保证每个客户端访问的后端 Pod 是一致的,从而提高缓存的命中率。

为了支持自动服务发现,Service 还使用了 Kubernetes 的标签选择器机制。标签可以被应用于 Pod 或其他资源上。在
Service 中,使用 selector 字段来指定后端 Pod 所拥有的标签,从而在 Service 中进行负载均衡。

除此之外,Service 还提供了以下其他功能:

  • Session Affinity:在 Session Affinity 设置为 ClientIP 时,Kubernetes 会将相同客户端 IP 的所有请求都分配给同一个后端 Pod,以确保同一客户端的所有请求都被发送到同一个 Pod 上。

  • Service Discovery:Service 支持通过 DNS 查询进行服务发现。在 Kubernetes 中,Service 的名称会注册为一个 DNS 记录,可以通过该名称进行 DNS 查询以获取 Service 的 IP 地址和端口信息。

  • 横向扩展(Scaling):Service 与 Pod 紧密耦合,使得可以根据应用程序的需要进行横向扩展。

综上所述,Service 通过负载均衡、自动服务发现等功能使得应用程序可以更加高效的工作,并且具有弹性,可以根据需要进行横向扩展。

  1. Service 的扩展和优化

学习如何扩展和优化 Service,如如何通过 Horizontal Pod Autoscaler(HPA)和 Cluster Autoscaler 水平扩展 Service,如何通过 NodeAffinity 和 PodAffinity 控制 Service 的 Pod 分配,以及如何使用 Endpoint Slice 等新特性优化 Service。

2.4 Label

学习 Kubernetes Label 部分需要掌握以下几个方面的知识:

  1. Label 的概念和作用:

Label 是 Kubernetes 中的一种元数据机制,可以对 Kubernetes 对象进行分类和分组。Label 具有以下作用:标注和筛选 Kubernetes 对象、控制 Kubernetes 对象的行为、实现 Kubernetes 对象的高级查询和自动化管理、支持 Kubernetes 上的多种策略。

  1. Label 的使用场景:

学习 Label 的使用场景,如:如何为 Pod、Controller、Service、Volume、Namespace、Event 等 Kubernetes 对象添加 Label,如何使用 Label 作用于高级部署策略,如 ReplicaSet、Deployment 和 DaemonSet。相应的,需要了解掌握来实现筛选和管理 Kubernetes 对象的基本方法。

  1. Label 的管理和操作:

深入理解如何管理和操作 Labels,如如何使用 kubectl 命令行工具和 Kubernetes API 进行管理和操作 Kubernetes 对象的 Label,并 深入了解Label Selector、Labeling、Deletion、Modificiation 等。

  1. Label 的性能优化和调试:

Label 在 Kubernetes 中的使用过程中,因为繁琐和频密而容易出现性能问题,这时候需要考虑对其进行调试和优化。

在学习过程中,可以参考 Kubernetes 官方文档中的 Label 部分,加深对 Label 的理解。同时,kubernetes.io 的官方文档、标签和注释教程也是学习 Kubernetes Label 的重要资源。

在学习过程中,建议多进行实验,实践并尝试对 Kubernetes 对象进行标签的添加、更新和查询,以了解 Kubernetes Label 的工作原理和应用场景。

2.5 Namespace

学习 Kubernetes Namespace 部分需要掌握以下几个方面的知识:

  1. Namespace 的概念和作用:

Namespace 是 Kubernetes 的一个重要概念,用于将 Kubernetes 环境中的各种对象进行隔离和隔离逻辑分组。Namespace 具有以下作用:限制授权用户与服务的访问权限、减少资源竞争和名称冲突、将资源分类和分隔。

  1. Namespace 的使用场景:

学习 Namespace 的使用场景,如如何在 Kubernetes 中创建、查看和删除 Namespace,如何为不同的应用程序和团队分离资源,并自定义 Namespace 以适应丰富的管理需求。相应的,需要了解 Namespace 如何与其他 Kubernetes 概念集成,如如何使用 Label、Service、Secret、ConfigMap 等对象与 Namespace 相互关联。

  1. Namespace 的管理和配置:

深入理解如何管理和配置 Namespace,掌握如何使用 kubectl 命令行工具和 Kubernetes API 进行 Namespace 的创建和管理,并了解如何设置和查询 Namespace 的配置项,如如何配置 DNS、ResourceQuota、PodSecurityPolicy 等。

  1. Namespace 的扩展和优化:

了解如何扩展和优化 Namespace 的能力,如如何使用 Network Policy 和 Pod Affinity/Anti-Affinity 等 Kubernetes 能力扩展 Namespace,还可以了解如何使用 Operator 和自动化工具来管理 Namespace。

在学习过程中,可以参考 Kubernetes 官方文档中的 Namespace 部分,加深对 Namespace 的理解。同时,官方提供的手册和社区支持也是学习 Kubernetes Namespace 的重要资源。

在学习过程中,建议多进行实验,实践并尝试在 Kubernetes 中创建、使用和管理 Namespace,以深入了解 Namespace 的工作原理和应用场景。

2.6 Volume

学习 Kubernetes Volume 部分需要掌握以下几个方面的知识:

  1. Volume 的概念和作用:

Volume 是 Kubernetes 将容器与宿主机文件系统进行隔离的一种机制,可以将数据存储在容器之外,保证了容器在重启或迁移后数据的持久性和一致性,并且可以同时为多个容器提供共享存储。

  1. Volume 的类型和使用场景:

了解 Volume 的类型和适用场景,如使用空目录 Volume、主机路径 Volume、Persistent Volume、ConfigMap/Secret Volume 和 Downward API Volume 等 Volume 类型,并了解它们的特点和适用范围。

  1. Volume 的配置和管理:

深入理解如何配置和管理 Volume,掌握如何在 Kubernetes 中创建、使用和管理 Volume,以及如何实现 Volume 的自动化管理和扩展。此外,还需掌握如何设置 Volume 生命周期和存储类别、如何配置 Volume 访问权限和保护机制等。

  1. Volume 的扩展和优化:

了解如何扩展和优化 Volume 的能力,如如何使用 Persistent Volume Claim 和 Storage Class 扩展 Volume 空间,如何使用 Volume 插件集成其他存储系统,如何实现数据备份和恢复等。

在学习过程中,可以参考 Kubernetes 官方文档中的 Volume 部分,加深对 Volume 的理解。同时,kubernetes.io 的官方文档、命令行工具和社区支持也是学习 Kubernetes Volume 的重要资源。

在学习过程中,建议多进行实验,实践并尝试在 Kubernetes 中创建、使用和管理不同类型和场景的 Volume,以深入了解 Volume 的工作原理和应用场景。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/478224
推荐阅读
相关标签
  

闽ICP备14008679号