Bootstrap

【云原生】Kubernetes (K8s)

一、背景

这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。

1. 容器技术的兴起

Docker 的流行:2013 年,Docker 发布并迅速流行起来,它提供了一种轻量级、可移植且标准化的方式来打包应用程序及其依赖项。这使得开发人员可以轻松地在不同环境中部署和运行应用。
容器化的优势:容器化技术解决了传统虚拟机的一些问题,如资源占用过多、启动时间长等。容器更加轻量级,启动速度快,且具有更好的资源利用率。

2. 大规模容器管理的需求

复杂性增加:随着越来越多的应用程序被容器化,管理和调度大量容器变得越来越复杂。手动管理这些容器变得不切实际,特别是在大规模生产环境中。
自动化需求:企业需要一种自动化的方式来进行容器的部署、扩展、更新和监控,以确保高可用性和弹性。

3. Google 的经验和技术积累

Borg 系统:Kubernetes 的设计灵感来源于 Google 内部使用的集群管理系统 Borg。Borg 是一个大规模的集群管理系统,用于管理和调度数百万个容器。Google 在多年运营 Borg 的过程中积累了大量的经验和最佳实践。
开源社区的支持:Google 将其在 Borg 上的经验和技术开放给社区,并联合其他公司(如 Red Hat、Microsoft 和 IBM)共同开发了 Kubernetes,使其成为一个开放标准。

4. 云原生理念的推广

微服务架构:随着微服务架构的流行,单体应用被拆分成多个小的服务,每个服务都可以独立部署和扩展。容器技术非常适合这种架构,因为它们可以快速启动和停止,易于水平扩展。

持续交付和 DevOps:容器化和自动化工具促进了持续集成和持续交付(CI/CD)流程的实施,使开发团队能够更快地迭代和发布软件。
云平台的多样化:随着多云和混合云环境的普及,企业需要一种跨云平台的标准来管理和调度容器。Kubernetes 提供了一个统一的接口,可以在不同的云平台上运行。

5. 社区和生态系统的支持

强大的社区支持:Kubernetes 拥有一个活跃且庞大的开发者社区,不断贡献代码、文档和插件,推动项目的发展。

丰富的生态系统:围绕 Kubernetes 形成了一个丰富的生态系统,包括各种工具、插件和服务,如 Helm(包管理器)、Istio(服务网格)、Prometheus(监控系统)等。

总结

Kubernetes 的出现是为了解决大规模容器化应用的管理和调度问题。它借鉴了 Google 多年在 Borg 上的经验,结合了 Docker 等容器技术的优势,并得到了广泛的社区支持。通过提供一个标准化的平台,Kubernetes 使得企业能够在多云和混合云环境中高效地部署、管理和扩展容器化应用。

二、优缺点

这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。

优点

  • 自动化和弹性:
    • 自动扩缩容:Kubernetes 可以根据 CPU 和内存使用情况自动调整应用的副本数量,确保高可用性和资源的有效利用。
    • 自愈能力:如果某个节点或容器出现故障,Kubernetes 会自动重启或重新调度容器,确保应用的持续运行。
  • 声明式配置:
    • 一致性和可预测性:通过 YAML 文件定义应用的状态,Kubernetes 会确保实际状态与期望状态一致,简化了配置管理和版本控制。
  • 服务发现和负载均衡:
    • 内置服务发现:Kubernetes 提供了服务发现机制,使得容器之间可以轻松通信。
    • 负载均衡:自动将流量分发到多个容器实例,提高系统的可靠性和性能。
  • 滚动更新和回滚:
    • 零停机更新:支持滚动更新策略,逐步替换旧版本的应用,确保用户在更新过程中不受影响。
    • 快速回滚:如果新版本出现问题,可以快速回滚到旧版本,减少故障时间。
  • 存储编排:
    • 持久化存储:支持多种存储解决方案,如本地存储、网络存储和云存储,确保数据的安全性和一致性。
  • 自我修复:
    • 健康检查:通过存活探针和就绪探针监控容器的健康状况,及时发现问题并采取措施。
  • 广泛的社区支持和生态系统:
    • 丰富的工具和插件:围绕 Kubernetes 形成了一个庞大的生态系统,包括各种工具、插件和服务,如 Helm、Istio、Prometheus 等。
    • 活跃的社区:有大量的开发者和贡献者,不断改进和扩展 Kubernetes 的功能。

缺点

  • 复杂性:
    • 学习曲线陡峭:Kubernetes 有很多概念和组件,对于初学者来说可能需要较长时间来掌握。
    • 配置和维护难度:复杂的配置文件和多样的选项可能导致配置错误,增加维护成本。
  • 资源消耗:
    • 额外开销:Kubernetes 本身需要一定的资源来运行其控制平面组件(如 API Server、etcd、Controller Manager 等),这可能会占用一部分集群资源。
    • 性能影响:在大规模集群中,Kubernetes 的性能可能会受到影响,尤其是在高并发场景下。
  • 安全问题:
    • 潜在的安全风险:Kubernetes 的复杂性可能导致配置不当,从而引入安全漏洞。例如,不正确的 RBAC 配置、未加密的通信等。
    • 依赖于底层基础设施:Kubernetes 的安全性也取决于底层基础设施的安全性,如云提供商的安全设置。
  • 运维挑战:
    • 升级和维护:Kubernetes 的频繁更新和升级可能带来运维上的挑战,需要仔细规划和测试。
    • 监控和日志:虽然 Kubernetes 提供了一些基本的监控和日志功能,但要实现全面的监控和日志管理通常需要额外的工具和配置。
  • 供应商锁定:
    • 跨云迁移困难:虽然 Kubernetes 是一个标准化的平台,但在不同云提供商之间迁移时仍可能遇到兼容性和配置差异的问题。

总结
Kubernetes 是一个强大且灵活的容器编排平台,适用于大规模和复杂的容器化应用环境。它的自动化、弹性和丰富的生态系统使其成为许多企业的首选。然而,它的复杂性和资源消耗也需要企业进行权衡,并投入相应的资源和培训来有效利用这一技术。如果你正在考虑采用 Kubernetes,建议先评估你的具体需求和团队的技术水平,以确定是否适合使用 Kubernetes。

三、适用场景

这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。

四、核心组成

技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。

Kubernetes 的核心组成部分包括控制平面组件(如 API Server、etcd、Scheduler 和 Controller Manager)和节点组件(如 Kubelet 和 Kube Proxy),以及一些附加组件(如 DNS 服务器、网络插件、仪表板等)。这些组件共同协作,确保集群的高效运行、高可用性和弹性。

# 集群信息
kubectl cluster-info
kubectl version

# 资源管理
kubectl get all
kubectl get pods
kubectl get services
kubectl get deployments
kubectl describe pod <pod-name>
kubectl describe service <service-name>
kubectl describe deployment <deployment-name>
kubectl apply -f <filename>.yaml
kubectl delete -f <filename>.yaml
kubectl delete pod <pod-name>
kubectl delete service <service-name>
kubectl delete deployment <deployment-name>
kubectl edit pod <pod-name>
kubectl edit service <service-name>
kubectl edit deployment <deployment-name>

# 命名空间
kubectl get namespaces
kubectl config set-context --current --namespace=<namespace-name>
kubectl get pods -n <namespace-name>

# Pod 操作
kubectl logs <pod-name>
kubectl logs -f <pod-name>  # 实时跟踪日志
kubectl exec -it <pod-name> -- /bin/sh
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec <pod-name> -- printenv

# 部署和更新
kubectl rollout restart deployment/<deployment-name>
kubectl rollout status deployment/<deployment-name>
kubectl rollout undo deployment/<deployment-name>

# 服务和网络
kubectl expose deployment <deployment-name> --type=NodePort --port=80
kubectl get svc <service-name>

# 配置文件
kubectl create deployment <deployment-name> --image=<image-name> --dry-run=client -o yaml > deployment.yaml
kubectl apply -f <filename>.yaml --dry-run=client

# 节点操作
kubectl get nodes
kubectl describe node <node-name>
kubectl cordon <node-name>
kubectl uncordon <node-name>
kubectl drain <node-name>

# 其他常用命令
kubectl config current-context
kubectl config use-context <context-name>
kubectl config get-contexts

五、底层原理

技术的底层原理和关键实现。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。

六、对比

已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。

参考

https://kubernetes.io/zh-cn/docs/home/

;