Kubernetes笔记
应用部署方式演变
传统部署—>虚拟化部署—>容器化部署
传统部署
传统部署方式是将应用程序直接安装在物理服务器上。每个应用程序都需要独立的硬件资源和操作系统环境。
- 优点:部署简单,无需额外技术和工具支持。
- 缺点:资源利用率低,隔离性差,部署和扩展困难。
虚拟化部署
为了解决传统部署方式的问题,虚拟化技术被引入。虚拟化通过软件层面的抽象,将一个物理服务器划分为多个虚拟机(VM)。每个虚拟机(VM)是一台完整的计算机,可以运行一个或多个应用程序,包括其自己的操作系统。
- 优点:提高硬件资源利用率,改善应用之间的隔离性,实现虚拟机迁移。
- 缺点:引入额外开销,启动时间较长,资源隔离并不完全。
容器化部署
容器化部署简介
容器化部署是近年来的新兴趋势。容器化使用容器技术(如Docker)将应用程序及其所有依赖项打包为一个独立的容器。每个容器都运行在共享的操作系统内核上,相比于虚拟化,容器化更加轻量级和快速启动。
- 优点:轻量且快速启动,资源利用率高,良好的隔离性,快速扩展和自动化管理。
- 缺点:容器间共享操作系统可能带来安全和稳定性问题,依赖额外的容器编排工具。
容器化部署存在的问题
当使用容器化部署时,存在一些问题和挑战。
- 安全性问题:容器共享操作系统内核,如果一个容器受到攻击或存在漏洞,可能会对其他容器和主机造成威胁。需要采取适当的安全策略和措施来保护容器环境的安全性。
- 稳定性问题:容器化部署中,容器之间共享操作系统资源,一个容器的异常行为可能会影响其他容器的稳定性。需要进行适当的资源隔离和限制,以确保容器之间的稳定运行。
- 管理和调度问题:在大规模容器部署中,需要管理和调度大量的容器实例。手动管理和调度是复杂且耗时的工作,因此需要依赖容器编排工具来自动化管理和调度容器,提高效率和可靠性。
- 网络和存储管理:容器化部署涉及到容器之间的网络通信和存储管理。需要确保容器之间可以相互通信,并能够访问所需的存储资源。这需要合理规划和配置网络和存储方案。
容器化部署问题解决方案
为了解决这些问题,可以选择适合的容器编排工具,如Kubernetes、Docker Swarm等,利用其自动化的部署、扩展和管理能力,简化容器的管理和调度过程。常见的容器编排工具如下:
- Kubernetes(K8S):Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了强大的容器编排能力,包括自动化部署、负载均衡、故障恢复、水平扩展等功能。
- Docker Swarm:Docker Swarm 是 Docker 官方提供的容器编排工具,用于在多个 Docker 主机上进行容器集群的管理。它可以将多个 Docker 主机组织成一个集群,并提供负载均衡、服务发现和故障恢复等功能。
- Apache Mesos:Apache Mesos 是一个开源的集群管理系统,可以管理多个物理或虚拟机上的资源,包括 CPU、内存、存储等。它支持容器化应用程序的调度和管理,并提供高可用性、弹性扩展和故障恢复等特性。
- HashiCorp Nomad:Nomad 是 HashiCorp 公司开发的一个轻量级的容器编排和调度工具。它支持多种任务类型,包括容器、虚拟机和原生二进制文件等,可以在多个主机上进行任务的调度和管理。
Kubernetes概括
Kubernetes简介
Kubernetes(常简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。官方文档https://kubernetes.io/zh/docs/home
- 2014年:Google推出Kubernetes项目并开源。
- 2015年:Kubernetes成为CNCF的首个托管项目。
- 2016年:Kubernetes快速发展,获得广泛采用。
- 2017年:Kubernetes成为容器编排和管理的事实标准。
- 2018年:Kubernetes 1.10发布,引入新功能和改进。
- 2019年:Kubernetes继续发展,成为云原生应用的标准。
- 2020年:Kubernetes 1.18发布,增强性能和功能。
Kubernetes核心功能
- 自动化容器部署和弹性伸缩:Kubernetes可以自动部署和调度容器,根据应用程序的需求进行弹性伸缩,确保应用程序始终具备所需的计算资源。
- 服务发现和负载均衡:Kubernetes提供了内建的服务发现机制,使得容器之间可以通过服务名称进行通信。同时,它还支持负载均衡,可以将流量均匀分配给后端的容器实例。
- 自动容器恢复和故障处理:Kubernetes可以监控容器的健康状态,并在出现故障时自动重启容器或替换不健康的容器实例,以确保应用程序的高可用性。
- 存储编排:Kubernetes提供了存储卷(Volume)的抽象,可以将持久化存储卷挂载到容器中,使得应用程序可以持久化地存储和访问数据。
- 自动发布和回滚:Kubernetes支持应用程序的自动发布和回滚,可以通过定义不同版本的部署策略来实现无缝的应用程序更新。
- 配置和密钥管理:Kubernetes提供了集中化的配置和密钥管理机制,可以将敏感信息(如密码、API密钥等)存储在安全的方式,并在应用程序中使用。
- 多租户支持:Kubernetes支持多租户模式,可以将集群资源进行划分和隔离,从而实现不同用户或团队之间的资源共享和隔离。
kubernetes组件
在Kubernetes集群(Kubernetes Cluster)中,有两种类型的节点:控制节点(Master)和工作节点(Node)。它们在集群中扮演不同的角色和职责。此外还有一些可选的组件可以部署在集群中,以增强其功能和扩展性。
- 控制节点(Master):集群的控制平面,负责集群的决策(管理集群)
- 工作节点(Node):负责为容器提供运行环境并部署应用程序(部署应用)
- 其他节点:增强其功能和扩展性(功能扩展)
控制节点(Master)
是Kubernetes集群的控制平面,负责管理和控制整个集群的运行状态。它包含以下核心组件:
- kube-apiserver:提供集群的API接口,处理来自用户和其他组件的请求,并将其转化为内部操作。
- etcd:分布式键值存储系统,用于存储集群的配置信息、元数据和状态。
- kube-scheduler:负责根据Pod的资源需求和调度策略,将Pod分配到合适的工作节点上运行。
- kube-controller-manager:包含多个控制器,负责监控集群状态和执行自动化操作。例如,Replication Controller控制器用于管理Pod副本的数量,Namespace控制器用于创建和管理命名空间等。
- cloud-controller-manager(可选):用于与云服务提供商集成,管理与云相关的资源,如负载均衡器、云硬盘等。
工作节点(Node)
是Kubernetes集群的数据平面,负责运行容器化应用程序。每个工作节点上都会安装以下组件:
- kubelet:与控制节点的kube-apiserver通信,管理节点上的容器和Pod。它负责启动、停止、监控容器,并报告其状态给kube-apiserver。
- kube-proxy:负责为Pod提供网络代理和负载均衡功能,使得Pod可以通过Service对象进行访问。
- Container Runtime:负责管理容器的生命周期,如Docker、containerd等。
可选组件
除了上述核心组件外,Kubernetes还包括一些可选组件,可以部署在集群中,以增强其功能和扩展性。
- DNS插件:提供集群内部的DNS服务,使得Pod可以通过域名进行通信。
- Ingress Controller:用于将外部流量路由到集群内部的服务。
- Metrics Server:收集和暴露集群资源使用情况的指标数据,以便进行监控和自动化调整。
kubernetes集群
部署K8S集群的常见方式
- 使用Kubeadm:Kubeadm是官方提供的一种快速搭建Kubernetes集群的工具。它可以在几个节点上快速搭建一个基本的Kubernetes集群,并支持自定义配置,适合用于实验、测试和开发环境。
- 使用二进制包:需要手动下载和安装Kubernetes的二进制文件,并在每个节点上进行配置和启动。虽然手动部署麻烦点,但是期间可以学习很多工作原理,也利于后期维护。
- 使用第三方工具:例如kops、RKE、Kubespray等,这些工具可以帮助简化Kubernetes集群的部署过程,提供了更高级的功能和可视化界面,使得部署过程更加简化和可靠。
- 云服务提供商: AWS、Azure、Google Cloud等云服务提供商都提供了快速搭建Kubernetes集群的解决方案,用户可以直接在云平台上选择相应的服务来部署和管理Kubernetes集群。这种方式适合于云原生应用的开发和部署。
使用Kubeadm部署K8S集群
准备工作
环境准备:至少3台运行Linux操作系统的服务器节点,可以是物理机或虚拟机,确保所有节点之间可以互相通信,并且网络稳定。
安装Docker







