一、云系统
云系统是一种基于云计算的服务体系架构,它通过分布式计算、虚拟化技术、网络存储等先进技术,将大量的物理或虚拟资源整合成一个庞大的资源池。用户可以通过网络访问这些资源,实现数据的存储、处理、分析和共享等功能。
1.1 云系统的核心特点
- 高可扩展性:云系统能够根据用户的需求动态地分配或释放资源,满足用户在不同时间、不同规模的需求。这种灵活的资源分配方式,使得企业或个人可以根据业务发展的实际情况,随时调整资源使用规模,避免资源浪费。
- 灵活性:用户可以根据自己的需要选择使用不同类型的服务,如基础设施服务(IaaS)、平台服务(PaaS)或软件服务(SaaS)等。这种服务模式为用户提供了极大的灵活性,使得用户可以根据自身业务特点,选择最适合自己的服务类型。
- 安全性:云系统提供多重安全保障,包括数据加密、访问控制、安全审计等,确保用户数据的安全和隐私。云服务商通常会采用先进的安全技术和措施,来保护用户数据免受攻击和泄露的风险。
1.2 云系统的构成部分
- 云计算平台:负责管理和调度物理或虚拟资源,为用户提供计算、存储和网络服务。
- 虚拟化技术:通过虚拟化技术,将物理硬件资源抽象成逻辑资源,提高资源的利用率和灵活性。
- 数据存储技术:采用分布式存储技术,确保数据的安全性和可靠性。
- 云服务:提供各种类型的云服务,如SaaS、PaaS和IaaS等,满足用户不同的业务需求。
1.3 云系统分类
1.3.1 服务方式类
- Iaas:IaaS提供了云计算的最底层,负责提供硬件和基础设施支持,如服务器、存储设备和网络设备等。用户可以通过网络来访问这些基础设施资源,从而实现对数据的存储、备份和容灾等功能。
- Paas:PaaS在IaaS的基础上进一步增加了软件开发工具和应用程序运行环境等软件资源。
- Saas:SaaS是云计算的一种常见形式,它通过浏览器或其他客户端将应用程序或服务提供给用户使用。
1.3.2 部署方式分类
-
公有云:
- 定义:公有云是指由云服务提供商将应用程序、存储和其他资源作为服务提供给一般用户,用户通过互联网来使用这些服务,并不拥有实际的云计算资源。
- 特点:公有云强调弹性和共享,用户可以根据需求按需调配资源,包括SaaS应用程序、单个虚拟机(VM)、裸机计算硬件、完整的企业级基础架构和开发平台等。这些资源可以通过订阅或按使用付费的方式获取。
- 优点:弹性伸缩、高可用性、低成本和易于使用。
- 缺点:可能存在数据安全问题和服务质量的不稳定性。
-
私有云:
- 定义:私有云是指允许企业或组织拥有并管理自己的计算资源和服务,这些资源和服务专为企业内部用户提供服务。
- 特点:私有云可以是基于虚拟化技术部署在企业内部的数据中心,也可以是由第三方托管的专为企业内部用户提供的云环境。它强调安全性和可定制性,资源和服务仅供企业内部用户访问和使用。
- 优点:数据安全性高、服务质量稳定、可自定义性强。
- 缺点:成本较高,需要投入大量的资金和人力资源。
-
混合云:
- 定义:混合云是指将公有云和私有云的优势结合在一起,通过技术手段实现两种云之间的数据和应用的无缝迁移和集成。
- 特点:混合云允许企业根据实际需求,将不同的应用程序和工作负载部署到最适合的云环境中,以实现资源的最佳利用和成本的最优化。
- 优点:灵活性高、可扩展性强、安全性好。
- 缺点:可能存在数据迁移和管理问题,需要一定的技术实力和专业知识。
云系统按部署方式分类主要包括公有云、私有云和混合云三种。每种部署方式都有其独特的优点和缺点,企业可以根据自身的实际需求选择合适的部署方式。
1.3.3 云系统分类
-
Unix系统:
Unix是最早出现的操作系统之一,以其稳定性和安全性著称。它支持多用户、多任务操作,并且具有强大的网络功能。Unix系统广泛应用于大型服务器和高性能计算机领域,特别是在需要高安全性和稳定性的应用场景中。
-
Linux系统:
Linux是一种免费开源的类Unix操作系统,具有高度的稳定性、安全性、可扩展性、灵活性和定制性。Linux广泛应用于Web服务器、数据库服务器、云计算等领域。它继承了Unix以网络为中心的设计思想,是一个性能稳定的多用户网络操作系统。Linux的开源特性使得它拥有庞大的社区支持和丰富的软件资源。
-
Windows Server系统:
Windows Server是微软推出的服务器操作系统,适用于需要运行Microsoft技术栈(如.NET Framework、SQL Server等)的应用场景。Windows Server提供了丰富的管理工具和界面,使得系统管理和维护变得相对简单。同时,它也支持虚拟化技术,可以方便地部署和管理虚拟机。
二、上云的原因
云计算(Cloud Computing)是分布式计算、并行计算、效用计算、网络存储、虚拟化、负载均衡等传统计算机和网络技术发展融合的产物。它基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。
1. 成本效益:
- 降低IT成本:云计算通过按需付费的模式,使得企业可以根据实际需求灵活调整资源使用,避免了传统IT基础设施的高昂建设和维护成本。
- 资源优化:云系统能够自动管理和优化资源,提高资源利用率,减少资源浪费。
2. 灵活性和可扩展性:
- 快速响应市场变化:云系统能够快速部署和扩展,使企业能够迅速响应市场变化,抓住商机。
- 支持业务增长:随着业务的发展,云系统可以无缝地扩展资源,满足企业不断增长的需求。
3. 高可用性和容错性:
- 数据备份与恢复:云系统通常提供自动备份和恢复功能,确保数据的安全性和可靠性。
- 故障转移和冗余:云系统通过多节点部署和故障转移机制,确保服务的连续性和稳定性。
4. 全球可达性和移动性:
- 随时随地访问:云系统支持互联网访问,用户可以在任何时间、任何地点通过任何设备访问云资源。
- 支持远程工作:云系统使得远程工作成为可能,提高了员工的工作效率和灵活性。
5. 创新和竞争力:
- 快速迭代和部署:云系统支持快速开发和部署应用程序,加速了产品迭代和创新。
- 利用先进技术:云系统通常集成了最新的技术和工具,使企业能够利用这些技术来提升竞争力。
6. 安全性和合规性:
- 专业安全服务:云服务提供商通常提供专业的安全服务,包括数据加密、访问控制、安全审计等,确保用户数据的安全。
- 满足合规要求:云系统可以帮助企业满足各种行业法规和合规要求,如GDPR、HIPAA等。
7. 简化IT管理:
- 集中化管理:云系统提供了集中化的管理界面和工具,简化了IT管理的复杂性和工作量。
- 自动化运维:云系统支持自动化运维,减少了人工干预和错误的可能性。
三、云原生
云原生是一种现代化的软件开发和部署方法,旨在充分利用云计算的优势,提高应用程序的可伸缩性、弹性和可靠性。
3.1 定义与要素
- 定义:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
- 要素:云原生可以概括为四个要素:微服务、容器、DevOps和持续交付。这些要素共同构成了云原生的核心技术体系。
3.2 技术栈
- 容器化:容器技术(如Docker)是云原生的基石,它使得应用可以跨平台运行,同时降低了开发和运维的难度和成本。容器具有轻量级、快速启动、易于迁移等优点,能够显著提高应用的部署效率和资源利用率。
- 微服务架构:微服务架构将大型应用拆分为多个小型、独立的服务,每个服务都运行在自己的进程中,并通过轻量级通信机制(如REST API)进行交互。这种架构模式提高了应用的可扩展性、可维护性和可测试性。
- DevOps:DevOps是一种将软件开发和IT运维相结合的实践,旨在缩短软件开发周期,提高软件质量,并通过自动化手段实现持续集成、持续交付和持续监控。DevOps理念在云原生环境中得到了广泛应用,进一步推动了应用的快速迭代和高效运维。
- 自动化:云原生应用强调自动化,包括自动化构建、部署、监控和告警等。通过容器编排工具(如Kubernetes)和自动化测试框架,可以实现应用的自动化部署和扩展,降低人工干预和错误率。
3.3 优势与应用场景
- 优势:云原生应用具有弹性扩展、高可用性、高效运维、快速迭代、降低成本、灵活部署等优势。这些优势使得云原生应用能够更好地应对业务需求的变化和市场挑战。
- 应用场景:云原生技术适用于多种应用场景,包括大规模互联网应用、金融业务、人工智能和大数据应用、物联网应用以及区块链应用等。在这些场景中,云原生技术能够提供高效、可扩展、弹性伸缩的应用程序开发和部署方式,提高应用的可靠性和可维护性。
3.4 挑战与未来趋势
- 挑战:云原生应用也存在一些挑战,如学习曲线和复杂性、需要专业的运维团队、安全风险、高度依赖于云服务商等。这些挑战需要企业在采用云原生技术时进行充分评估和准备。
- 未来趋势:随着云计算技术的不断发展,云原生将成为未来应用程序开发和部署的主流方式。未来,云原生技术将在更多领域得到应用和推广,为企业带来更大的价值和竞争力。
四、Kubernetes(K8S)
4.0 Kubernetes架构
Kubernetes集群由多个组件组成,包括Master节点和Node节点:
-
Master节点:负责集群的管理和控制,包含API Server、etcd、kube-scheduler、kube-controller-manager等核心组件。
- API Server:集群的API入口,处理用户和其他组件的请求。
- etcd:分布式键值存储系统,用于存储集群的配置和状态信息。
- kube-scheduler:负责Pod的调度,将Pod分配到合适的Node节点上运行。
- kube-controller-manager:包含多个控制器,负责监控集群中的资源对象状态,并确保它们符合用户定义的期望状态。
-
Node节点:负责运行容器实例和提供运行环境,包含kubelet、kube-proxy等组件。
- kubelet:Node节点的代理,负责Pod的创建、删除和管理。
- kube-proxy:实现Service的负载均衡和网络转发功能。
4.0.1 API Server
Kubernetes API server 提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口 ,这些对象包括pods 、services、 replicationcontrollers等 ,API Server为REST操作提供服务 ,并为集群的共享状态提供前端 ,所有其他组件都通过该前端进行交互。
- 该端口默认值为6443 , 可通过启动参数“ -- secure-port ”的值来修改默认值。
- 默认监听IP为0.0.0.0及本机所有IP , 可以通过 启动参数“ --bind-address ”设置监听指定的 内网IP。
- 该端口用于接收客户端 、dashboard等外部 HTTPS请求。
- 实现基于Tocken文件或客户端证书及HTTP Base的认证。
- 实现基于策略的账户鉴权及准入。
- 客户端通过API Server实现对kubernetes的API 远程以实现对kubernetes内部资源的增删改查 等管理任务的分发。
- 整个集群的API网关,相关应用程序为kube-apiserver
- 基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”
- 声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成
- 无状态,数据存储于etcd中
-
Cluster Store
- 集群状态数据存储系统,通常指的就是etcd
- 仅会同API Server交互
-
Controller Manager
- 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager
- 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”
- 工作于loop模式
-
Scheduler
- 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点
- 相关程序为kube-scheduler
4.1 什么是Kubernetes
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它由Google公司设计并开源,是目前容器编排领域最流行和广泛使用的系统之一。
4.2 Kubernetes的特点
4.2.1 自动化容器部署和扩展
- Kubernetes能够自动化地部署、扩展和管理容器化应用程序,减少了手动干预的需要。
- 它支持水平扩展,即根据负载自动增加或减少容器实例的数量,从而优化资源利用和满足应用需求。
4.2.2 服务发现和负载均衡
- Kubernetes内置了服务发现和负载均衡机制,可以自动为容器化的应用程序提供DNS名称或IP地址,并能够在多个副本和实例之间分发网络流量。
- 这有助于提高应用程序的可用性和性能,确保流量能够均匀分布并避免单点故障。
4.2.3 存储编排
- Kubernetes允许用户自动挂载选择的存储系统,如本地存储、公共云提供商的存储等,为容器提供持久化存储。
- 它支持持久卷(Persistent Volumes)和持久卷声明(Persistent Volume Claims),确保数据的持久性和可用性。
4.2.4 自动完成装箱计算
- Kubernetes能够自动完成装箱计算,即根据容器的资源需求(如CPU和内存)和节点的资源限制,智能地调度容器到合适的节点上运行。
- 这有助于优化资源利用,减少资源浪费。
4.2.5 自我修复
- Kubernetes具有强大的自我修复能力,能够监控应用程序的健康状态,并在发现故障时自动进行修复。
- 它可以重启失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并在准备好服务之前不将其通告给客户端。
4.2.6 密钥与配置管理
- Kubernetes允许用户存储和管理敏感信息,如密码、OAuth令牌和SSH密钥。
- 它提供了配置管理和秘密管理功能,允许在不重建容器镜像的情况下部署和更新密钥和应用程序配置,同时保持应用程序的可移植性和安全性。
4.2.7 多云环境支持
- Kubernetes是多云环境友好的,可以轻松部署到不同的云提供商或混合云环境中。
- 这提高了应用程序的弹性和可用性,使得企业可以根据需要选择合适的云服务和部署策略。
4.2.8 声明式配置
- Kubernetes支持声明式配置,用户只需描述应用程序的期望状态,而不需要编写复杂的脚本或命令来手动配置和管理应用程序。
- Kubernetes会自动将实际状态更改为期望状态,简化了应用程序的管理和维护工作。
4.2.9 可扩展性
- Kubernetes具有可扩展性,支持自定义的资源和扩展点,允许用户根据需要进行定制和扩展。
- 这使得Kubernetes能够适应各种复杂的应用场景和需求。
4.3 Kubernetes实现云原生的哪些特性
4.3.1 容器化
- 容器打包:Kubernetes基于容器技术(如Docker)运行,容器作为应用程序的打包单元,确保了应用环境的一致性和可移植性。
- 容器编排:Kubernetes提供了强大的容器编排能力,能够自动化地部署、管理和扩展容器化应用程序。
4.3.2 自动化和动态管理
- 自动化部署:Kubernetes支持自动化的应用程序部署,减少了手动配置和管理的需求。
- 动态伸缩:根据应用程序的负载情况,Kubernetes可以自动增加或减少容器实例的数量,实现资源的动态分配和优化。
- 自我修复:在容器或节点出现故障时,Kubernetes能够自动重启失败的容器或重新调度容器到健康的节点上,确保应用程序的高可用性。
4.3.3 服务发现和负载均衡
- 服务发现:Kubernetes通过Service资源为容器化的应用程序提供统一的访问入口,使得服务之间的调用更加简单和可靠。
- 负载均衡:Kubernetes内置了负载均衡机制,能够自动将网络流量分发到多个容器实例上,提高应用程序的响应能力和吞吐量。
4.3.4 声明式配置
- 声明式API:Kubernetes使用声明式API来描述应用程序的期望状态,而不是具体的实现细节。这使得用户只需关注应用程序的目标状态,而无需关心如何达到该状态。
- 自动同步:Kubernetes会自动将系统的实际状态与期望状态进行同步,确保应用程序始终按照用户的意图运行。
4.3.5 高可用性和容错性
- 高可用性架构:Kubernetes采用主从架构(Master-Slave),Master节点负责集群的管理和控制,Worker节点负责运行应用程序的容器。Master节点具有高可用性功能,能够在故障时自动切换到备用节点。
- 容错机制:Kubernetes通过多副本(ReplicaSets)和Pod健康检查等机制来确保应用程序的容错性。在容器或节点出现故障时,能够自动恢复服务并减少中断时间。
4.3.6 跨平台和多云支持
- 跨平台兼容性:Kubernetes支持在多种操作系统和硬件平台上运行,使得应用程序可以在不同的环境中以相同的方式运行。
- 多云部署:Kubernetes支持多云部署和混合云部署,使得企业可以根据需要选择合适的云服务和部署策略。
4.3.7 丰富的生态系统和工具链
- 生态系统:Kubernetes拥有庞大的生态系统,包括各种工具、插件和服务,可以扩展其功能并满足不同的应用场景需求。
- 工具链:如Helm(应用程序打包和部署)、Prometheus(监控)、Istio(服务网格)等工具和插件,进一步增强了Kubernetes的功能和易用性。
4.4 Kubernetes容器编排技术
4.4.1 Pod的定义
- 最小调度单元:Pod是Kubernetes中的最小调度单元,它封装了一个或多个紧密相关的容器,这些容器共享相同的网络命名空间、存储卷以及IP地址。
- 资源共享:Pod内的容器可以共享存储卷、网络等资源,它们之间可以通过localhost进行高效通信。
4.4.2 Pod的编排原理
- Pod的创建
- YAML或JSON描述文件:创建Pod时,首先需要定义一个包含Pod描述信息的YAML或JSON文件。这个文件详细说明了Pod的元数据(如名称、命名空间)、规格(如容器镜像、端口、资源限制等)以及任何需要的存储卷等信息。
- 使用kubectl或API:然后,可以使用kubectl命令行工具或编写代码与Kubernetes API进行交互,根据描述文件创建Pod。
- Pod的调度
- 调度器(Scheduler) :Kubernetes的调度器负责将Pod调度到合适的节点上运行。调度决策基于多种因素,包括节点的资源可用性、Pod的资源需求、亲和性和反亲和性规则等。
- 网络插件:Pod的IP地址由网络插件(如Calico、Flannel、Weave等)分配,确保每个Pod都有唯一的IP地址,并通过集群网络进行通信。
- Pod运行
- kubelet:每个节点上的kubelet进程负责监控Pod的运行状态,并确保Pod中的容器按照预期运行。kubelet会根据Pod描述文件中的信息,从容器镜像仓库中拉取镜像,并启动容器。
- 容器运行时:容器运行时(如Docker)负责实际创建和管理容器。它提供容器的隔离环境和资源管理功能。
- Pod的管理
- 监控与更新:Kubernetes会监控Pod的运行状态,并在发生故障或异常时进行相应的处理。kubelet会定期向Kubernetes API服务器报告Pod的状态,以便管理员进行监控和管理。
- 生命周期管理:Pod的生命周期管理包括启动、运行、重启、更新和删除等阶段。Kubernetes提供了丰富的API和命令行工具来支持这些操作。
- Pod的多容器特性
- 共享资源:Pod内的所有容器共享同一个网络命名空间,这意味着它们可以使用相同的IP地址和端口进行通信。此外,Pod还可以挂载共享存储卷,允许容器之间共享数据。
- 协作与隔离:Pod内的容器可以紧密协作,实现复杂的应用程序架构。同时,由于Pod是Kubernetes中最小的调度单元,因此它也为应用程序提供了良好的隔离性。
4.5 Kubernetes设计架构
4.5.1 管理节点
Kubernetes集群的“大脑”,负责管理和控制整个集群的状态和行为。
- kube-apiserver
- 是Kubernetes集群的前端,负责处理所有来自用户和其他组件的REST API请求。
- 提供了集群的API访问入口,负责验证和授权请求,并管理集群的状态信息。
- 是集群内部各组件通信的桥梁,所有控制请求都需要通过它进行处理。
- etcd
- 是一个高可用的键值存储系统,用于保存集群的所有配置和状态信息。
- 提供了强一致性和高可靠性的数据存储服务,是集群的源数据存储系统。
- kube-scheduler
- 负责将新创建的Pod调度到合适的节点上运行。
- 根据预设的调度策略和节点的资源状况,选择最优的节点来运行Pod。
- kube-controller-manager
- 是集群中各种控制器的管理者,负责执行各种控制循环,以确保集群状态符合预期。
- 包括Node Controller、Replication Controller、Endpoint Controller等多种控制器,分别负责不同的集群管理任务。
- cloud-controller-manager(可选)
- 是Kubernetes与底层云服务的集成点,用于管理云资源(如节点、负载均衡器等)。
- 使得Kubernetes能够跨不同云平台运行,并充分利用云平台的特性。
4.5.2 被控制节点
是Kubernetes集群中实际运行容器化应用程序的部分,主要包括工作节点(Worker Nodes)和kubelet等组件。
- 工作节点(Worker Nodes)
- 是Kubernetes集群中负责运行容器化应用程序的节点。
- 每个工作节点都运行一个kubelet进程,负责管理节点上的容器和Pod。
- kubelet
- 是工作节点上的主要“节点代理”,负责Pod的创建、启动、停止和监控等任务。
- 与kube-apiserver通信,接收来自控制面的指令,并管理节点上的容器运行时(如Docker、containerd等)。
- kube-proxy
- 负责在节点上实现网络代理和负载均衡功能。
- 确保Service对象能够跨节点进行通信,并提供内部和外部访问的路由能力。
- 容器运行时(Container Runtime)
- 负责容器的实际运行和管理。
- Kubernetes支持多种容器运行时,如Docker、containerd等。
4.5.3 分层架构
Kubernetes的设计理念和功能还体现在其分层架构上,主要包括以下几个层次:
- 核心层:提供Kubernetes最核心的功能,如API服务、资源调度、容器管理等。
- 应用层:支持各种类型的应用部署和路由,如无状态应用、有状态应用、批处理任务等。
- 管理层:提供系统度量、自动化操作和策略管理等功能,如自动扩展、动态Provision、RBAC等。
- 接口层:提供与Kubernetes集群交互的接口工具,如kubectl命令行工具、客户端SDK等。
- 生态系统:围绕Kubernetes构建的庞大容器集群管理调度生态系统,包括日志、监控、配置管理、CI/CD等。
五、 Kubernetes部署(Ubuntu)
5.1 准备工作
5.1.1 初始化系统环境
- 修改root账户密码
sudo su #进入root
[sudo] password for wd: #输入普通用户密码
root@ubuntu-6:/home/wd# #进入root账户
sudo passwd root #修改root账户密码
New password: #输入新的root账户密码
Retype new password: #再次确认root账户密码
2. 修改sshd_config
root@ubantu-4:~# vim /etc/ssh/sshd_config
23 # Ciphers and keying
24 #RekeyLimit default none
25
26 # Logging
27 #SyslogFacility AUTH
28 #LogLevel INFO
29
30 # Authentication:
31
32 #LoginGraceTime 2m
33 PermitRootLogin yes #开启ssh远程登录选项
34 #StrictModes yes
35 #MaxAuthTries 6
36 #MaxSessions 10
systemctl restart sshd #重启sshd服务
3. 修改时区
root@ubantu-4:~# timedatectl set-timezone Asia/Shanghai
root@ubantu-4:~# timedatectl -a
Local time: Mon 2024-08-19 16:36:23 CST
Universal time: Mon 2024-08-19 08:36:23 UTC
RTC time: Mon 2024-08-19 08:36:22
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
root@ubantu-4:~# timedatectl show
Timezone=Asia/Shanghai
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Mon 2024-08-19 16:36:35 CST
RTCTimeUSec=Mon 2024-08-19 16:36:35 CST
4. 设置域名,用于区分不同功能的机器
Master:
hostnamectl hostname master
bash
Node1:
hostnamectl hostname node1
bash
Node2:
hostnamectl hostname node2
bash
5. 配置网络
#Master:
network:
ethernets:
ens33:
addresses:
- 192.168.137.104/24
nameservers:
addresses:
- 218.2.135.1
search: []
routes:
- to: default
via: 192.168.137.2
version: 2
#Node1:
network:
ethernets:
ens33:
addresses:
- 192.168.137.105/24
nameservers:
addresses:
- 218.2.135.1
search: []
routes:
- to: default
via: 192.168.137.2
version: 2
#Node2:
network:
ethernets:
ens33:
addresses:
- 192.168.137.106/24
nameservers:
addresses:
- 218.2.135.1
search: []
routes:
- to: default
via: 192.168.137.2
version: 2
6. 更新源仓库
root@master:~# apt update
5.2 安装容器引擎
之前:K8S 1.23版本之前包含1.23,使用Docker作为容器引擎。 1.24之后,Containerd取代了Docker
Containerd: 是一个开源的容器运行时工具,它为容器提供了核心功能。
OCI是一个开放标准组织,其主要目标是推动容器技术的开放标准化,以促进容器生态系统的发展和互操作性。
Docker和Containerd的区别和联系: Containerd取代了Docker引擎,目的是提高效率。
5.2.1 安装Containerd
root@master:~# apt update
root@master:~# apt install containerd -y #安装containerd引擎
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
containerd is already the newest version (1.7.12-0ubuntu2~22.04.1).
0 upgraded, 0 newly installed, 0 to remove and 27 not upgraded.
root@master:~# /lib/systemd/system/containerd.service #启动containerd引擎
bash: /lib/systemd/system/containerd.service: Permission denied
root@master:~# mkdir /etc/containerd/ #创建containerd配置文件的存放位置
root@master:~# containerd config default > /etc/containerd/config.toml #将containerd默认的配置文档替换到刚刚创建的配置文件存放路径下
5.2.2 修改containerd配置文件
root@master:~# vim /etc/containerd/config.toml
65 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
137 SystemdCgroup = true
169 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
170 endpoint = ["https://1hxn8okv.mirror.aliyuncs.com"] #[]内的地址是自己申请的阿里云镜像加速地址,每个人都不一样
systemctl restart containerd
5.2.3 安装nerdctl工具
root@master:~# apt install lrzsz #安装远程文件传输工具
root@master:~# tar xvf nerdctl-1.3.0-linux-amd64.tar.gz -C /usr/local/bin/ #安装nerdctl工具并指定路径到/usr/local/bin/
nerdctl
containerd-rootless-setuptool.sh
containerd-rootless.sh
root@master:~# nerdctl version #查看nerdctl版本
WARN[0000] unable to determine buildctl version: exec: "buildctl": executable file not found in $PATH
Client:
Version: v1.3.0
OS/Arch: linux/amd64
Git commit: c6ddd63dea9aa438fdb0587c0d3d9ae61a60523e
buildctl:
Version:
Server:
containerd:
Version: 1.7.12
GitCommit:
runc:
Version: 1.1.12-0ubuntu2~22.04.1
root@master:~# mkdir /etc/nerdctl #创建nerdctl配置文件目录
root@master:~# cat > /etc/nerdctl/nerdctl.toml <<EOF
> namespace = "k8s.io"
> debug = false
> debug_full = false
> insecure_registry = true
> EOF
5.2.4 安装CNI网桥工具
root@master:~# tar xvf cni-plugins-linux-amd64-v1.5.1.tgz -C /usr/local/bin/ #安装cni工具并指定路径到/usr/local/bin/
./
./dhcp
./loopback
./README.md
./bandwidth
./ipvlan
./vlan
./static
./host-device
./LICENSE
./bridge
./dummy
./tuning
./vrf
./tap
./portmap
./firewall
./ptp
./host-local
./macvlan
./sbr
5.2.5 初始化K8S环境
#安装chrony时间同步工具、ipcsadm虚拟ip管理工具、tree树状递归显示目录工具、ipset:批量管理IP地址工具
root@master:~# apt install chrony ipvsadm tree ipset -y
root@master:~# systemctl stop nfw #关闭防火墙
#关闭swap,交换分区
root@master:~# swapoff -a
root@master:~# sed -i '/swap.img/s/^/#/' /etc/fstab
#配置时间服务器
root@master:~# sed -i 's/pool ntp.ubuntu.com/pool 192.168.137.104/' /etc/chrony/chrony.conf
root@master:~# systemctl restart chronyd
#加载模块
root@master:~# modprobe br_netfilter && lsmod |grep br_netfilter
root@master:~# modprobe ip_conntrack && lsmod | grep conntrack
root@master:~# cat >/etc/modules-load.d/modules.conf<<EOF
ip_vs
ip_vs_lc
ip_vs_lblc
ip_vs_lblcr
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
br_netfilter
nf_conntrack
overlay
EOF
root@master:~# systemctl restart systemd-modules-load.service
root@master:~# lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_ftp 16384 0
nf_nat 49152 1 ip_vs_ftp
ip_vs_sed 16384 0
ip_vs_nq 16384 0
ip_vs_fo 16384 0
ip_vs_dh 16384 0
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs_lblcr 16384 0
ip_vs_lblc 16384 0
ip_vs_lc 16384 0
ip_vs 176128 22 ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_wrr,ip_vs_lc,ip_vs_sed,ip_vs_ftp
nf_conntrack 172032 2 nf_nat,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 5 nf_conntrack,nf_nat,btrfs,raid456,ip_v
#修改内核参数
root@master:~# vim /etc/sysctl.conf #最后一行插入以下内容
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
root@master:~# sysctl -p #重启内核
5.3 安装K8S
5.3.1 配置说明
#域名 IP地址 配置 角色
master 192.168.137.104 4c4G master
node1 192.168.137.105 4c4G node1
node2 192.168.137.106 4c4G node2
5.3.2 安装 kubeadm 、kubelet、 kubectl(master,node1,node2)
root@master:~# apt update
root@master:~# apt install apt-transport-https ca-certificates curl gpg -y
root@master:~# mkdir -p -m 755 /etc/apt/keyrings
root@master:~# curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
root@master:~# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
root@master:~# apt-get update && apt-cache madison kubeadm #安装kubeadm
root@master:~# apt-get install -y kubelet=1.30.3-1.1 kubeadm=1.30.3-1.1 kubectl=1.30.3-1.1 #安装kubelet、kubectl
root@master:~# apt install kubelet kubeadm kubectl -y
5.3.3 拉取镜像
root@master:~# vim images_download.sh
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.12-0
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1
root@master:~# bash images_download.sh
5.3.4 创建master
root@master:~# kubeadm init --apiserver-advertise-address=192.168.137.104(master的ip地址) --apiserver-bind-port=6443 --kubernetes-version=v1.30.3 --pod-network-cidr=10.200.0.0/16 --service-cidr=10.96.0.0/16 --service-dns-domain=cluster.local --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=swap
#该步骤输入以后出现·步骤5·内容直接复制到节点机器中
root@master:~# mkdir -p $HOME/.kube
root@master:~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@master:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
root@master:~# export KUBECONFIG=/etc/kubernetes/admin.conf
5.3.5 节点(node1、node2)加入到集群
root@node1:~# kubeadm join 192.168.137.104:6443 --token wtkiq4.pnxg1q5m35hkail1 --discovery-token-ca-cert-hash sha256:2d0e07b7c39cb2c7e852a9e9abab393e32cca53febfd76603e2cc272132efd1f
root@node2:~#kubeadm join 192.168.137.104:6443 --token wtkiq4.pnxg1q5m35hkail1 --discovery-token-ca-cert-hash sha256:2d0e07b7c39cb2c7e852a9e9abab393e32cca53febfd76603e2cc272132efd1f
5.3.6 查看集群节点
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 20h v1.30.4
node1 NotReady <none> 20h v1.30.4
node2 NotReady <none> 5h34m v1.30.3
六、Calico网络组件
calico 是一个网络和安全的解决方案。K8S的一个组件
https://github.com/projectcalico/calico/
文档地址: https://docs.tigera.io/calico/latest/about/
calico配置文件路径
release-v3.28.0/manifests/
calico镜像文件路径
cd release-v3.28.0/images/
6.1 准备工作
6.1.1 查看master集群状态
root@master01:~# kubectl get node
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane 3d21h v1.30.3
node1 NotReady <none> 3d21h v1.30.3
node2 NotReady <none> 3d21h v1.30.3
6.1.2 安装包准备
6.2 安装calico(master、node1、node2)
tar -zxvf calico-release-v3.28.0.tgz
6.3 修改calico配置文件(master、node1、node2)
cd release-v3.28.0/manifests/calico.yaml
4957 - name: CALICO_IPV4POOL_CIDR #取消注释
4958 value: "10.200.0.0/16" #取消注释并更改先设置的pod网段
6.4 验证配置文件(master、node1、node2)
cat release-v3.28.0/manifests/calico.yaml | grep image:
image: docker.io/calico/cni:v3.28.0
image: docker.io/calico/cni:v3.28.0
image: docker.io/calico/node:v3.28.0
image: docker.io/calico/node:v3.28.0
image: docker.io/calico/kube-controllers:v3.28.0
6.5 加入镜像(master、node1、node2)
cd release-v3.28.0/images/
nerdctl load -i calico-cni.tar
nerdctl load -i calico-node.tar
nerdctl load -i calico-kube-controllers.tar
6.6 执行安装(master)
root@master01:~# kubectl apply -f release-v3.28.0/manifests/calico.yaml
6.7 载入Nginx镜像(node1、node2)
tar xvf nginx.tar.gz
6.8 验证(master)
kubectl run nginx11 --image=harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u sleep 10000
kubectl run nginx22 --image=harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u sleep 10000
root@master01:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx11 1/1 Running 0 35m 10.200.166.129 node1 <none> <none>
nginx22 1/1 Running 0 35m 10.200.166.130 node1 <none> <none>
root@master01:~# kubectl exec nginx11 -it bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@nginx11 /]# ping 10.200.166.130
PING 10.200.166.130 (10.200.166.130) 56(84) bytes of data.
64 bytes from 10.200.166.130: icmp_seq=1 ttl=63 time=0.060 ms
64 bytes from 10.200.166.130: icmp_seq=2 ttl=63 time=0.063 ms
64 bytes from 10.200.166.130: icmp_seq=3 ttl=63 time=0.060 ms
64 bytes from 10.200.166.130: icmp_seq=4 ttl=63 time=0.061 ms
64 bytes from 10.200.166.130: icmp_seq=5 ttl=63 time=0.060 ms
64 bytes from 10.200.166.130: icmp_seq=6 ttl=63 time=0.058 ms
^C
--- 10.200.166.130 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5118ms
rtt min/avg/max/mdev = 0.058/0.060/0.063/0.006 ms
root@master01:~# kubectl exec nginx22 -it bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@nginx22 /]# ping 10.200.166.129
PING 10.200.166.129 (10.200.166.129) 56(84) bytes of data.
64 bytes from 10.200.166.129: icmp_seq=1 ttl=63 time=0.114 ms
64 bytes from 10.200.166.129: icmp_seq=2 ttl=63 time=0.063 ms
64 bytes from 10.200.166.129: icmp_seq=3 ttl=63 time=0.079 ms
64 bytes from 10.200.166.129: icmp_seq=4 ttl=63 time=0.076 ms
^C
--- 10.200.166.129 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3065ms
rtt min/avg/max/mdev = 0.063/0.083/0.114/0.018 ms
6.9 启动Nginx,登录网页(master)
root@master01:~# kubectl exec nginx22 -it bash
[root@nginx22 /]# nginx
[root@nginx22 /]# exit
command terminated with exit code 130
root@master01:~# curl 10.200.166.130
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>