容器化之 Kubernetes (k8s)

官方文档

简介

Kubernetes 是一个开源的容器管理平台,由 Google 设计并开发,后捐赠给 Cloud Native Computing Foundation。它旨在提供一个灵活、可扩展的方式来部署和管理容器化的应用程序。

以下是 Kubernetes 的主要特性和功能:

容器编排和自动化

  • Kubernetes 可以管理和编排多个容器应用的部署、扩展、负载均衡等生命周期管理。它能够自动化地完成这些操作,免去了人工干预的需要。

自我修复能力

  • Kubernetes 会持续监控应用程序的运行状态,一旦发现容器出现故障,会自动重启或重新部署,确保应用的高可用性。

水平扩展

  • Kubernetes 可以根据应用程序的资源使用情况,如 CPU 和内存负载,自动增加或减少容器副本的数量,实现应用的弹性伸缩。

服务发现和负载均衡

  • Kubernetes 提供内置的服务发现和负载均衡机制,让容器化的应用可以被集群内外的客户端访问。

存储编排

  • Kubernetes 可以管理各种存储系统,如本地存储、网络存储和云存储,为容器提供持久化存储。

配置和密钥管理

  • Kubernetes 可以集中管理应用程序的配置信息和敏感数据,如密码、证书等,提高了安全性。

批处理工作负载

  • 除了长期运行的服务,Kubernetes 也可以处理短期的批处理任务,如数据分析、机器学习等。

总的来说, Kubernetes 是一个功能强大、可扩展的容器编排平台,能够帮助开发者更好地管理和运营容器化的应用程序。它已经成为当前容器技术领域事实上的标准。

k8s的组成

Kubernetes 的主要组成部分如下:

Master 节点

  • API Server: 提供 Kubernetes API,是集群的入口。
  • Scheduler: 负责为新创建的 Pod 分配节点。
  • Controller Manager: 负责管理集群的状态,如 Replication Controller、Node Controller 等。
  • etcd: 键值对存储,保存集群的配置数据和状态信息。

Worker 节点

  • Kubelet: 在节点上管理 Pod 的生命周期。
  • Kube-proxy: 提供 Service 的 TCP/UDP 转发和负载均衡。
  • Docker/CRI-O/containerd: 容器运行时,负责创建和管理容器。

Pod

  • Kubernetes 管理的最小部署单元,包含一个或多个紧密相关的容器。
  • Pod 中的容器共享网络和存储资源。

Service

  • 为一组 Pod 提供稳定的网络标识和负载均衡。
  • Service 可以将请求转发到后端 Pod。

Volume

  • 为 Pod 提供持久化存储,支持多种存储后端。
  • 卷在 Pod 的生命周期内持续存在。

访问机制

Kubernetes 集群内部网络的访问机制,需要区分不同的情况:

集群内部服务之间的访问

  • 在 Kubernetes 集群内部,不同 Pod 或 Service 之间的访问是通过 kube-dns 或 CoreDNS 提供的 DNS 服务进行解析和访问的,而不需要经过 kube-apiserver。
  • 这种情况下,服务之间的请求是直接在集群内部网络中完成的,不需要经过 kube-apiserver。

集群外部访问集群内部服务

  • 当集群外部的客户端需要访问集群内部的服务时,需要通过 kube-apiserver 提供的 API 服务。
  • 这是因为 kube-apiserver 对外提供了统一的 API 接口,客户端需要通过 kube-apiserver 来发现和访问集群内部的各种资源。

server端的数据流

Kubernetes 数据流如下:

  • 用户通过 kubectl 或 API Server 提交应用部署请求。
  • API Server 将请求写入 etcd,并触发 Controller Manager 进行资源调度。
  • Scheduler 选择合适的 Worker 节点,Kubelet 在节点上创建 Pod。
  • Pod 内的容器通过 Kube-proxy 提供的 Service 进行互联互访。
  • 容器访问 Volume 获取持久化存储。
  • Monitoring 系统收集集群和应用的监控数据。

服务的数据流

Kubernetes 部署了一个 Web 服务,从客户端发起请求到服务响应的整个流程如下:

客户端发起请求

客户端向 Kubernetes 集群外部暴露的 IP 地址和端口发起访问请求。

服务发现

  • Kubernetes 集群内部的 kube-proxy 组件会将客户端请求转发到对应的 Service 资源。
  • Service 资源会根据关联的 Selector 找到提供服务的 Pod。

负载均衡

  • Service 会根据配置的负载均衡策略(如 RoundRobin)将请求分发到后端 Pod 实例。
  • 这一过程是通过 kube-proxy 在各节点上维护的 iptables 规则来实现的。

请求转发

  • 请求会被转发到对应的 Pod 实例上,Pod 内的 Container 会处理并响应请求。

响应返回

  • Container 处理完请求后,响应会沿着同样的路径返回给客户端。
  • 客户端最终收到来自 Kubernetes 集群的响应结果。

访问需要经历的步骤

访问一个部署在 Kubernetes 集群上的 Web 应用服务,需要经历以下几个步骤:

创建 Service 对象

  • 首先,您需要在 Kubernetes 集群中定义一个 Service 对象,用于为后端 Pod 提供稳定的网络访问入口。
  • Service 对象会根据标签选择器自动关联后端 Pod,并提供负载均衡和服务发现功能。

确定 Service 访问方式

  • Kubernetes 支持多种 Service 类型,如 ClusterIP、NodePort、LoadBalancer 等,您可以根据需求选择合适的类型。
  • 比如,ClusterIP 类型的 Service 只能在集群内部访问,而 NodePort 类型可以通过集群节点的端口访问。

获取 Service 访问地址

  • 如果您使用 ClusterIP 类型,可以通过集群内部的 DNS 服务访问 Service。
  • 如果使用 NodePort 类型,可以获取集群某个节点的 IP 地址和端口号进行访问。
  • 如果使用 LoadBalancer 类型,可以获取云提供商分配的公网 IP 地址进行访问。

发起访问请求

  • 使用获取的 Service 访问地址(IP 地址和端口号或 DNS 名称),通过 HTTP/HTTPS 协议发起对 Web 应用服务的访问请求。

Kubernetes 处理访问请求

  • Kubernetes 的 Kube-proxy 组件会将请求转发到后端 Pod 实例,并根据负载均衡策略选择合适的 Pod 进行服务。
  • 底层的网络插件(如 Flannel、Calico 等)会负责 Pod 之间的网络互联。

响应返回

  • 被选中的 Pod 实例处理请求并返回响应,最终通过 Kubernetes 的网络路由机制返回给客户端。

谈谈Kube-proxy

Kube-proxy 的处理能力主要取决于以下几个方面:

硬件资源

  • Kube-proxy 运行在 Kubernetes 的 Worker 节点上,其处理能力取决于节点的 CPU、内存等硬件资源。
  • 如果节点配置较低,可能无法支撑大并发的请求量。

请求类型和复杂度

  • Kube-proxy 主要负责网络报文的转发和负载均衡,对于简单的 TCP/UDP 转发能力较强。
  • 但如果请求较为复杂,需要进行深度包检查或应用层转发,可能会成为性能瓶颈。

部署模式

  • Kube-proxy 可以以 userspace 模式或 iptables 模式运行,两种模式在性能上有所差异。
  • iptables 模式通常比 userspace 模式具有更好的性能。

为了解决 Kube-proxy 的性能瓶颈,通常会采取以下几种措施:

合理规划节点配置

  • 根据预估的请求量,选择配置更高的 Worker 节点。
  • 或者采用 GPU 加速的节点,提升 Kube-proxy 的转发能力。

使用负载均衡器

  • 可以在 Kubernetes 之外部署高性能的负载均衡器,如 Nginx、HAProxy 等。
  • 负载均衡器可以分担 Kube-proxy 的工作,提升整体的服务处理能力。

部署 Ingress 控制器

  • Ingress 控制器可以提供更加灵活和强大的路由和负载均衡功能。
  • 与 Kube-proxy 相比,Ingress 控制器可以提供更好的性能和功能。

水平扩展 Worker 节点

  • 根据实际需求,可以增加 Worker 节点的数量,提升集群的整体处理能力。
  • 这样可以分摊 Kube-proxy 的工作负载,提高集群的可扩展性。

常见操作

部署应用

使用 YAML 文件创建 Deployment:


kubectl apply -f deployment.yaml

使用 Helm 安装应用:


helm install my-app stable/nginx-ingress

扩容/缩容应用

手动调整 Deployment 的 replica 数量:


kubectl scale deployment my-app --replicas=5

配置 HorizontalPodAutoscaler 自动扩缩容:


kubectl autoscale deployment my-app --cpu-percent=50 --min=2 --max=10

更新应用

使用 set 命令修改 Deployment 的镜像版本:


kubectl set image deployment my-app my-container=nginx:1.16

使用 apply 命令应用新的 YAML 配置:


kubectl apply -f new-deployment.yaml

查看集群状态

查看所有 Namespace 下的 Pod:


kubectl get pods --all-namespaces

查看某个 Deployment 的详细信息:


kubectl describe deployment my-app

管理存储

创建 PersistentVolumeClaim:


kubectl apply -f pvc.yaml

查看 PersistentVolumeClaim 的绑定状态:


kubectl get pvc

配置管理

创建 ConfigMap:


kubectl create configmap my-config --from-literal=key=value

在 Pod 中使用 ConfigMap 挂载为环境变量或文件:


containers:
- name: my-container
  env:
  - name: MY_ENV_VAR
    valueFrom:
      configMapKeyRef:
        name: my-config
        key: key

排障和日志收集

查看 Pod 的日志:


kubectl logs my-pod

进入 Pod 内部执行命令:


kubectl exec my-pod -- /bin/bash

查看集群节点状态:


kubectl get nodes

这只是 Kubernetes 中一些常见操作的示例,实际使用中还有很多高级用法和技巧。关键是要根据具体的应用场景和需求,灵活运用这些指令组合来管理集群和应用。

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherry Xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值