**
K8s学习笔记
**
一、Kubernetes简介
Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。它由Google设计并捐赠给了Cloud Native Computing Foundation(CNCF)来维护。以下是Kubernetes的核心功能和优势:
- 高可用性:确保应用程序始终运行。
- 自动化部署和回滚:简化应用程序的更新过程。
- 服务发现和负载均衡:自动发现新创建的服务,并将流量分配到正确的目的地。
- 自我修复:重新启动失败的容器,替换不响应健康检查的容器。
- 密钥与配置管理:存储和管理敏感信息,如密码、OAuth令牌和ssh密钥。
二、核心概念详解
- Pod
- 最小的工作单元,可以包含一个或多个容器。
- Pod内的容器共享网络命名空间、IP地址和端口空间。
- Pod生命周期短暂,当Pod中的容器停止时,Pod也会停止。
- Node
- 集群中的工作机器,可以是物理机或虚拟机。
- 每个Node都运行着以下组件:
- Kubelet:负责管理Pod的生命周期。
- Kube-Proxy:负责实现Pod的网络通信。
- 容器运行时(如Docker或rkt)。
- Deployment
- 用于管理无状态应用程序的Pod。
- 定义了Pod的副本数、更新策略等。
- 支持滚动更新和回滚。
- Service
- 将运行在一组Pods上的应用程序公开为网络服务。
- 通过标签选择器将请求路由到正确的Pod。
- 支持类型包括ClusterIP、NodePort、LoadBalancer等。
- Namespace
- 资源隔离机制,不同Namespace中的资源不会相互影响。
- 默认情况下,K8s集群中的资源属于default命名空间。
- Volume
- Pod的存储卷,可以挂载到容器内部。
- 支持多种类型,如emptyDir、hostPath、PersistentVolume等。
- ConfigMap和Secret
- ConfigMap用于存储非敏感的配置数据。
- Secret用于存储敏感数据,如密码、令牌等。
三、操作实践详解
- 部署K8s集群
- 使用kubeadm工具进行集群初始化。
- 配置网络插件,如Calico、Flannel等。
- 验证集群状态:kubectl get cs。
- 创建Pod
- 编写Pod的YAML文件,包含apiVersion、kind、metadata、spec等字段。
- 使用kubectl create -f <pod.yaml>命令创建Pod。
- 管理Pod
- 查看Pod列表:kubectl get pods。
- 查看Pod详细信息:kubectl describe pod 。
- 进入Pod容器执行命令:kubectl exec -it – 。
- 部署Deployment
- 编写Deployment的YAML文件,定义replicas、selector、template等。
- 使用kubectl create -f <deployment.yaml>命令创建Deployment。
- 管理Deployment
- 查看Deployment列表:kubectl get deployments。
- 更新Deployment:kubectl set image deployment/ =。
- 滚动更新Deployment:kubectl rollout restart deployment/。
- 回滚Deployment:kubectl rollout undo deployment/。
- 创建Service
- 编写Service的YAML文件,定义type、selector、ports等。
- 使用kubectl create -f <service.yaml>命令创建Service。
- 管理Service
- 查看Service列表:kubectl get svc。
- 删除Service:kubectl delete svc 。
四、进阶学习详解
- Ingress
- 用于暴露服务到集群外部。
- 通常与Ingress控制器(如Nginx、Traefik)一起使用。
- 支持基于域名的路由、TLS加密等。
- Helm
- K8s的包管理工具,用于简化应用程序的打包、配置和管理。
- 使用Chart来描述K8s资源的集合。
- 常用命令包括helm install、helm upgrade、helm rollback等。
- StatefulSet
- 用于管理有状态的应用,如数据库。
- 支持稳定的持久化存储和网络标识。
- Pod拥有稳定的名称和主机名。
- PersistentVolume(PV)和PersistentVolumeClaim(PVC)
- PV是集群中的一块存储,可以是NFS、iSCSI等。
- PVC是对存储的请求,类似于Pod对计算资源的请求。
-
- Custom Resource Definition(CRD)
- CRD允许用户在Kubernetes中定义自己的资源类型。
- 通过扩展API服务器,可以像内置资源一样操作自定义资源。
- CRD常用于实现特定应用程序的定制化管理,与Operator模式结合使用效果最佳。
五、Kubernetes组件深入
- Control Plane Components(控制平面组件)
- kube-apiserver:集群的统一入口,处理REST操作和API请求。
- etcd:一个高可用的键值存储系统,用于存储Kubernetes集群的所有数据。
- kube-scheduler:负责分配Pod到合适的Node上。
- kube-controller-manager:运行控制器进程,如Node Controller、Replication Controller等。
- cloud-controller-manager:与云服务提供商的API交互,管理云资源。
- Node Components(节点组件)
- kubelet:在Node上运行的主要组件,确保Pod的运行状态与期望一致。
- kube-proxy:维护网络规则,实现服务抽象。
- 容器运行时:负责运行容器的软件,如Docker、containerd等。
六、网络与存储深入
- 网络模型
- Kubernetes采用扁平的网络模型,所有Pod都在同一个网络平面。
- CNI(Container Network Interface)是Kubernetes网络插件的标准接口。
- 网络策略(Network Policies)用于控制Pod之间的通信。
- 存储机制
- Kubernetes支持多种存储卷类型,如emptyDir、hostPath、PersistentVolume等。
- PersistentVolume和PersistentVolumeClaim机制实现了存储资源的抽象和管理。
- StorageClass定义了创建PV时所需的信息,如存储类型、回收策略等。
七、集群管理与实践
- 集群监控
- 使用Prometheus和Grafana进行集群监控和可视化。
- Kubernetes内置了cAdvisor,用于收集、处理和导出运行中的容器的信息。
- 日志收集
- 使用ELK栈(Elasticsearch, Logstash, Kibana)或Fluentd进行日志收集和分析。
- Kubernetes提供了日志机制,如kubectl logs用于查看容器的日志。
- 集群安全
- Kubernetes提供了多种安全机制,如RBAC(Role-Based Access Control)、Pod Security Policies等。
- 应确保API服务器的安全,使用TLS加密通信,限制访问控制。
- 集群备份与恢复
- 定期备份etcd数据,确保集群状态可恢复。
- 使用kubeadm和Velero等工具进行集群备份和恢复。
八、最佳实践与技巧
- 应用程序部署
- 使用Deployment进行无状态服务的部署。
- 对于有状态服务,使用StatefulSet并配置适当的存储和网络策略。
- 资源管理
- 合理设置资源请求(request)和限制(limit),确保应用程序的稳定运行。
- 使用资源配额(ResourceQuotas)和LimitRange来管理Namespace中的资源使用。
- 自动化与流程
- 使用CI/CD工具(如Jenkins、GitLab CI/CD)自动化构建、测试和部署流程。
- 实践Infrastructure as Code(IaC)理念,使用Kubernetes资源清单进行版本控制。
常见问题
在使用Kubernetes时,可能会遇到各种问题。以下是一些常见的Kubernetes问题及其可能的原因和解决方案:
- Pods无法启动
- 原因:可能是因为镜像拉取失败、配置错误、资源不足、健康检查失败等。
- 解决方案:检查Pod状态和事件(
kubectl describe pod <pod-name>
),确保镜像名称和标签正确,资源请求和限制合理,以及健康检查配置得当。
- 服务无法访问
- 原因:可能是因为Service没有正确配置选择器,或者没有Pod匹配到Service的选择器,网络策略阻止了访问等。
- 解决方案:检查Service配置(
kubectl get svc -o yaml <service-name>
),确保选择器与Pod标签匹配,检查网络策略设置。
- 资源不足
- 原因:集群资源(CPU、内存、存储)耗尽。
- 解决方案:添加更多节点到集群,或者清理不再需要的Pod和资源,设置资源配额(ResourceQuotas)和LimitRange来管理资源使用。
- 节点状态异常
- 原因:节点可能因为硬件故障、网络问题、Kubelet服务故障等原因变为不健康状态。
- 解决方案:检查节点状态(
kubectl get nodes
),使用kubectl describe node <node-name>
查看节点事件和状态,进行必要的硬件或软件修复。
- 滚动更新失败
- 原因:更新策略配置不当,新版本的应用程序启动失败,或者健康检查没有正确设置。
- 解决方案:检查Deployment的更新策略和配置,确保新版本的应用程序能够正常启动并通过健康检查。
- 配置错误
- 原因:YAML文件配置错误,如拼写错误、格式错误、不兼容的API版本等。
- 解决方案:仔细检查YAML文件,使用
kubectl apply --validate
来验证配置文件。
- 存储问题
- 原因:PersistentVolume(PV)和PersistentVolumeClaim(PVC)不匹配,存储类(StorageClass)配置错误,或者存储系统本身出现问题。
- 解决方案:检查PV和PVC的状态,确保它们正确绑定,检查存储类配置和存储系统日志。
- 网络问题
- 原因:CNI插件配置错误,网络策略配置不当,或者底层网络基础设施问题。
- 解决方案:检查CNI配置,确保网络策略允许必要的流量,诊断和修复底层网络问题。
- 权限和认证问题
- 原因:RBAC配置错误,服务账户权限不足,或者API服务器认证配置问题。
- 解决方案:检查RBAC角色和角色绑定,确保服务账户有适当的权限,验证API服务器的认证配置。
- 集群升级问题
- 原因:升级过程中遇到兼容性问题,或者升级步骤执行不正确。
- 解决方案:遵循官方升级指南,确保在升级前进行充分的备份,并在升级过程中监控集群状态。