简介
Kubernetes(通常简称为K8s)是一个开源的容器管理系统,由Google公司发起并贡献给Cloud Native Computing Foundation(CNCF),现已成为云原生计算领域事实上的标准。Kubernetes的设计目标是自动化容器化应用程序的部署、管理和扩展。
核心功能
- 容器编排:Kubernetes能够在一个集群环境中有效地组织和管理容器(如Docker容器),确保容器按照预定的状态运行。
- 服务发现与负载均衡:提供内置的服务发现机制,使得容器服务可以被自动寻址,并通过负载均衡器分发流量。
- 自动伸缩:根据预定义的策略自动调整容器的数量,以满足应用程序负载变化的需求。
- 滚动更新与回滚:支持无缝地更新或回滚应用程序版本,保证系统的连续可用性。
- 存储编排:管理容器持久化数据的存储卷,支持多种存储类型。
- 健康检查与自我修复:通过定期健康检查,确保容器处于良好状态,如果出现问题,Kubernetes会尝试自动恢复。
- 安全控制:提供细粒度的访问控制、身份验证和授权机制。
架构概述
- Master节点 :主要包括
kube-apiserver
(API服务器)、etcd
(存储系统的核心数据)、kube-scheduler
(负责容器调度)和kube-controller-manager
(运行各种控制器,如节点控制器、副本集控制器等)。 - Worker节点 (也称为Minion节点):运行
kubelet
(与Master节点通信,负责在本地执行容器相关任务)、kube-proxy
(实现网络代理和负载均衡)以及其他容器运行时环境(如Docker)。 - kubectl:是Kubernetes的命令行工具,用户可以通过它与集群交互,执行创建、修改和删除应用实例等各种操作。
常用组件
Master节点组件:
-
kube-apiserver:
- 功能:Kubernetes的核心组件,作为集群的统一入口,提供RESTful API服务,用于资源的增删改查操作,与etcd进行交互,同步集群状态。
- 使用:通过kubectl命令行工具或其他客户端向其发送HTTP请求以管理集群资源。
-
etcd:
- 功能:分布式键值存储系统,存储集群的配置数据和状态信息。
- 使用:集群内部组件通过API Server间接与etcd交互;一般无需直接操作,但在集群初始化和维护时可能需要使用etcdctl工具进行管理。
-
kube-scheduler:
- 功能:根据预定的调度策略,决定将Pod调度到哪个Node节点上。
- 使用:Kubernetes系统自动调用scheduler进行调度决策,无需手动干预。
-
kube-controller-manager:
- 功能:运行多个控制器进程,维持集群状态,例如节点控制器、副本集控制器、端点控制器等,负责诸如故障检测、自动扩展、滚动更新等工作。
- 使用:也是自动运行,但可通过自定义控制器拓展其功能。
Worker节点组件:
-
kubelet:
- 功能:运行在每个Node节点上,负责Pod和容器的生命周期管理,包括启动、停止、监控容器,与Master节点通信获取Pod的配置并确保Pod在本地正确运行。
- 使用:kubelet自动运行,通过配置文件和API Server指令控制。
-
kube-proxy:
- 功能:在各个Node上实现Service的网络代理和负载均衡,确保集群内部服务发现和负载均衡功能正常运作。
- 使用:kube-proxy也是自动部署和运行,通过kubelet管理。
-
Container Runtime:
- 功能:负责拉取、运行和管理容器,常见的有Docker、containerd和CRI-O等。
- 使用:通过kubelet与Container Runtime Interface (CRI) 协议进行交互,以启动和管理容器。
其他重要组件:
-
kubectl:
- 功能:Kubernetes的命令行工具,用户通过kubectl与集群进行交互,进行集群管理、Pod创建、服务配置等操作。
- 使用:在终端中执行kubectl命令,例如
kubectl create
,kubectl apply
,kubectl get
,kubectl delete
等。
-
Ingress Controller:
- 功能:用于为集群内的服务提供外部访问能力,管理进入集群的HTTP(S)流量,实现路由、SSL终止等功能。
- 使用:通过yaml文件定义Ingress资源,kubectl应用配置,Ingress Controller(如Nginx Ingress Controller)根据配置自动设置路由规则。
-
kube-dns 或 CoreDNS:
- 功能:为集群内服务提供DNS解析,使得Pod之间可以通过服务名进行相互访问。
- 使用:通常是集群部署时自动配置,也可以通过yaml配置文件创建和管理。
-
Persistent Volume (PV) 和 Persistent Volume Claim (PVC) :
- 功能:提供持久化存储方案,PV是集群中的存储资源,PVC是用户对存储资源的请求。
- 使用:通过yaml文件定义PVC,系统会自动绑定PV,或者管理员预先创建PV。
-
Helm:
- 功能:包管理工具,用来简化Kubernetes应用程序的打包、安装和升级流程。
- 使用:通过helm命令行工具安装chart包,管理Kubernetes应用集合。
-
Calico Calico是一款专为容器、虚拟机和基于主机的工作负载设计的开源网络和网络安全解决方案。在Kubernetes等容器编排系统中,Calico常作为网络策略引擎和网络插件使用,其主要功能包括:
- 网络连接:
- Calico提供了一种灵活的方式为容器分配IP地址,并且通过BGP(边界网关协议)实现容器间的三层网络通信。这意味着容器可以直接通过IP地址相互通信,类似于传统的网络环境,提高了网络效率。
- 网络策略:
- Calico允许管理员定义详细的网络策略,控制容器间的网络流量。这些策略可以根据标签(labels)进行精细化配置,包括允许或阻止进出容器的网络流量,实现微隔离和安全防护。
- CNI插件:
- Calico符合CNI(容器网络接口)标准,可以作为Kubernetes集群中的网络插件,负责在Pod创建时配置网络接口,确保Pod能够与其他网络实体进行通信。
- 网络安全:
- Calico不仅限于提供网络连接和策略,还支持网络策略的强制实施,确保只有经过授权的流量才能在网络中流动,增强了整个容器平台的安全性。
- 性能表现:
- Calico设计上追求高效和轻量,尽量减小对网络性能的影响,尤其是在大规模部署时,其三层网络模型能较好地适应大规模集群的扩展需求。
简单来说,Calico在Kubernetes环境中承担了构建和管理容器间网络连接,以及确保网络通信安全的重要职责,是实现云原生环境下网络管理的重要工具。
原理
-
Master节点组件与API Server:
- Kubernetes的主控部分位于Master节点上,主要组件包括kube-apiserver、etcd、kube-scheduler和kube-controller-manager。
- kube-apiserver作为集群的中枢神经,提供了RESTful API接口供用户和其他组件操作集群资源,所有集群状态变更都通过API Server进行。
- etcd是一个高可用的键值存储系统,用于存储集群的元数据和配置信息,它是集群状态的持久化存储。
-
Worker节点组件:
- Worker节点(也称Node节点)上运行的主要组件有kubelet、kube-proxy和容器运行时(如Docker、containerd)。
- kubelet负责本节点上Pod的生命周期管理,包括创建、启停容器,监测容器健康状况,并通过与API Server通信保持节点与集群状态的一致性。
- kube-proxy负责在Node节点上实现Service的网络代理与负载均衡,确保跨节点间的Pod间通信和服务发现机制正常工作。
-
控制循环与控制器:
- Kubernetes采用了控制循环(control loop)的概念,通过一系列控制器(Controller)来驱动集群达到预期状态。
- 控制器监听API Server中的资源对象状态变化,当检测到实际状态与所需状态不一致时,它们会采取行动进行纠正,例如通过创建、更新或删除Pod来匹配ReplicaSet定义的副本数量。
-
Pods与容器:
- Pod是Kubernetes中最小的可部署实体,它可以容纳一个或多个紧密相关的容器,这些容器共享网络命名空间和存储卷。
- Kubernetes利用Pod抽象来管理容器,允许在同一Pod内的容器共享资源,并通过标签选择器(label selectors)来进行高级的资源组织和调度。
-
网络与服务:
- Kubernetes通过插件化网络模型实现了跨节点的Pod间通信,每个Pod都会被分配一个唯一的IP地址,使得任意两个Pod无论在哪个Node上都能直接通信。
- Service是Kubernetes提供的抽象,用于定义一种到一组具有相同功能Pod的稳定访问策略,可以提供负载均衡、服务发现、DNS解析等功能。
-
调度与扩缩容:
- kube-scheduler根据资源需求、亲和性和反亲和性规则以及其它策略,决定Pod应被调度到哪个Node上运行。
- 用户可以通过Horizontal Pod Autoscaler(HPA)动态调整Pod的数量,以响应CPU或内存使用率的变化,实现水平扩容或缩容。
-
存储卷管理:
- Kubernetes支持持久化存储,通过PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 对象来实现动态或静态的存储分配和释放。
常用命令行
Kubernetes(K8s)常用的命令行工具是kubectl,以下是kubectl的一些基本命令示例:
-
获取集群信息:
Bashkubectl cluster-info
-
获取节点列表:
Bashkubectl get nodes
-
列出所有命名空间:
Bashkubectl get namespaces
-
创建一个新的命名空间:
Bashkubectl create namespace mynamespace
-
查看特定类型的资源,比如所有Pod:
Bashkubectl get pods
-
查看特定命名空间下的资源:
Bashkubectl get pods --namespace=mynamespace
-
获取资源详情:
Bashkubectl describe pod <pod-name>
-
创建资源,例如从yaml或json文件创建Deployment:
Bashkubectl apply -f deployment.yaml
-
删除资源:
Bashkubectl delete deployment <deployment-name>
-
进入Pod的shell:
Bashkubectl exec -it <pod-name> -- /bin/bash
-
标签操作:
-
添加标签:
Bashkubectl label pod <pod-name> key=value
-
删除标签:
Bashkubectl label pod <pod-name> key-
-
设置Pod的重启策略:
Bashkubectl set restartpolicy deployment/<deployment-name> OnFailure
-
滚动更新或回滚Deployment:
-
更新:
Bashkubectl set image deployment/<deployment-name> <container-name>=<new-image>
-
回滚:
Bashkubectl rollout undo deployment/<deployment-name>
-
查看集群资源使用情况(需已安装metrics-server):
Bashkubectl top nodes kubectl top pods --namespace=<namespace>
-
清理无效Pods(例如那些由于节点丢失而未被删除的Pod):
Bashkubectl delete pod <pod-name> --grace-period=0 --force