K8s学习笔记

**

K8s学习笔记

**

一、Kubernetes简介
Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。它由Google设计并捐赠给了Cloud Native Computing Foundation(CNCF)来维护。以下是Kubernetes的核心功能和优势:

  • 高可用性:确保应用程序始终运行。
  • 自动化部署和回滚:简化应用程序的更新过程。
  • 服务发现和负载均衡:自动发现新创建的服务,并将流量分配到正确的目的地。
  • 自我修复:重新启动失败的容器,替换不响应健康检查的容器。
  • 密钥与配置管理:存储和管理敏感信息,如密码、OAuth令牌和ssh密钥。

二、核心概念详解

  1. Pod
    • 最小的工作单元,可以包含一个或多个容器。
    • Pod内的容器共享网络命名空间、IP地址和端口空间。
    • Pod生命周期短暂,当Pod中的容器停止时,Pod也会停止。
  2. Node
    • 集群中的工作机器,可以是物理机或虚拟机。
    • 每个Node都运行着以下组件:
      • Kubelet:负责管理Pod的生命周期。
      • Kube-Proxy:负责实现Pod的网络通信。
      • 容器运行时(如Docker或rkt)。
  3. Deployment
    • 用于管理无状态应用程序的Pod。
    • 定义了Pod的副本数、更新策略等。
    • 支持滚动更新和回滚。
  4. Service
    • 将运行在一组Pods上的应用程序公开为网络服务。
    • 通过标签选择器将请求路由到正确的Pod。
    • 支持类型包括ClusterIP、NodePort、LoadBalancer等。
  5. Namespace
    • 资源隔离机制,不同Namespace中的资源不会相互影响。
    • 默认情况下,K8s集群中的资源属于default命名空间。
  6. Volume
    • Pod的存储卷,可以挂载到容器内部。
    • 支持多种类型,如emptyDir、hostPath、PersistentVolume等。
  7. ConfigMap和Secret
    • ConfigMap用于存储非敏感的配置数据。
    • Secret用于存储敏感数据,如密码、令牌等。

三、操作实践详解

  1. 部署K8s集群
    • 使用kubeadm工具进行集群初始化。
    • 配置网络插件,如Calico、Flannel等。
    • 验证集群状态:kubectl get cs。
  2. 创建Pod
    • 编写Pod的YAML文件,包含apiVersion、kind、metadata、spec等字段。
    • 使用kubectl create -f <pod.yaml>命令创建Pod。
  3. 管理Pod
    • 查看Pod列表:kubectl get pods。
    • 查看Pod详细信息:kubectl describe pod 。
    • 进入Pod容器执行命令:kubectl exec -it – 。
  4. 部署Deployment
    • 编写Deployment的YAML文件,定义replicas、selector、template等。
    • 使用kubectl create -f <deployment.yaml>命令创建Deployment。
  5. 管理Deployment
    • 查看Deployment列表:kubectl get deployments。
    • 更新Deployment:kubectl set image deployment/ =。
    • 滚动更新Deployment:kubectl rollout restart deployment/。
    • 回滚Deployment:kubectl rollout undo deployment/。
  6. 创建Service
    • 编写Service的YAML文件,定义type、selector、ports等。
    • 使用kubectl create -f <service.yaml>命令创建Service。
  7. 管理Service
    • 查看Service列表:kubectl get svc。
    • 删除Service:kubectl delete svc 。

四、进阶学习详解

  1. Ingress
    • 用于暴露服务到集群外部。
    • 通常与Ingress控制器(如Nginx、Traefik)一起使用。
    • 支持基于域名的路由、TLS加密等。
  2. Helm
    • K8s的包管理工具,用于简化应用程序的打包、配置和管理。
    • 使用Chart来描述K8s资源的集合。
    • 常用命令包括helm install、helm upgrade、helm rollback等。
  3. StatefulSet
    • 用于管理有状态的应用,如数据库。
    • 支持稳定的持久化存储和网络标识。
    • Pod拥有稳定的名称和主机名。
  4. PersistentVolume(PV)和PersistentVolumeClaim(PVC)
    • PV是集群中的一块存储,可以是NFS、iSCSI等。
    • PVC是对存储的请求,类似于Pod对计算资源的请求。
    1. Custom Resource Definition(CRD)
    • CRD允许用户在Kubernetes中定义自己的资源类型。
    • 通过扩展API服务器,可以像内置资源一样操作自定义资源。
    • CRD常用于实现特定应用程序的定制化管理,与Operator模式结合使用效果最佳。

五、Kubernetes组件深入

  1. Control Plane Components(控制平面组件)
    • kube-apiserver:集群的统一入口,处理REST操作和API请求。
    • etcd:一个高可用的键值存储系统,用于存储Kubernetes集群的所有数据。
    • kube-scheduler:负责分配Pod到合适的Node上。
    • kube-controller-manager:运行控制器进程,如Node Controller、Replication Controller等。
    • cloud-controller-manager:与云服务提供商的API交互,管理云资源。
  2. Node Components(节点组件)
    • kubelet:在Node上运行的主要组件,确保Pod的运行状态与期望一致。
    • kube-proxy:维护网络规则,实现服务抽象。
    • 容器运行时:负责运行容器的软件,如Docker、containerd等。

六、网络与存储深入

  1. 网络模型
    • Kubernetes采用扁平的网络模型,所有Pod都在同一个网络平面。
    • CNI(Container Network Interface)是Kubernetes网络插件的标准接口。
    • 网络策略(Network Policies)用于控制Pod之间的通信。
  2. 存储机制
    • Kubernetes支持多种存储卷类型,如emptyDir、hostPath、PersistentVolume等。
    • PersistentVolume和PersistentVolumeClaim机制实现了存储资源的抽象和管理。
    • StorageClass定义了创建PV时所需的信息,如存储类型、回收策略等。
      七、集群管理与实践
  3. 集群监控
    • 使用Prometheus和Grafana进行集群监控和可视化。
    • Kubernetes内置了cAdvisor,用于收集、处理和导出运行中的容器的信息。
  4. 日志收集
    • 使用ELK栈(Elasticsearch, Logstash, Kibana)或Fluentd进行日志收集和分析。
    • Kubernetes提供了日志机制,如kubectl logs用于查看容器的日志。
  5. 集群安全
    • Kubernetes提供了多种安全机制,如RBAC(Role-Based Access Control)、Pod Security Policies等。
    • 应确保API服务器的安全,使用TLS加密通信,限制访问控制。
  6. 集群备份与恢复
    • 定期备份etcd数据,确保集群状态可恢复。
    • 使用kubeadm和Velero等工具进行集群备份和恢复。

八、最佳实践与技巧

  1. 应用程序部署
    • 使用Deployment进行无状态服务的部署。
    • 对于有状态服务,使用StatefulSet并配置适当的存储和网络策略。
  2. 资源管理
    • 合理设置资源请求(request)和限制(limit),确保应用程序的稳定运行。
    • 使用资源配额(ResourceQuotas)和LimitRange来管理Namespace中的资源使用。
  3. 自动化与流程
    • 使用CI/CD工具(如Jenkins、GitLab CI/CD)自动化构建、测试和部署流程。
    • 实践Infrastructure as Code(IaC)理念,使用Kubernetes资源清单进行版本控制。

常见问题

在使用Kubernetes时,可能会遇到各种问题。以下是一些常见的Kubernetes问题及其可能的原因和解决方案:

  1. Pods无法启动
    • 原因:可能是因为镜像拉取失败、配置错误、资源不足、健康检查失败等。
    • 解决方案:检查Pod状态和事件(kubectl describe pod <pod-name>),确保镜像名称和标签正确,资源请求和限制合理,以及健康检查配置得当。
  2. 服务无法访问
    • 原因:可能是因为Service没有正确配置选择器,或者没有Pod匹配到Service的选择器,网络策略阻止了访问等。
    • 解决方案:检查Service配置(kubectl get svc -o yaml <service-name>),确保选择器与Pod标签匹配,检查网络策略设置。
  3. 资源不足
    • 原因:集群资源(CPU、内存、存储)耗尽。
    • 解决方案:添加更多节点到集群,或者清理不再需要的Pod和资源,设置资源配额(ResourceQuotas)和LimitRange来管理资源使用。
  4. 节点状态异常
    • 原因:节点可能因为硬件故障、网络问题、Kubelet服务故障等原因变为不健康状态。
    • 解决方案:检查节点状态(kubectl get nodes),使用kubectl describe node <node-name>查看节点事件和状态,进行必要的硬件或软件修复。
  5. 滚动更新失败
    • 原因:更新策略配置不当,新版本的应用程序启动失败,或者健康检查没有正确设置。
    • 解决方案:检查Deployment的更新策略和配置,确保新版本的应用程序能够正常启动并通过健康检查。
  6. 配置错误
    • 原因:YAML文件配置错误,如拼写错误、格式错误、不兼容的API版本等。
    • 解决方案:仔细检查YAML文件,使用kubectl apply --validate来验证配置文件。
  7. 存储问题
    • 原因:PersistentVolume(PV)和PersistentVolumeClaim(PVC)不匹配,存储类(StorageClass)配置错误,或者存储系统本身出现问题。
    • 解决方案:检查PV和PVC的状态,确保它们正确绑定,检查存储类配置和存储系统日志。
  8. 网络问题
    • 原因:CNI插件配置错误,网络策略配置不当,或者底层网络基础设施问题。
    • 解决方案:检查CNI配置,确保网络策略允许必要的流量,诊断和修复底层网络问题。
  9. 权限和认证问题
    • 原因:RBAC配置错误,服务账户权限不足,或者API服务器认证配置问题。
    • 解决方案:检查RBAC角色和角色绑定,确保服务账户有适当的权限,验证API服务器的认证配置。
  10. 集群升级问题
    • 原因:升级过程中遇到兼容性问题,或者升级步骤执行不正确。
    • 解决方案:遵循官方升级指南,确保在升级前进行充分的备份,并在升级过程中监控集群状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值