Kubernetes
一、Kubernetes 简介
1.1 容器编排背景
- 传统部署方式:应用直接部署在物理机上,资源无法隔离,利用率低,部署和扩缩容困难。
- 虚拟化部署方式:通过虚拟机实现资源隔离,但虚拟化层开销大,启动慢。
- 容器部署方式:轻量级隔离,共享宿主机内核,启动快、资源利用率高,但容器数量增多时管理复杂,需要容器编排工具。
1.2 Kubernetes 定义
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了跨多个节点的容器集群管理能力,解决了容器化应用的部署、扩缩容、服务发现、负载均衡、故障恢复等问题。
1.3 Kubernetes 优势
- 自动化部署与扩缩容:根据负载自动调整应用实例数量。
- 服务发现与负载均衡:通过内置服务发现机制和负载均衡器,使应用可以方便地互相访问。
- 高可用性:确保应用始终有足够的实例运行,自动替换失败的容器。
- 资源管理:精确控制容器对CPU、内存等资源的使用。
- 滚动更新与回滚:支持平滑更新应用版本,出现问题时可快速回滚。
- 存储编排:自动挂载存储系统,支持多种存储类型。
- 批处理作业:支持运行一次性任务和批处理作业。
二、Kubernetes 核心概念
2.1 节点(Node)
- 定义:Kubernetes集群中的工作机器,可以是物理机或虚拟机,负责运行容器。
- 组件:
- kubelet:负责与API Server通信,管理节点上的容器生命周期。
- kube-proxy:实现服务的网络代理和负载均衡。
- 容器运行时:如Docker、containerd等,负责运行容器。
2.2 Pod
- 定义:Kubernetes中最小的可部署单元,是一组紧密关联的容器集合,共享网络和存储。
- 特点:
- 同一Pod内的容器共享IP地址和端口空间,可通过localhost直接通信。
- 共享存储卷,可在容器间共享数据。
- 总是运行在同一个节点上。
- 生命周期:短暂的,创建后不会自动重启,需要通过控制器管理。
2.3 控制器(Controller)
- 定义:负责管理Pod的生命周期,确保Pod按预期运行。
- 常见控制器:
- Deployment:用于无状态应用的部署和管理,支持滚动更新和回滚。
- StatefulSet:用于有状态应用的部署,保证Pod的有序性和持久化存储。
- DaemonSet:确保每个节点上都运行一个相同的Pod副本,常用于监控、日志收集等系统服务。
- Job:用于运行一次性任务,任务完成后Pod终止。
- CronJob:基于时间的Job,按指定时间间隔重复执行任务。
2.4 服务(Service)
- 定义:为一组功能相同的Pod提供统一的访问入口,实现服务发现和负载均衡。
- 类型:
- ClusterIP:默认类型,在集群内部暴露服务,通过集群内部IP访问。
- NodePort:在每个节点上开放一个端口,通过节点IP和端口访问服务。
- LoadBalancer:利用云提供商的负载均衡器向外部暴露服务。
- ExternalName:将服务映射到外部域名。
2.5 存储卷(Volume)
- 定义:Pod中容器可以访问的存储目录,用于持久化数据和容器间共享数据。
- 常见类型:
- emptyDir:临时存储,Pod删除时数据丢失。
- hostPath:挂载节点上的文件或目录,用于容器与节点间共享数据。
- persistentVolumeClaim(PVC):声明使用持久化存储,通过PersistentVolume(PV)提供。
- NFS、Ceph、AWS EBS等:各种网络存储和云存储。
2.6 命名空间(Namespace)
- 定义:将集群资源划分为多个虚拟空间,用于多租户隔离和资源分组管理。
- 适用场景:
- 大型组织中不同团队使用不同命名空间。
- 开发、测试、生产环境使用不同命名空间。
- 默认命名空间:
- default:未指定命名空间的资源默认放入此命名空间。
- kube-system:Kubernetes系统组件使用的命名空间。
- kube-public:公共资源使用的命名空间。
三、Kubernetes 架构
3.1 控制平面(Control Plane)
- 定义:负责整个集群的决策和管理,包括集群状态的维护、资源调度等。
- 组件:
- kube-apiserver:集群的统一入口,处理REST API请求,是其他组件通信的中心。
- etcd:高可用的键值存储,保存集群的所有状态数据。
- kube-scheduler:负责将Pod调度到合适的节点上运行。
- kube-controller-manager:运行各种控制器,确保集群状态与期望状态一致。
- cloud-controller-manager:与云提供商的API交互,管理云资源。
3.2 工作节点(Worker Node)
- 定义:运行应用容器的节点。
- 组件:
- kubelet:与API Server通信,管理节点上的Pod和容器。
- kube-proxy:实现服务的网络代理和负载均衡。
- 容器运行时:如Docker、containerd等,负责运行容器。
3.3 网络组件
- CNI(容器网络接口):Kubernetes的网络插件标准,常见的CNI插件有Flannel、Calico、Weave Net等。
- CoreDNS:集群内部的DNS服务,为服务提供域名解析。
四、Kubernetes 对象与配置
4.1 YAML 配置文件
- 定义:Kubernetes使用YAML格式的配置文件来定义和管理资源。
- 基本结构:
apiVersion: v1 # API版本 kind: Pod # 对象类型 metadata: # 元数据 name: my-pod labels: app: my-app spec: # 规格 containers: - name: my-container image: nginx:1.14.2 ports: - containerPort: 80
4.2 常用命令
- kubectl:Kubernetes的命令行工具,用于与集群交互。
- 常用命令示例:
# 创建资源 kubectl create -f resource.yaml # 查看资源 kubectl get pods kubectl get services kubectl get nodes # 查看资源详细信息 kubectl describe pod my-pod # 更新资源 kubectl apply -f resource.yaml # 删除资源 kubectl delete -f resource.yaml kubectl delete pod my-pod # 查看日志 kubectl logs my-pod # 执行命令 kubectl exec -it my-pod -- /bin/bash
五、Kubernetes 网络模型
5.1 网络模型原则
- 所有Pod可以在不使用NAT的情况下与其他Pod通信。
- 所有节点可以在不使用NAT的情况下与所有Pod通信。
- Pod的IP地址是全局唯一的,并且可以直接访问。
5.2 网络插件
- Flannel:简单的覆盖网络,使用VXLAN或UDP封装数据包。
- Calico:基于BGP的网络插件,提供网络策略功能。
- Weave Net:自组织网络,支持加密和多租户。
- Canal:结合了Flannel的网络和Calico的网络策略。
5.3 服务发现与负载均衡
- Service:为一组Pod提供稳定的IP地址和DNS名称。
- kube-proxy:在每个节点上运行,实现Service的负载均衡和流量转发。
- Endpoint:Service的后端Pod的IP和端口集合。
六、Kubernetes 存储
6.1 持久化存储
- PersistentVolume(PV):集群中的存储资源,由管理员创建和管理。
- PersistentVolumeClaim(PVC):用户对存储资源的请求,绑定到合适的PV。
- StorageClass:动态创建PV的模板,定义存储类型和参数。
6.2 存储卷类型
- 本地存储:emptyDir、hostPath。
- 网络存储:NFS、iSCSI、Ceph、GlusterFS等。
- 云存储:AWS EBS、GCP PD、Azure Disk等。
七、Kubernetes 安全
7.1 认证与授权
- 认证:验证用户或服务的身份,支持多种认证方式:
- 客户端证书
- 令牌(Token)
- OpenID Connect
- Webhook
- 授权:决定用户可以执行哪些操作,常见的授权模式:
- Node:用于kubelet的特殊授权模式
- RBAC(基于角色的访问控制)
- ABAC(基于属性的访问控制)
- Webhook
7.2 网络策略
- 定义:基于标签选择Pod,控制Pod之间的网络通信。
- 示例:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend spec: podSelector: matchLabels: role: backend ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 80
7.3 安全上下文
- 定义:定义Pod或容器的安全设置,如用户ID、权限、SELinux标签等。
- 示例:
apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000 fsGroup: 2000 containers: - name: sec-ctx-demo image: busybox command: [ "sh", "-c", "sleep 1h" ] volumeMounts: - name: sec-ctx-vol mountPath: /data/demo volumes: - name: sec-ctx-vol emptyDir: {}
八、Kubernetes 应用部署与管理
8.1 部署无状态应用
- 使用Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
8.2 部署有状态应用
- 使用StatefulSet:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: "mysql" replicas: 3 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-persistent-storage spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi
8.3 滚动更新与回滚
- 滚动更新:逐步替换旧版本Pod为新版本,不影响服务可用性。
# 更新镜像版本 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 # 查看更新状态 kubectl rollout status deployment/nginx-deployment
- 回滚:当更新出现问题时,回滚到之前的稳定版本。
# 回滚到上一个版本 kubectl rollout undo deployment/nginx-deployment # 回滚到指定版本 kubectl rollout undo deployment/nginx-deployment --to-revision=2
九、Kubernetes 监控与日志
9.1 监控
- Metrics Server:收集集群资源使用情况的轻量级服务。
- Prometheus:开源监控系统,收集和存储时间序列数据。
- Grafana:数据可视化工具,与Prometheus集成展示监控数据。
9.2 日志
- 容器日志:使用
kubectl logs
命令查看容器日志。 - 集中式日志:
- Fluentd:日志收集器,将日志发送到存储系统。
- Elasticsearch:存储和检索日志数据。
- Kibana:可视化和查询日志数据。
十、Kubernetes 高级特性
10.1 自动扩缩容
- Horizontal Pod Autoscaler(HPA):基于CPU、内存或自定义指标自动调整Pod数量。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
10.2 自定义资源定义(CRD)
- 定义:允许用户扩展Kubernetes API,添加自定义资源类型。
- 示例:
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: foos.example.com spec: group: example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: replicas: type: integer scope: Namespaced names: plural: foos singular: foo kind: Foo shortNames: - fo
10.3 服务网格(Service Mesh)
- 定义:专用的基础设施层,用于管理服务间的通信,提供流量控制、可观测性和安全等功能。
- 常见服务网格:
- Istio:Google、IBM和Lyft共同开发的开源服务网格。
- Linkerd:轻量级服务网格。
- Consul:HashiCorp的服务网格解决方案。
十一、Kubernetes 实践指南
11.1 集群安装
- kubeadm:官方推荐的集群安装工具,适合生产环境。
- Minikube:单节点本地集群,适合开发和测试。
- 云提供商服务:AWS EKS、GCP GKE、Azure AKS等。
11.2 最佳实践
- 资源请求与限制:为Pod设置合理的资源请求和限制,避免资源竞争。
- 健康检查:配置存活探针(liveness probe)和就绪探针(readiness probe),确保应用健康运行。
- 配置管理:使用ConfigMap和Secret管理应用配置和敏感信息。
- 安全加固:遵循最小权限原则,限制容器特权,使用网络策略隔离流量。
11.3 故障排查
- 常用命令:
# 查看Pod状态 kubectl get pods # 查看Pod详细信息 kubectl describe pod <pod-name> # 查看容器日志 kubectl logs <pod-name> # 进入容器 kubectl exec -it <pod-name> -- /bin/bash # 查看事件 kubectl get events
十二、Kubernetes 生态系统
12.1 CI/CD 工具
- Jenkins:开源CI/CD工具,支持Kubernetes插件。
- GitLab CI/CD:集成GitLab的CI/CD平台,支持Kubernetes部署。
- Argo CD:声明式GitOps持续交付工具,专为Kubernetes设计。
12.2 配置管理工具
- Helm:Kubernetes包管理器,简化复杂应用的部署和管理。
- Kustomize:原生Kubernetes配置管理工具,支持配置定制。
12.3 安全工具
- Trivy:容器镜像漏洞扫描工具。
- Kyverno:Kubernetes策略引擎,实施安全和配置策略。
- OPA(Open Policy Agent):通用策略引擎,可用于Kubernetes授权。
十三、Kubernetes 发展趋势
13.1 无服务器计算(Serverless)
- Knative:基于Kubernetes的Serverless平台,由Google主导开发。
- OpenFaaS:开源的Serverless框架,可部署在Kubernetes上。
13.2 边缘计算
- KubeEdge:华为开源的Kubernetes边缘计算平台。
- K3s:轻量级Kubernetes发行版,适合资源受限的边缘环境。
13.3 AI/ML 集成
- Kubeflow:用于在Kubernetes上部署和管理机器学习工作流的平台。
- KServe:Kubernetes原生的模型推理平台。
十四、Kubernetes 工作组件详解
14.1 Master 节点组件
14.1.1 kube-apiserver
- 功能:作为Kubernetes集群的API接口,是所有组件通信的中心枢纽。提供RESTful API,处理认证、授权、访问控制、API注册和发现等功能。
- 特点:水平扩展,可部署多个实例提高可用性。
14.1.2 etcd
- 功能:高可用的键值存储系统,保存集群的所有状态数据,如Pod、Service、Node等资源的配置和状态。
- 特点:使用Raft算法保证数据一致性,需备份数据以防丢失。
14.1.3 kube-scheduler
- 功能:负责将Pod调度到合适的Node节点上运行。根据资源可用情况、节点标签、Pod亲和性/反亲和性等因素做出调度决策。
- 调度过程:过滤节点(找出符合Pod资源请求的节点)→ 对剩余节点打分 → 选择得分最高的节点。
14.1.4 kube-controller-manager
- 功能:运行各种控制器,监控集群状态并确保集群状态与期望状态一致。
- 主要控制器:
- Node Controller:监控Node状态,处理节点故障。
- Replication Controller:维护Pod副本数量。
- Deployment Controller:处理Deployment的创建、更新和回滚。
- Service Controller:创建、更新和删除Service。
- Endpoint Controller:维护Service和Pod的关联关系。
14.1.5 cloud-controller-manager
- 功能:与云服务提供商的API交互,管理云资源,如负载均衡器、存储卷等。
- 适用场景:在公有云或私有云环境中使用Kubernetes时。
14.2 Node 节点组件
14.2.1 kubelet
- 功能:作为Node节点上的代理,与API Server通信,管理节点上的Pod和容器生命周期。确保容器按照Pod规范运行。
- 工作内容:
- 接收API Server分配的Pod。
- 下载Pod的配置和Secret。
- 启动和监控容器。
- 向API Server报告Pod状态。
14.2.2 kube-proxy
- 功能:实现Service的网络代理和负载均衡。在每个Node节点上运行,维护网络规则,将流量转发到正确的Pod。
- 实现模式:
- iptables:基于iptables规则实现流量转发,性能较高。
- IPVS:基于IPVS实现负载均衡,支持更多负载均衡算法。
- Userspace:早期模式,性能较低,已不推荐使用。
14.2.3 容器运行时(Container Runtime)
- 功能:负责运行容器的软件。
- 常见容器运行时:
- Docker:最流行的容器运行时。
- containerd:轻量级容器运行时,直接与容器运行时接口(CRI)交互。
- CRI-O:专为Kubernetes设计的容器运行时。
- rkt:CoreOS开发的容器运行时。
14.2.4 网络插件(CNI)
- 功能:实现Kubernetes的网络模型,为Pod分配IP地址,实现Pod间通信。
- 常见网络插件:
- Flannel:简单的覆盖网络,使用VXLAN或UDP封装数据包。
- Calico:基于BGP的网络插件,提供网络策略功能。
- Weave Net:自组织网络,支持加密和多租户。
- Canal:结合了Flannel的网络和Calico的网络策略。
14.3 附加组件
14.3.1 CoreDNS
- 功能:集群内部的DNS服务,为服务提供域名解析。Pod可以通过服务名直接访问其他服务。
- 工作原理:监听DNS请求,将服务名解析为对应的ClusterIP或Endpoint IP。
14.3.2 容器网络接口(CNI)插件
- 功能:实现Kubernetes的网络模型,确保Pod间可以通信。
- 与kubelet的关系:kubelet通过CNI接口调用网络插件为Pod配置网络。
14.3.3 容器存储接口(CSI)插件
- 功能:实现存储卷的挂载和卸载,支持多种存储系统。
- 常见CSI插件:NFS CSI、AWS EBS CSI、Ceph CSI等。
14.3.4 监控和日志组件
- Prometheus:收集和存储时间序列数据,监控集群和应用性能。
- Grafana:可视化监控数据。
- Elasticsearch、Fluentd、Kibana(EFK):集中式日志管理。
14.3.5 入口控制器(Ingress Controller)
- 功能:管理外部对集群内服务的访问,实现HTTP负载均衡。
- 常见Ingress Controller:
- Nginx Ingress Controller:基于Nginx的Ingress控制器。
- Traefik:轻量级、支持动态配置的Ingress控制器。
- Istio:服务网格,也提供Ingress功能。
14.4 组件间通信
14.4.1 控制平面内部通信
- 组件间通过API Server通信:所有组件都与API Server交互,不直接互相通信。
- etcd安全通信:使用TLS加密,保证数据传输安全。
14.4.2 控制平面与Node节点通信
- API Server → kubelet:API Server通过HTTPS向kubelet发送指令。
- kubelet → API Server:kubelet通过HTTPS向API Server报告节点和Pod状态。
14.4.3 节点间通信
- Pod间通信:通过CNI插件实现,遵循Kubernetes网络模型。
- Service通信:通过kube-proxy实现负载均衡和流量转发。
14.5 组件部署方式
14.5.1 Master节点组件
- 静态Pod:kube-apiserver、kube-scheduler、kube-controller-manager通常作为静态Pod部署在Master节点上。
- 容器化:通过kubelet管理这些组件的生命周期。
14.5.2 Node节点组件
- DaemonSet:部分组件(如网络插件)以DaemonSet形式部署,确保每个节点都运行一份。
- 直接安装:kubelet、kube-proxy通常直接安装在Node节点上。
14.6 总结
组件 | 所在节点 | 主要功能 |
---|---|---|
kube-apiserver | Master | 集群API接口,所有组件通信的中心 |
etcd | Master | 存储集群状态数据 |
kube-scheduler | Master | 将Pod调度到合适的Node节点 |
kube-controller-manager | Master | 运行各种控制器,维护集群状态 |
cloud-controller-manager | Master | 与云服务提供商API交互,管理云资源 |
kubelet | Node | 管理节点上的Pod和容器生命周期 |
kube-proxy | Node | 实现Service的网络代理和负载均衡 |
容器运行时 | Node | 运行容器 |
CNI网络插件 | Node | 实现Pod间通信 |
CoreDNS | 集群 | 集群内部DNS服务,解析服务名 |
Ingress Controller | 集群 | 管理外部对集群内服务的访问 |
理解这些组件的功能和工作原理是深入掌握Kubernetes的关键,它们共同协作,确保容器化应用在集群中高效、稳定地运行。
十五、总结
Kubernetes是容器编排领域的事实标准,提供了强大的容器集群管理能力。通过掌握Kubernetes的核心概念、架构、网络、存储、安全等知识,能够高效地部署、扩展和管理容器化应用。随着云原生技术的发展,Kubernetes的应用场景将不断扩大,生态系统也将更加完善。