首页 Kubernetes基础(一):介绍
文章
取消

Kubernetes基础(一):介绍

  通过对MicroK8s的学习,已经成功搭建了一个Kubernetes集群,开启了Dashboard,成功部署了Nginx应用。但是并没有详细介绍Kubernetes的相关知识,只是部署了一个应用。之所以这样做是因为学习Kubernetes需要一个环境,而Kubernetes的安装和部署比较复杂,所以才选择MicroK8s

注: 因为我们的环境是Microk8s,使用的时候虽然大部分和Kubernetes一样,但是有些地方需要做些调整:

  • Kubernetes里的命令在Microk8s中需要使用microk8s命令,例如: microk8s kubectl或者microk8s.kubectl,有人建议用别名,但是我没有这样做。
  • 增加了一些命令,如:microk8s.statusmicrok8s.enable等。

  现在环境已经搭建成功,接下来需要介绍Kubernetes的相关知识。

Kubernetes介绍

  Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

  • 星际尺度:Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下进行规模扩展。
  • 永不过时:无论是本地测试,还是跨国公司,Kubernetes 的灵活性都能让你在应对复杂系统时得心应手。
  • 处处适用Kubernetes 是开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让您轻松地做出合适的选择。

Kubernetes 特性

  • 自动化上线和回滚 Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。
  • 服务发现与负载均衡 你无需修改应用来使用陌生的服务发现机制。Kubernetes 为每个 Pod 提供了自己的 IP 地址并为一组 Pod 提供一个 DNS 名称,并且可以在它们之间实现负载均衡。
  • 自我修复 重新启动失败的容器,在节点死亡时替换并重新调度容器, 杀死不响应用户定义的健康检查的容器, 并且在它们准备好服务之前不会将它们公布给客户端。
  • 存储编排 自动挂载所选存储系统,包括本地存储、公有云提供商所提供的存储或者诸如 iSCSI 或 NFS 这类网络存储系统。
  • Secret 和配置管理 部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。
  • 自动装箱 根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。
  • 批量执行 除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
  • IPv4/IPv6 双协议栈 为 Pod 和 Service 分配 IPv4 和 IPv6 地址
  • 水平扩缩 使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
  • 为扩展性设计 无需更改上游源码即可扩展你的 Kubernetes 集群。

概念

对象

  在Kubernetes中,对象是Kubernetes集群中运行的实体。这里简单列举一下常用的资源对象。

  • Pod:Kubernetes中最小的部署单元,可以包含一个或多个容器。这些容器共享存储、网络、以及进程命名空间,并作为单个实体进行管理。
  • Service:定义了如何访问一组Pod。它提供负载均衡,并允许你通过单一稳定的IP地址和端口号访问一组Pod
  • ReplicaSet:确保指定数量的Pod副本正在运行。如果Pod数量少于指定数量,ReplicaSet会启动新的Pod;如果Pod数量超过指定数量,它会终止多余的Pod
  • Deployment:提供了声明式的方式来更新应用程序。它管理ReplicaSetPod,并提供滚动更新和回滚功能。
  • Namespace:提供了一个虚拟的集群环境,用于将资源组隔离成不同的逻辑组。不同的团队或项目可以使用不同的Namespace来管理其资源。
  • Ingress:网络管理,提供了HTTP(S)路由到集群内的服务,可以作为Kubernetes集群的入口点。
  • Secret:用于存储小量的敏感信息,如密码、OAuth令牌或SSH密钥。这些信息可以安全地传递给Pod中的容器。
  • ConfigMap:用于存储配置信息,这些信息可以被Pod中的容器使用。它允许你解耦配置与镜像,使得配置更改更容易管理。
  • PersistentVolumeClaim (PVC) 和 PersistentVolume (PV):PV提供了网络存储的抽象,而PVC是用户存储请求的声明。PVCPV配对,以提供持久存储给Pod
  • Job:用于运行一次性任务,直到任务成功完成。
  • CronJob:用于在Kubernetes集群中运行定时任务。
  • DaemonSet:守护进程集,确保每个节点上都运行了指定的Pod副本。常用于运行日志收集、监控等守护进程。
  • StatefulSet:有状态应用集,用于管理有状态的应用程序。与DeploymentReplicaSet不同,StatefulSet提供了稳定的网络标识符和持久的存储。
  • ServiceAccount:安全管理,为Pod中的进程提供身份认证信息,以便它们可以访问Kubernetes API
  • Role 和 RoleBinding:Role定义了一组权限,而RoleBinding将这些权限绑定到一个或多个ServiceAccount或用户。
  • ClusterRole 和 ClusterRoleBinding:与RoleRoleBinding类似,但适用于集群范围的资源。
  • HorizontalPodAutoscaler (HPA):自动伸缩,HPA基于观察到的CPU利用率或其他自定义指标自动缩放Pod的数量。
  • NetworkPolicy:网络管理,用于定义Pod之间允许的网络通信策略。
  • PodDisruptionBudget:应用管理,用于确保在自愿或非自愿中断(如节点维护或驱逐)期间,有足够数量的Pod副本可用。
  • Volume:存储管理,提供了Pod中容器的存储卷。这些卷可以来自多种来源,如本地磁盘、网络存储等。
  • VolumeSnapshot、VolumeSnapshotClass 和 VolumeSnapshotContent:这些与存储卷的快照管理相关,允许用户创建、保存和恢复存储卷的快照。
  • StorageClass:存储管理,定义了如何动态创建PersistentVolumes。它描述了PV的“类”,包括存储提供者、参数等。
  • VolumeAttachment:存储管理,用于将一个卷附加到一个节点,而不需要该卷被Pod使用。

  Kubernetes对象还是挺多的,而且还都很重要,在安装MicroK8s的时候,我们已经接触了PodDeploymentReplicaSetServiceNamespaceSecretIngress、等。

对象的描述

  Kubernetes对象都是通过YAML或者JSON描述的,我们回头看一下之前我们部署Nginx应用的Deployment对象的描述文件:

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
# 接口版本
apiVersion: apps/v1
# 对象类型
kind: Deployment
# 对象元数据
metadata:
  name: nginx-deployment
# 对象对象规约(对象期望)
spec:
  # 设置副本数量
  replicas: 3  
  # 设置选择器
  selector:
    matchLabels:
      app: nginx
  # Pod模版
  template:
    # 设置元数据
    metadata:
      labels:
        app: nginx
    # 设置期望
    spec:
      # 设置容器
      containers:
      - name: nginx
        # 镜像拉取地址
        image: nginx:latest 
        ports:
        # 监听端口
        - containerPort: 80

  Kubernetes对象描述文件遵循YAML格式或JSON格式,其中包含对象元数据(metadata)和期望(spec)。元数据包含对象名称和标签,而期望则定义了对象期望的状态。

  元数据包含对象名称和标签,标签用于对象标识和分类。标签可以由用户自定义,也可以由Kubernetes自动生成。标签可以作为对象选择器(selector)的一部分,用于选择对象。

对象期望(Spec)

  Kubernetes对象期望(spec)定义了对象期望的状态。期望包括对象类型、期望副本数量、选择器、容器、端口等。期望定义了对象应该具有的状态,包括副本数量、容器镜像、端口等。期望可以由用户自定义,也可以由Kubernetes自动生成。

状态(Status)

  Kubernetes对象状态(status)定义了对象当前的状态。状态包括对象名称、标签、副本数量、容器镜像、端口等。状态可以由用户自定义,也可以由Kubernetes自动生成。

对象选择器(selector)

  Kubernetes对象选择器(selector)用于选择对象。选择器可以由用户自定义,也可以由Kubernetes自动生成。选择器可以作为对象期望(spec)的一部分,用于选择对象。选择器可以匹配标签,也可以匹配名称。选择器可以匹配多个对象,也可以匹配单个对象。选择器可以匹配多个标签,也可以匹配单个标签。选择器可以匹配多个名称,也可以匹配单个名称。选择器可以匹配多个对象,也可以匹配单个对象。选择器可以匹配多个标签,也可以匹配单个标签。

有状态和无状态应用

  Kubernetes支持两种类型的应用:有状态和无状态应用。有状态应用是指应用需要持久化存储,如数据库、消息队列等。无状态应用是指应用不需要持久化存储,如Web应用、API网关等。这两种类型很重要,因为有状态应用需要持久化存储,而无状态应用不需要持久化存储。

总结

  Kubernetes对象是Kubernetes的核心对象,它们定义了Kubernetes集群中的各种资源。Kubernetes对象描述文件遵循YAML格式或JSON格式,其中包含对象元数据(metadata)和期望(spec)。元数据包含对象名称和标签,而期望则定义了对象期望的状态。Kubernetes对象状态(status)定义了对象当前的状态。Kubernetes对象选择器(selector)用于选择对象。Kubernetes对象支持多种类型,如PodDeploymentReplicaSet等。

  在这些对象中,Pod是最基本的对象,它定义了容器的运行环境。DeploymentReplicaSetPod的集合,它们可以确保Pod的数量始终保持一致。ServicePod的抽象,它定义了Pod的访问方式。IngressService的抽象,它定义了外部访问方式。Secret是敏感信息的存储,它定义了敏感信息的访问方式。ConfigMap是配置信息的存储,它定义了配置信息的访问方式。PersistentVolumePersistentVolumeClaim是存储的抽象,它们定义了存储的访问方式。Volume是存储的抽象,它定义了存储的访问方式。VolumeMount是存储的挂载,它定义了存储的挂载方式。VolumeSnapshotVolumeSnapshotClass是存储的快照,它们定义了存储的快照方式。VolumeSnapshotContent是存储的快照内容,它定义了存储的快照内容方式。

  通过这样一总结发现,虽然对象很多,但是其实各个对象的职责非常明确,而且各个对象之间也存在依赖关系,需要互相配合。再使用的时候,只需要按照自己的需求,选择合适的对象,就可以完成工作。

本文由作者按照 CC BY 4.0 进行授权

axios:让网络请求变得优雅与简单

Linux的日志管理-journal