Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。
一、起源与背景
随着微服务架构的兴起,应用程序被拆分为多个小型、独立的服务模块,每个模块可以独立开发、测试和部署。容器技术(如 Docker)使得这些服务的打包和运行变得高效便捷。然而,管理系统中大量的容器、调度它们的运行位置、处理容器故障以及实现容器之间的通信等成为复杂的问题。Kubernetes 应运而生,它最初是由谷歌开发的,谷歌在大规模数据中心管理和容器编排方面有丰富的经验,后来捐赠给云原生计算基金会(CNCF),现在已经成为云计算和容器编排领域的一个重要标准。
二、Kubernetes主要功能
-
自动化部署和回滚
- 可以根据预定义的配置文件自动部署容器化的应用程序。当需要更新应用程序时,Kubernetes 可以逐步替换旧的容器实例,同时监控应用程序的健康状况。如果在更新过程中出现问题,它还可以自动回滚到之前的稳定版本。例如,一个电商网站在更新购物车服务时,Kubernetes 能够逐步将流量从旧版本的服务容器切换到新版本,一旦发现新版本出现问题(如响应时间过长、出现错误代码等),就将流量切回旧版本,保证了购物体验的连续性。
-
扩展和负载均衡
- Kubernetes 能够根据应用程序的实际需求(如 CPU 使用率、内存使用率等指标或者请求流量)自动扩展容器的数量。它内置了负载均衡机制,可以将网络流量均匀地分配到多个容器实例,避免单点过载。以一个视频流媒体服务为例,当大量用户同时观看热门视频时,Kubernetes 会根据服务器的负载情况自动增加视频服务容器的数量,通过负载均衡器将请求分散到这些容器上,确保每个用户都能流畅地观看视频。
-
存储编排
- 它可以挂载本地存储或者云存储系统(如 Amazon EBS、Google Persistent Disk 等)到容器中。这使得容器化的应用程序能够方便地访问持久化存储,就像在传统服务器环境中一样。比如一个数据库容器需要存储数据,Kubernetes 可以将一个持久化的存储卷挂载到该容器,保证数据在容器重新调度或者重启后不会丢失。
-
自我修复
- Kubernetes 能够持续监控容器的运行状态。如果一个容器出现了故障(如进程崩溃、健康检查失败等),系统会自动重新启动该容器。如果是容器所在的节点出现故障,它会将该节点上的容器重新调度到其他健康的节点上。例如,一个分布式计算任务运行在多个容器上,当其中一个容器所在的物理服务器出现硬件故障时,Kubernetes 会迅速将该容器在其他正常服务器上重新启动,保证了计算任务的继续进行。
三、Kubernetes架构
-
Master 节点(控制节点)
- API Server :这是 Kubernetes 的前端,用于接收和处理客户端的请求(如用户通过kubectl命令行工具发送的请求),并将其存储到数据存储系统中。它是集群内部组件之间通信的桥梁。
- Controller Manager :负责管理各种控制器,这些控制器是集群的调节器,它们确保集群的实际状态与用户期望的状态一致。例如,副本控制器(Replication Controller)会根据用户设置的副本数量确保一定数量的容器实例在运行。如果发现实例数量不足,它会创建新的容器;如果实例过多,它会删除多余的容器。
- Scheduler :它的主要任务是将新创建的容器分配到合适的节点上。它会根据节点的资源情况(如 CPU、内存等)、容器的资源需求以及其他策略(如亲和性和反亲和性规则)来做出调度决策。例如,一个需要大量内存的容器会被调度到内存资源充足的节点上。
-
Worker 节点(Node工作节点)
- Kubelet :这是运行在每个工作节点上的代理,它负责管理该节点上的容器,确保容器按照 Master 节点的指令运行。它与 Docker 等容器运行时交互,执行容器的启动、停止等操作。
- Kube - proxy :用于实现集群内部的网络通信和负载均衡。它管理网络规则,保证容器之间可以互相通信,并且根据定义的规则将网络流量正确地分发到目标容器。例如,在一个容器服务集群中,Kube - proxy 会根据服务的配置将外部请求转发到后端的多个容器实例。
- Pod: 这是 Kubernetes 中最基本的部署单位,它通常包含一个或者多个紧密相关的容器。这些容器共享网络、存储和操作系统命名空间。Pod 内的容器可以方便地相互通信,就像它们运行在同一个主机上一样。例如,一个 Web 应用程序可能由一个 Web 服务器容器和一个日志分析容器组成,它们可以被封装在一个 Pod 中,共享存储卷用于日志存储和网络接口用于内部通信。
Kubernetes 凭借其强大的功能和灵活的架构,为现代云计算和分布式系统提供了可靠的容器编排解决方案,已经被广泛应用于企业级的微服务架构和云原生应用开发中。
四、Kubernetes常用指令
4.1. 查看类命令
1. 获取节点相应服务的信息
kubectl get nodes
如果需要按selector名来查找相应的pod信息, 可以通过以下命令查看:
kubectl get pod --selector name=tomcat
2. 查看K8S集群信息
kubectl cluster-info
3. 查看各组件信息
kubectl -s http://localhost:8080 get componentstatuses
4. 查看pods所在的运行节点
kubectl get pods -o wide
如果需要通过某个命名空间查找节点信息, 可以通过以下命令查看:
kubectl get pods -o wide -n kube-system
- -o wide 选项表示展示更多的Pod节点信息
- -n <命名空间> 表示查询该命名空间下的Pod节点信息
如果需要查找所有命名空间下的所有Pod信息, 可以通过以下命令:
kubectl get pods --all-namespaces
或
kubectl get pods -o wide --all-namespaces #列出更多的详细信息
5. 查看pods定义的详细信息
kubectl get pods -o yaml
6. 查看运行的pod的环境变量
kubectl exec <pod名称> env
7. 查看指定pod的日志
kubectl logs -f pods/<pod名称> -n kube-system
8. 查看集群节点信息
kubectl get nodes
如果需要查看集群名称为zone
下的集群节点信息, 可以使用以下命令:
kubectl get nodes -l zone
9. 查看某个命名空间(如kube-system)下的所有service
kubectl get services kubernetes-dashboard -n kube-system
10. 查看某个命名空间(如kube-system)下的所有发布信息
kubectl get deployment kubernetes-dashboard -n kube-system
11. 查看资源信息
- 根据service名查看资源信息
- kubectl describe service/kubernetes-dashboard --namespace=“kube-system”
- 根据pod名称查看资源信息
- kubectl describe pods/kubernetes-dashboard-349859023-g6q8c --namespace=“kube-system”
- kubectl describe pod nginx-772ai
4.2. 操作类命令
1. 创建资源
kubectl create -f <文件名.yaml>
2. 重建资源
kubectl replace -f <文件名 [–force]
3. 删除资源
- 强制删除某个文件名命名节点
kubectl delete -f <文件名>
- 删除某个Pod命令节点
kubectl delete pod <pod名>
- 删除某个Replication Controller命名节点
kubectl delete rc <rc名>
- 删除某个服务命名节点
kubectl delete service <service名>
- 删除所有Pod节点
kubectl delete pod --all
4. 动态伸缩操作
- 为Replcation Controller名称为
nginx
动态扩展5个服务节点
kubectl scale rc nginx --replicas=5
- 为
redis-slave
部署5 个服务节点
kubectl scale deployment redis-slave --replicas=5
- 为
redis-slave-deployment.yaml
部署脚本下的服务扩展2个节点
kubectl scale --replicas=2 -f redis-slave-deployment.yaml
5. 进入Pod节点容器内进行操作
kubectl exec -it redis-master-1033017107-q47hh /bin/bash
6. Pod节点容器标签操作
- 增加Node节点label值
kubectl label nodes node1 zone=north
- 增加Pod的label值 [key]=[value]
kubectl label pod redis-master-1033017107-q47hh role=master
- 删除Pod的label值
kubectl label pod redis-master-1033017107-q47hh role-
- 修改Pod的label值
kubectl label pod redis-master-1033017107-q47hh role=backend --overwrite
7. 滚动升级及版本回滚
- 配置文件滚动升级
kubectl rolling-update redis-master -f redis-master-controller-v2.yaml
- 命令升级
kubectl rolling-update redis-master --image=redis-master:2.0
- Pod版本回滚
kubectl rolling-update redis-master --image=redis-master:1.0 --rollback