云技术即基本用法
声明: 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章。本文只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 微信公众号:泷羽sec
在过去,搭建一个应用程序是一个巨大工程。需要购买服务器,租赁机房,进行安装、上架,还得拧螺丝、接网线。但如今,情况大不相同,现在很多基础设施都已经云化了。我们可以直接找像阿里云、腾讯云这样的云服务器厂家,购买一些云服务器,短短几分钟就能申请下来。基于这些云服务器,我们可以轻松地进行各种各样的应用部署。
如果在阅读过程中发现问题,欢迎各位师傅留言
一、云架构介绍
在数字时代,无论是构建坚不可摧的防御系统,还是打造锐不可当的进攻系统,都离不开强大的底层技术支撑。这不仅是技术的较量,更是对底层逻辑与机制的深刻理解。
过去,构建系统如同建造一座实体建筑,需要购买设备、租用数据中心机柜,并亲自搭建基础设施。但随着科技的飞速发展,虚拟化技术应运而生,特别是虚拟机的出现,彻底改变了这一局面。虚拟机能够将一台物理机的资源高效分割为多台虚拟机,从而提高了资源利用率,使系统更加灵活、可扩展。这一转变标志着从裸机基础设施向虚拟化基础设施的跨越。
随后,容器化技术的崛起进一步推动了这一进程。容器化不仅提高了资源利用效率,还实现了服务器、网络和存储的虚拟交付,使得应用部署更加便捷、高效。如今,我们所说的“云”正是这一系列技术演进的结晶,而不是一个单一的技术,它融合了虚拟化、容器化、自动化等多种先进技术,为用户提供了前所未有的便捷与高效。
二、云服务
云,作为一种先进的IT基础设施系统,将资源的创建与管理抽象在容错、地理分布和可扩展的物理基础设施之上。它如同一位无形的建筑师,能够根据用户需求自动创建服务器、存储、网络等基础设施,使得IT资源的获取与使用变得前所未有的简单与快捷。
云基础架构的稳定性至关重要,它必须能够确保服务的连续性和可靠性,避免频繁的中断和故障。同时,地理分布的云基础设施能够进一步提高容错能力,确保在任何地理位置都能提供稳定的服务。此外,云还必须具备快速扩展的能力,以满足不断增长的业务需求。
在公有云领域,Amazon Web Services(AWS)、Azure、Google Cloud Platform(GCP)以及中国的华为云、腾讯云、阿里云等服务商均提供了丰富的云服务选项。而对于需要更高安全性和可控性的组织来说,他们还可以选择使用OpenStack等工具在自己的数据中心搭建私有云,或者采用混合云策略,将部分业务运行在私有云中,部分运行在公有云中。
三、云分类
根据服务类型和用户需求的不同,云可以分为以下几种类型:
- 基础设施即服务(IaaS):如同提供建筑材料和工具一样,IaaS允许用户自己搭建和管理云基础设施。用户可以根据需要选择虚拟机、存储和网络等资源,并自行安装和配置操作系统及应用软件。
- 平台即服务(PaaS):PaaS提供了一个完整的开发、测试和部署环境,用户无需担心底层基础设施的搭建和管理。PaaS平台通常包括数据库、中间件、开发工具等,使得应用开发更加便捷和高效。
- 软件即服务(SaaS):SaaS是一种完全托管的软件服务模式,用户无需购买、安装或维护软件。SaaS提供商负责软件的运行、维护和升级工作,用户只需通过浏览器或移动应用即可访问和使用软件。
四、共享责任模型
在云服务环境中,安全责任通常是由云服务提供商和用户共同承担的。这一模型被称为“共享责任模型”。
对于云服务提供商来说,他们负责确保云基础设施的安全性、可靠性和可用性。这包括物理安全、网络安全、数据加密、身份验证等方面的工作。如果因为云服务提供商的疏忽或错误导致数据泄露或损失,他们通常需要承担相应的责任。
而对于用户来说,他们需要负责保护自己的数据和应用程序免受恶意攻击和未经授权的访问。这包括配置安全策略、更新补丁、监控日志等工作。如果因为用户的疏忽或错误导致安全问题发生,那么责任将由用户自行承担。
五、云架构深化
- 虚拟化技术:虚拟化是云架构的基石,通过将物理硬件资源(如CPU、内存、存储)抽象成多个虚拟资源,实现了资源的灵活分配和高效利用。这些虚拟资源形成资源池,支持快速部署和扩展,同时确保了资源的隔离性,提高了系统的安全性和稳定性。尽管虚拟化技术已经相当成熟,但它并非专为云环境设计,仍有进一步优化的空间。随着容器技术的兴起,虚拟化技术得到了进一步的补充和升级。
- 容器技术:容器技术提供了一种轻量级的、可移植的、自给自足的软件运行环境。每个容器都包含了运行一个应用所需的代码、运行时、系统工具、系统库和设置。容器技术使得开发人员能够更灵活地与软件堆栈的各个部分进行交互,按需生成服务,并提高了网络抽象的程度,方便了应用的迁移和扩展。通过容器化,企业可以更加高效地利用资源,同时降低系统管理和网络工程的复杂性。
六、云架构设计原则
-
组件选择与集成:在设计云架构时,首先需要确定架构的整体框架,这是后续难以更改的部分。接着,需要选择绑定或非绑定的组件,这些组件可以是企业自行开发的、使用开源的,或者购买的商业产品。云原生组件是专为分布式系统设计的,它们通常具有高度的可扩展性和灵活性。虽然CNCF认证不是必须的,但选择经过认证的组件可以提高系统的安全性和可靠性。同时,要确保代码的安全编码,并充分利用开源社区的资源。
-
基础设施即代码(IaC):IaC是一种将基础设施配置和部署过程自动化的方法。它通过使用工具如Packer、Terraform、Ansible和Monit等,实现了从引导介质到系统安装、自动配置和状态强制的整个过程。IaC使得基础设施的管理更加高效、可重复和可审计,降低了人为错误的风险。
七、集成部署与弹性可靠性
-
持续集成与持续交付(CICD):CICD管道是构建、测试、部署和监控应用的关键工具。通过自动化测试和部署,CICD管道能够确保代码更改的及时性和准确性。GitOps是一种基于Git的CICD实践,它通过将应用的状态和配置存储在Git仓库中,实现了对应用部署和配置的持续监控和管理。为了确保系统的弹性可靠性,需要设计故障转移机制和其他冗余措施,以应对任何单点故障。
-
全球负载均衡(GSLB):GSLB是一种通过智能DNS或全局流量管理器(GTM)等技术实现的负载均衡方法。它能够根据用户的地理位置、网络条件和其他因素,将用户的请求路由到最近的或最优的服务器节点上。这不仅提高了用户的访问速度和体验,还降低了单点故障的风险。
八、云设计模式与实践
-
微服务架构:微服务架构是一种将应用拆分成一组小型、自治、松散耦合的服务的设计模式。每个服务都运行在独立的进程中,并使用轻量级通信机制(如HTTP或gRPC)进行通信。微服务架构提高了系统的可扩展性和容错性,使得每个服务都可以独立地进行修改、部署和重用。同时,由于每个服务都是独立运行的,因此也提高了系统的安全性和可维护性。然而,微服务架构也带来了调试复杂性和性能瓶颈等挑战。
-
零信任架构:零信任架构是一种基于“永不信任,始终验证”原则的安全模型。它要求对每个请求都进行身份验证和授权,即使请求来自内部网络或受信任的用户。实现零信任架构的一种常见方法是使用Open ID Connect(OIDC)等联盟访问技术。通过OIDC,企业可以实现对用户身份的集中管理和验证,同时提供对联合内服务的短期访问令牌。为了防范针对零信任架构的攻击,如密码重置攻击,企业需要采取额外的安全措施,如多因素认证(2FA)和定期密码更换等。
九、安全控制策略
-
网络控制:在云环境中,网络控制变得更加复杂和灵活。传统架构中的防火墙已经被软件定义网络(SDN)和软件定义广域网(SD-WAN)等技术所取代。SDN允许企业根据不同的接口(如API或GUI)设置网络规则,并通过mTLS等技术实现流量的加密和客户端的身份验证。为了确保访问管理的正确性,企业需要采用现代访问管理系统,如基于令牌的访问控制(如JWT)和强制访问控制(MAC)等。
-
身份管理:身份管理是确保系统安全的关键环节。企业通常采用Active Directory(AD)或LDAP等身份管理系统来管理用户身份和访问权限。在云环境中,AWS IAM等公共云服务提供了强大的身份和访问管理功能。为了进一步提高安全性,企业可以采用联盟认证技术(如OIDC)和云身份提供者(IdP)作为真实身份来源。这些技术不仅提高了身份管理的效率和准确性,还降低了身份泄露和滥用的风险。
十、容器与云
虚拟化技术中,每个虚拟机(VM)需要运行自己的操作系统,这大大增加了总体资源开销。相比之下,容器化技术提供了一种更现代、更高效的架构。在容器化环境中,多个容器共享同一个操作系统内核和硬件资源,从而实现了更快的启动速度、更小的资源占用和更高的运行效率。容器是对虚拟化技术的一种补充,而非完全取代。
容器的系统开销较小,可以进一步分离应用的不同组件,如搜索、登录、查询和订单处理等,使得每个组件都能独立运行和扩展。容器使用映像作为模板来生成实例,这些映像相当于计算机的硬盘镜像,包含了运行应用所需的所有依赖和配置。
在Ubuntu系统上,我们可以使用Docker这个流行的容器化工具来创建和运行CentOS 7的容器。具体步骤如下:
- 安装Docker:
- 更新系统软件包列表:“sudo apt-get update”。
- 安装Docker:“sudo apt-get install docker.io”。
- 拉取CentOS 7镜像:
- 使用Docker Hub上的官方镜像:“sudo docker pull centos:7”。
- 运行CentOS 7容器:
- 启动一个基于CentOS 7镜像的容器,并分配一个伪终端:“sudo docker run -it --name my_centos7 centos:7 /bin/bash”。
此外,我们还可以创建Apache容器并使其在后台运行,例如:
- “docker container run -d --rm -p 8080:80 httpd”命令会在后台运行一个Apache HTTP服务器容器,并将宿主机的8080端口映射到容器的80端口上。
常用Docker命令包括:
- “docker container ls”查看所有容器。
- “docker exec -it <container_id> /bin/bash”进入特定容器。
- “docker container stop <container_id>”停止容器。
- “docker container run -d --rm -p 8080:80 -v /home/user/webroot/:/usr/local/apache2/htdocs/ httpd”挂载宿主机目录运行容器。
- “docker container run -d --rm --network host -v /home/user/webroot/:/usr/local/apache2/htdocs/ httpd”侦听宿主机80端口运行容器(在某些系统上,–network host可能需要特权模式)。
- “docker ps”列出所有正在运行的容器。
- “docker top <container_name_or_id>”查看特定容器的进程信息。
Podman是Docker的一个无守护进程替代品,提供了类似的功能和命令集。使用Podman可以运行容器、创建和管理pods等。
大部分容器化过程都遵循开放容器计划(OCI)标准,因此Podman和Docker等容器工具可以互操作,共享相同的容器映像格式。
十一、容器的真相
Linux系统并没有一个单一被称为“容器”的功能特性。实际上,“容器”是一组内核级别的特性组合,这些特性共同阻止进程访问其他进程和资源。这些特性可以在内核级别上进行配置和控制,以提供不同程度的隔离和限制。
容器的历史可以追溯到早期的chroot技术,它允许进程在一个新的根目录下运行,但存在一些限制和不完善之处。随后,命名空间(Namespaces)技术的引入使得每个进程可以拥有自己独立的网络、进程和其他命名空间,进一步增强了隔离性。此外,cgroup(控制组)技术的引入允许对特定进程的内存、CPU等资源使用进行限制。
Linux系统中有多种用户命名空间类型,包括挂载(Mount)、进程ID(PID)、网络(Network)、进程间通信(IPC)、UTS(主机名和域名)、用户ID(User)、控制组(Cgroup)、时间(Time)、syslog等。这些命名空间类型提供了不同级别的隔离和限制功能。
十二、Capabilities(完善版)
Docker默认不使用用户命名空间来运行容器进程。为了限制容器内进程的特权内核调用,Docker使用了内核capabilities和seccomp配置文件来限制容器内进程的访问权限。
Linux系统中有特权进程和非特权进程之分。非特权进程具有执行常规任务的权限,而特权进程则几乎可以执行任何任务。当非特权进程需要执行某些特殊任务时,可以使用capabilities来授予这些特定的权限。Linux系统将一些系统级任务分组为多个capabilities类别,每个类别代表了一组相关的权限。
常见的capabilities包括:
- CAP_CHOWN:允许进程修改文件的所有者。
- CAP_NET_ADMIN:允许进程执行网络配置管理任务。
- CAP_NET_BIND_SERVICE:允许进程绑定到小于1024的端口。
- CAP_NET_RAW:允许进程使用RAW套接字。
- CAP_SYS_ADMIN:提供广泛的系统级权限(通常被视为危险),因为它启用了过多的功能集。
- CAP_SYS_BOOT:允许进程重新启动主机。
- CAP_SYS_MODULE:允许进程加载和卸载内核模块。
- CAP_SYS_TIME:允许进程设置系统时钟。
- CAP_SYS_CHROOT:允许进程使用chroot。
- CAP_AUDIT_WRITE:允许进程写入内核审计日志。
在使用capabilities时需要注意安全性问题。如果过度授予capabilities给进程或容器,可能会被恶意用户利用来破坏系统、窃取敏感信息或完全控制整个系统。因此,在配置和使用capabilities时需要谨慎行事,并根据实际需求进行最小权限原则的配置。
十三、Kubernetes(k8s)
Kubernetes(简称K8s)是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用程序。通过高效地在多个服务器上运行容器,Kubernetes确保了应用的高可用性和可扩展性。
十四、Kubernetes 核心概念
- Pod:Kubernetes中的最小可部署单元,可包含一个或多个容器。这些容器共享网络命名空间和存储卷,并被一起调度和管理。
- Deployment:用于管理Pod的副本数量和更新策略。通过Deployment,可以确保应用始终保持指定数量的副本在运行,并实现滚动更新等功能。
- Service:定义了一组Pod的访问方式,提供稳定的IP地址和端口,使外部能够访问到这些Pod。
- Node:Kubernetes中的工作节点,可以是物理服务器或虚拟机。每个Node上运行着Kubelet和容器运行时,负责容器的生命周期管理。
十五、安装 Kubernetes
- Minikube(用于本地开发):
- 下载并安装Minikube,根据操作系统选择合适版本。
- 在终端中运行
minikube start
命令启动Minikube。
十六、部署应用到 Kubernetes
- 创建一个Deployment来部署Nginx服务器:
kubectl create deployment nginx --image=nginx
。 - 查看Deployment状态:
kubectl get deployments
。 - 创建一个Service以允许外部访问Nginx服务器:
kubectl expose deployment nginx --port=80 --type=NodePort
。 - 查看Service状态:
kubectl get services
。
十七、访问应用
在Service信息中找到NodePort的端口号,然后在浏览器中通过<Minikube IP>:<NodePort>
访问Nginx服务器。
十八、扩展应用
- 扩展Deployment的副本数量:
kubectl scale deployment nginx --replicas=3
。 - 验证副本数量:
kubectl get deployments
。
十九、更新应用
- 更新Deployment的镜像:
kubectl set image deployment/nginx nginx=new-image:version
。 - 查看更新进度:
kubectl rollout status deployment/nginx
。
二十、Git
Git是一个分布式版本控制系统,用于跟踪文件变化,促进团队协作开发。
二十一、安装 Git
- Windows:从Git官方网站下载安装程序。
- macOS:使用Homebrew等包管理器安装。
- Linux:通过系统包管理器安装,如Ubuntu上的
sudo apt-get install git
。
二十二、Git 安全措施
- 强密码:为Git远程仓库设置强密码。
- 访问权限:限制访问权限,只授予必要人员访问。
- 避免敏感信息:使用
.gitignore
文件防止敏感信息被提交,若不小心提交,可使用git rm --cached <文件名>
和git commit --amend
处理。 - 加密通信:使用SSH或HTTPS协议与Git远程仓库通信。
- 安全审计:定期进行安全审计,检查权限设置和敏感信息泄露。
- 备份:定期备份Git仓库,防止数据丢失。
二十三、Git 基本操作
- 克隆仓库:
git clone <远程仓库地址>
。 - 创建分支:
git branch <分支名>
。 - 切换分支:
git checkout <分支名>
。 - 合并分支:切换到目标分支后,使用
git merge <源分支名>
进行合并。 - 初始化仓库:
git init
。 - 添加文件:
git add <文件名>
或git add .
。 - 提交更改:
git commit -m "提交说明"
。 - 查看状态:
git status
。 - 查看历史记录:
git log
。 - 处理冲突:当合并分支时出现冲突,手动解决后提交更改。