人人皆可使用 Kubernetes ☸️💡🎉 Kubernetes

2025-05-28

Kubernetes 人人适用☸️💡🎉

Kubernetes

Kubernetes

Kubernetes 是de facto运行容器化应用程序的标准。

automating deploymentKubernetes (K8s) 是一个用于、scaling和容器化应用程序的开源系统management

Kubernetes 让容器化应用程序的部署和运行变得简单。Kubernetes 使用起来非常简单。

Kubernetes 很难理解,因为它提供了大量的选项来让你的部署更容易。

Kubernetes 的名字很贴切,它就像一位领航员(或舵手),助你驾驭容器世界。Kubernetes 是一个由社区为社区打造的可移植、可扩展的系统。

正如凯尔西正确引用的

Kubernetes 可以完成最优秀的系统管理员会做的事情,包括自动化、故障转移、集中日志记录和监控。它汲取了我们在 DevOps 社区中积累的经验,并将其作为默认配置,开箱即用。

为了使用 Kubernetes,了解

  • Kubernetes 如何工作?
  • Kubernetes 是如何架构的?
  • Kubernetes 中有哪些组件?

让我们开始对 Kubernetes 进行黑客攻击。

Kubernetes 如何工作?

Kubernetes 以高可用集群模式运行,每个 Kubernetes 集群由一个或多个主节点(Master Node)和少量的工作节点(Worker Node)组成。

替代文本

主节点

主节点由 API 服务器、调度器、控制器等组成。该节点被称为control planeKubernetes 的 。控制平面是brainKubernetes 的 。

也就是说控制平面负责 Kubernetes 内部的所有动作。

替代文本

通过API server,我们可以指示 Kubernetes 或者从 Kubernetes 获取信息。

负责Scheduler调度 pod。

它们controllers负责运行资源控制器。

etcd是 Kubernetes 的存储。它是一种键值存储。

节点

替代文本

工作节点有一个 Kubelet 和代理。

Kubelets 是实际的主力,而 Kube-proxy 负责处理网络。

在职的

替代文本

我们yaml通过命令将文件提供给 Kubernetes 集群kubectl apply

apply命令调用API服务器,API服务器会将信息发送给controller,同时将信息存储到etcd

然后将该etcd信息复制到多个节点,以应对任何节点故障。

它将controller检查给定状态是否与所需状态匹配。如果不匹配,它将通过将信息发送到scheduler

这些检查被称为Kubernetes 内部运行的协调循环。此循环的作用是验证请求的状态是否得到正确维护。如果预期状态与实际状态不匹配,此循环将执行必要的操作,将实际状态转换为预期状态。

里面有scheduler一个队列。一旦消息在队列中被接收。

然后将调用schedulerkubelet 执行预期操作,例如部署容器。

这是 Kubernetes 如何进行部署的 10000 英尺鸟瞰图。

Kubernetes 内部有各种组件。让我们来看看它们是什么以及它们有何用途。

Kubernetes 的组件

豆荚

一般来说,鲸群不过是一群海豚或鲸鱼。

同样,在 Kubernetes 的世界里,podsPod 是由一组容器组成的,它们共同生活。一个 Pod 里可能包含一个或多个容器。

podKubernetes 中最小的部署单元。通常,那些不能脱离其他容器生存的容器会被组合成一个 Pod。

这就是在 Kubernetes 中定义 pod 的方式。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Enter fullscreen mode Exit fullscreen mode
  • apiVersion表示 Kubernetes 集群在解析和执行此文件时使用哪个版本的 API。
  • kind定义了该文件将引用的 Kubernetes 对象的类型
  • 元数据包括识别 Pod 所需的所有元数据。
  • spec包含容器信息。

部署

Pod 是部署的单位。应用程序要运行,需要一个或多个 Pod。Kubernetes 将整个 Pod 集合视为一个部署。

因此,部署记录了有关 Pod 的信息。Kubernetes 使用这些部署信息来管理和监控部署在其中的应用程序。

下面的文件是示例部署文件,它告诉 Kubernetes 创建nginx使用nginx:1.7.9容器的部署。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
Enter fullscreen mode Exit fullscreen mode

副本集

部署会告诉 Kubernetes,你的应用程序需要哪些容器以及需要运行多少个副本。部署replica sets负责确保这些副本能够正常运行。

ReplicaSet 负责管理和监控副本。

StatefulSet

我们经常需要持久存储、永久网络标识符,或者有序的部署、扩展和更新。在这些情况下,我们会使用StatefulSets

您可以像下面这样定义 StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi
Enter fullscreen mode Exit fullscreen mode

我们安装了该卷并声明了该卷的存储。

DaemonSet

有时,您需要在 Kubernetes 集群的每个节点上运行 Pod。例如,如果您要从每个节点收集指标,那么我们需要在每个收集指标的节点上调度一些 Pod。我们可以为这些节点使用 DaemonSet。

服务

部署定义了在容器上运行的应用程序的实际状态。用户需要访问该应用程序,或者您可能需要连接到容器进行调试。服务将为您提供帮助。

服务是 Kubernetes 对象,提供从外部世界或容器之间对容器的访问。

我们可以像下面这样定义服务:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
Enter fullscreen mode Exit fullscreen mode

以上将service端口上的传入连接映射80到 targetPort 9376

您可以将服务视为 Kubernetes 世界中的负载均衡器、代理或流量路由器。

联网

这是 Kubernetes 最重要的元素。正在运行的 Pod 应该暴露给网络。Pod 内部运行的容器应该彼此通信,并且与外部世界进行通信。

虽然服务提供了连接到 pod 的方法,但网络决定了如何公开这些服务。

在Kubernetes中我们可以通过以下方式暴露服务:

  • 负载均衡器
    • 负载均衡器提供了一个外部 IP,我们可以通过该 IP 访问内部运行的 pod。
    • Kubernetes 将启动服务,然后asynchronously启动负载均衡器。

  • 节点端口
    • 每个服务都会有一个动态分配的端口。
    • 我们可以使用 Kubernetes 主 IP 访问服务。

  • 入口
    • 每项服务都有一个单独的地址。
    • 然后入口控制器访问这些服务。
    • 入口控制器不是公共 IP 或外部 IP。

秘密

对于应用程序,我们通常需要提供密码、令牌等信息。Kubernetes 提供了secrets对象来存储和管理这些敏感信息。我们可以像下面这样创建一个 secret:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |-
    apiUrl: "https://my.api.com/api/v1"
    username: {{username}}
    password: {{password}}
Enter fullscreen mode Exit fullscreen mode

最佳实践

Kubernetes 如同汪洋大海,我们所见的不过是沧海一粟。由于 Kubernetes 支持广泛的应用程序和选项,因此有各种不同的选项和功能可供选择。

使用 Kubernetes 时需要遵循的一些最佳实践是:

制作更小的 YAML

这些yaml文件是 Kubernetes 配置的核心。

我们可以在一个文件中定义多个 Kubernetes 配置yaml。虽然yaml与 相比减少了样板文件JSON。但文件仍然yaml占用空间且容易出错。

因此,请始终尝试最小化文件的大小yaml

对于每个服务、部署、机密和其他 Kubernetes 对象,在单独的yaml文件中定义它们。

将 yaml 文件拆分为更小的文件。

此处适用single responsibility principle

图像更小,启动速度更快

当发生崩溃、升级或使用量增加时,Kubernetes 会自动重启 Pod。镜像的启动速度越快,就越重要。为了加快启动速度,我们需要使用更小的镜像。

Alpine 镜像是您的好帮手。您可以使用 Alpine 镜像作为基础,仅在绝对必要时才添加组件或库。

始终记住要使用较小的图像尺寸。用于builder pattern从 Alpine 图像创建图像。

健康 - 僵尸进程

Docker 容器只有在容器内运行的所有进程终止时才会终止。healthy即使其中一个进程被终止,Docker 容器也会返回状态。这将创建一个Healthy-Zombie进程。

尽量在容器内运行单个进程。如果无法运行单个进程,则尝试使用一种机制来确定所有必需的进程是否都在运行。

清理未使用的资源

在容器世界中,未使用的资源占用内存的情况很常见。确保正确清理这些资源非常重要。

思考请求和限制

确保所有容器的请求和限制都正确指定。

resources:
    requests:
        memory: "100Mi"
        cpu: "100m"
    limits:
        memory: "200Mi"
        cpu: "500m"
Enter fullscreen mode Exit fullscreen mode

requests是容器保证获得的限制。这limits是允许容器使用的最大或最小资源。

pod 中的每个容器都可以请求和限制其资源。

红色/使用图案

RED使用模式监控和管理您的服务。

  • 请求
  • 错误
  • 期间

跟踪请求、响应中的错误以及接收响应的时长。根据这些信息,调整您的服务以获得最佳性能。

对于资源,使用USE模式。

  • 利用率
  • 饱和
  • 错误

监控资源利用率、资源饱和程度以及错误情况。根据这些信息调整资源配置,优化资源分配。

希望以上内容能帮助您对 Kubernetes 有一个大致的了解Kubernetes。请访问kubernetes.io获取更多关于 Kubernetes 的信息。

现在您想使用 Istio 在 Kubernetes 上部署示例应用程序,请查看这篇文章。

您可以在Twitter上关注我。

如果你喜欢这篇文章,请点赞或者留言。❤️

文章来源:https://dev.to/sendilkumarn/kubernetes-for-everyone-opb
PREV
大众适用的 Rust 和 WebAssembly - Rust 简介
NEXT
数据库 101:现实世界中数据库之间的迁移是如何进行的?