掘金 后端 ( ) • 2024-04-18 14:01
k8s

简介

Kubernetes(通常简称为K8s)是一个开源的容器管理系统,由Google公司发起并贡献给Cloud Native Computing Foundation(CNCF),现已成为云原生计算领域事实上的标准。Kubernetes的设计目标是自动化容器化应用程序的部署、管理和扩展。

核心功能

  1. 容器编排:Kubernetes能够在一个集群环境中有效地组织和管理容器(如Docker容器),确保容器按照预定的状态运行。
  2. 服务发现与负载均衡:提供内置的服务发现机制,使得容器服务可以被自动寻址,并通过负载均衡器分发流量。
  3. 自动伸缩:根据预定义的策略自动调整容器的数量,以满足应用程序负载变化的需求。
  4. 滚动更新与回滚:支持无缝地更新或回滚应用程序版本,保证系统的连续可用性。
  5. 存储编排:管理容器持久化数据的存储卷,支持多种存储类型。
  6. 健康检查与自我修复:通过定期健康检查,确保容器处于良好状态,如果出现问题,Kubernetes会尝试自动恢复。
  7. 安全控制:提供细粒度的访问控制、身份验证和授权机制。

架构概述

  • Master节点:主要包括kube-apiserver(API服务器)、etcd(存储系统的核心数据)、kube-scheduler(负责容器调度)和kube-controller-manager(运行各种控制器,如节点控制器、副本集控制器等)。
  • Worker节点(也称为Minion节点):运行kubelet(与Master节点通信,负责在本地执行容器相关任务)、kube-proxy(实现网络代理和负载均衡)以及其他容器运行时环境(如Docker)。
  • kubectl:是Kubernetes的命令行工具,用户可以通过它与集群交互,执行创建、修改和删除应用实例等各种操作。

常用组件

Master节点组件:

  1. kube-apiserver

    • 功能:Kubernetes的核心组件,作为集群的统一入口,提供RESTful API服务,用于资源的增删改查操作,与etcd进行交互,同步集群状态。
    • 使用:通过kubectl命令行工具或其他客户端向其发送HTTP请求以管理集群资源。
  2. etcd

    • 功能:分布式键值存储系统,存储集群的配置数据和状态信息。
    • 使用:集群内部组件通过API Server间接与etcd交互;一般无需直接操作,但在集群初始化和维护时可能需要使用etcdctl工具进行管理。
  3. kube-scheduler

    • 功能:根据预定的调度策略,决定将Pod调度到哪个Node节点上。
    • 使用:Kubernetes系统自动调用scheduler进行调度决策,无需手动干预。
  4. kube-controller-manager

    • 功能:运行多个控制器进程,维持集群状态,例如节点控制器、副本集控制器、端点控制器等,负责诸如故障检测、自动扩展、滚动更新等工作。
    • 使用:也是自动运行,但可通过自定义控制器拓展其功能。

Worker节点组件:

  1. kubelet

    • 功能:运行在每个Node节点上,负责Pod和容器的生命周期管理,包括启动、停止、监控容器,与Master节点通信获取Pod的配置并确保Pod在本地正确运行。
    • 使用:kubelet自动运行,通过配置文件和API Server指令控制。
  2. kube-proxy

    • 功能:在各个Node上实现Service的网络代理和负载均衡,确保集群内部服务发现和负载均衡功能正常运作。
    • 使用:kube-proxy也是自动部署和运行,通过kubelet管理。
  3. Container Runtime

    • 功能:负责拉取、运行和管理容器,常见的有Docker、containerd和CRI-O等。
    • 使用:通过kubelet与Container Runtime Interface (CRI) 协议进行交互,以启动和管理容器。

其他重要组件:

  1. kubectl

    • 功能:Kubernetes的命令行工具,用户通过kubectl与集群进行交互,进行集群管理、Pod创建、服务配置等操作。
    • 使用:在终端中执行kubectl命令,例如 kubectl createkubectl applykubectl getkubectl delete 等。
  2. Ingress Controller

    • 功能:用于为集群内的服务提供外部访问能力,管理进入集群的HTTP(S)流量,实现路由、SSL终止等功能。
    • 使用:通过yaml文件定义Ingress资源,kubectl应用配置,Ingress Controller(如Nginx Ingress Controller)根据配置自动设置路由规则。
  3. kube-dns 或 CoreDNS

    • 功能:为集群内服务提供DNS解析,使得Pod之间可以通过服务名进行相互访问。
    • 使用:通常是集群部署时自动配置,也可以通过yaml配置文件创建和管理。
  4. Persistent Volume (PV) 和 Persistent Volume Claim (PVC)

    • 功能:提供持久化存储方案,PV是集群中的存储资源,PVC是用户对存储资源的请求。
    • 使用:通过yaml文件定义PVC,系统会自动绑定PV,或者管理员预先创建PV。
  5. Helm

    • 功能:包管理工具,用来简化Kubernetes应用程序的打包、安装和升级流程。
    • 使用:通过helm命令行工具安装chart包,管理Kubernetes应用集合。
  6. Calico Calico是一款专为容器、虚拟机和基于主机的工作负载设计的开源网络和网络安全解决方案。在Kubernetes等容器编排系统中,Calico常作为网络策略引擎和网络插件使用,其主要功能包括:

    1. 网络连接
    • Calico提供了一种灵活的方式为容器分配IP地址,并且通过BGP(边界网关协议)实现容器间的三层网络通信。这意味着容器可以直接通过IP地址相互通信,类似于传统的网络环境,提高了网络效率。
    1. 网络策略
    • Calico允许管理员定义详细的网络策略,控制容器间的网络流量。这些策略可以根据标签(labels)进行精细化配置,包括允许或阻止进出容器的网络流量,实现微隔离和安全防护。
    1. CNI插件
    • Calico符合CNI(容器网络接口)标准,可以作为Kubernetes集群中的网络插件,负责在Pod创建时配置网络接口,确保Pod能够与其他网络实体进行通信。
    1. 网络安全
    • Calico不仅限于提供网络连接和策略,还支持网络策略的强制实施,确保只有经过授权的流量才能在网络中流动,增强了整个容器平台的安全性。
    1. 性能表现
    • Calico设计上追求高效和轻量,尽量减小对网络性能的影响,尤其是在大规模部署时,其三层网络模型能较好地适应大规模集群的扩展需求。

简单来说,Calico在Kubernetes环境中承担了构建和管理容器间网络连接,以及确保网络通信安全的重要职责,是实现云原生环境下网络管理的重要工具。

原理

  1. Master节点组件与API Server

    • Kubernetes的主控部分位于Master节点上,主要组件包括kube-apiserver、etcd、kube-scheduler和kube-controller-manager。
    • kube-apiserver作为集群的中枢神经,提供了RESTful API接口供用户和其他组件操作集群资源,所有集群状态变更都通过API Server进行。
    • etcd是一个高可用的键值存储系统,用于存储集群的元数据和配置信息,它是集群状态的持久化存储。
  2. Worker节点组件

    • Worker节点(也称Node节点)上运行的主要组件有kubelet、kube-proxy和容器运行时(如Docker、containerd)。
    • kubelet负责本节点上Pod的生命周期管理,包括创建、启停容器,监测容器健康状况,并通过与API Server通信保持节点与集群状态的一致性。
    • kube-proxy负责在Node节点上实现Service的网络代理与负载均衡,确保跨节点间的Pod间通信和服务发现机制正常工作。
  3. 控制循环与控制器

    • Kubernetes采用了控制循环(control loop)的概念,通过一系列控制器(Controller)来驱动集群达到预期状态。
    • 控制器监听API Server中的资源对象状态变化,当检测到实际状态与所需状态不一致时,它们会采取行动进行纠正,例如通过创建、更新或删除Pod来匹配ReplicaSet定义的副本数量。
  4. Pods与容器

    • Pod是Kubernetes中最小的可部署实体,它可以容纳一个或多个紧密相关的容器,这些容器共享网络命名空间和存储卷。
    • Kubernetes利用Pod抽象来管理容器,允许在同一Pod内的容器共享资源,并通过标签选择器(label selectors)来进行高级的资源组织和调度。
  5. 网络与服务

    • Kubernetes通过插件化网络模型实现了跨节点的Pod间通信,每个Pod都会被分配一个唯一的IP地址,使得任意两个Pod无论在哪个Node上都能直接通信。
    • Service是Kubernetes提供的抽象,用于定义一种到一组具有相同功能Pod的稳定访问策略,可以提供负载均衡、服务发现、DNS解析等功能。
  6. 调度与扩缩容

    • kube-scheduler根据资源需求、亲和性和反亲和性规则以及其它策略,决定Pod应被调度到哪个Node上运行。
    • 用户可以通过Horizontal Pod Autoscaler(HPA)动态调整Pod的数量,以响应CPU或内存使用率的变化,实现水平扩容或缩容。
  7. 存储卷管理

    • Kubernetes支持持久化存储,通过PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 对象来实现动态或静态的存储分配和释放。

常用命令行

Kubernetes(K8s)常用的命令行工具是kubectl,以下是kubectl的一些基本命令示例:

  1. 获取集群信息:

    kubectl cluster-info
    
  2. 获取节点列表:

    kubectl get nodes
    
  3. 列出所有命名空间:

    kubectl get namespaces
    
  4. 创建一个新的命名空间:

    kubectl create namespace mynamespace
    
  5. 查看特定类型的资源,比如所有Pod:

    kubectl get pods
    
  6. 查看特定命名空间下的资源:

    kubectl get pods --namespace=mynamespace
    
  7. 获取资源详情:

    kubectl describe pod <pod-name>
    
  8. 创建资源,例如从yaml或json文件创建Deployment:

    kubectl apply -f deployment.yaml
    
  9. 删除资源:

    kubectl delete deployment <deployment-name>
    
  10. 进入Pod的shell:

    kubectl exec -it <pod-name> -- /bin/bash
    
  11. 标签操作:

  • 添加标签:

    kubectl label pod <pod-name> key=value
    
  • 删除标签:

    kubectl label pod <pod-name> key-
    
  1. 设置Pod的重启策略:

    kubectl set restartpolicy deployment/<deployment-name> OnFailure
    
  2. 滚动更新或回滚Deployment:

  • 更新:

    kubectl set image deployment/<deployment-name> <container-name>=<new-image>
    
  • 回滚:

    kubectl rollout undo deployment/<deployment-name>
    
  1. 查看集群资源使用情况(需已安装metrics-server):

    kubectl top nodes
    kubectl top pods --namespace=<namespace>
    
  2. 清理无效Pods(例如那些由于节点丢失而未被删除的Pod):

    kubectl delete pod <pod-name> --grace-period=0 --force