云原生实战-Docker+K8s
云平台核心
公有云
- 公有云资源(服务器、存储空间)由第三方云服务商运营
- 通过Internet提供
- 在公有云中,与其它组织或云“用户” 共享相同的硬件、存储和网络设备
- 优势:近乎无限性的缩放性,提供按需资源,可满足业务需求
私有云
- 私有云由专供一个企业或组织使用的云计算资源构成
- 服务和基础结构始终在私有网络上进行维护
- 私有云使用对象:政府机构、金融机构、具备业务关键性运营且希望对环境拥有更大控制权的大型组织
- 更高的隐私级别
基础概念
- 云服务器作为应用的最终载体
- VPC为所有的云服务器提供网络隔离:在物理层做网络隔离
- 安全组控制每个服务器的防火规则
- 公网IP使得资源可访问
- 端口转发的方式访问到具体服务器
什么是VPC
- VPC: virtual private cloud,虚拟私有云,用户在公共云上申请的隔离的、私密的虚拟网络环境
- 用户可以自由配置VPC内的IP地址段、子网、安全组等子服务,也可以申请弹性带宽和弹性IP搭建业务服务
- 经典网络:公有云上所有用户共享公共网络资源池,用户之间未做逻辑隔离,用户的IP由系统统一分配,不同用户的IP不同
- VPC:在公有云上为用户建立一块逻辑隔离的虚拟网络空间,
Docker
Docker-VPS-ECS的区别
- VPS: Virtual Private Server 虚拟专用服务器 将物理服务器分割成多个虚拟机,与笔记本上用Vmware和VirtualBox建立的虚拟机是一回事,不支持自主升降级,不具有弹性
- ECS: Elastic Computer Service 弹性计算服务,用户可以根据需要弹性选择服务器CPU、内存、带宽等
- 相当于在ECS中再运行一个虚拟机,非常笨重
- Docker容器中只有应用、依赖库和配置,并没有操作系统
- 总的来说:物理机跑ECS,ECS跑Docker容器,多个Docker容器共享一个操作系统,使用操作系统内核
应用场景
- 比如:你写了一个web应用程序,想要发给朋友或者部署到远程云服务器上
- 首先需要配置相关的运行环境,例如数据库、web服务器
- 还不一定能运行,因为别人可能用的是完全不同的操作系统,就算是Linux系统,也会因为不同的发行版本而导致运行环境不同
- 为了模拟完全相同的本地开发环境,自然会想到使用虚拟机,但是虚拟机需要模拟硬件,还需要包含操作系统,不仅体积臃肿内存占用高
- docker不去模拟底层的硬件,建立在操作系统之上,只为每一个应用提供完全隔离的运行环境(container)
基本概念
Image 镜像
- Image镜像:类似于虚拟机的快照,里面包含了要部署的应用程序和所关联的所有库
- Docker的Image镜像是一个特殊的文件系统
Container 容器
- 通过镜像,可以创建多个不同的container容器
- 这里的容器就像是一台台运行起来的虚拟机,里面运行了应用程序
- 每一个容器是独立运行的,container容器之间互不影响
- 镜像Image和容器Container的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体
Dockerfile 自动化脚本
Dockerfile类似于一种自动化脚本,主要被用来创建之前讲到的镜像
过程好比在虚拟机中安装操作系统和软件一样
在docker hub中引入基础镜像、环境,使用FROM命令
FROM python:3.8-slim-buster # FROM 应用:版本(tag)
指定所有Docker命令的工作路径
WORKDIR /app
使用COPY命令将所有的程序拷贝到Docker镜像中,**.** 代表根目录下的所有文件,第二个参数代表Docker镜像中的路径
COPY . . COPY <本地路径> <目标路径>
RUN允许在创建镜像时运行任意的shell命令
RUN pip install -r xxx
CMD指定当Docker容器运行起来以后要执行的命令(镜像是静态的定义,容器是程序运行的实体)
CMD ['python3',"app.py"]
仓库
- 镜像构建完成后,可以很容易地在宿主机上运行
- 但是,如果需要在其它服务器上使用这个镜像,我们需要集中的存储、分发镜像的服务
- 标签:把版本信息,如果不用如下格式指定版本(标签),将以latest作为默认标签
操作命令实战
面向单个容器
创建镜像
docker build -t 镜像的名字 目录
启动容器,-p参数会将容器上的某一个端口,映射到你的本地主机上,容器端口:映射主机端口
docker run -p 80:5000 -d my-finance
可以使用DockerDesktop来可视化地查看应用在后台的输出,与各种容器的信息
volume卷用来永久保存数据
对镜像的拉取查看等操作
```bash
docker pull nginx:1.20.1 #拉包,镜像名:版本名(标签)
docker images #查看所有的镜像
docker rmi 镜像名:版本号 # 删除镜像9. 对容器的运行、修改映射端口等操作 ```bash docker run #镜像启动 docker run --name=mynginx -d --restart=always -p 80:80 nginx docker ps #查看正在运行的容器 docker ps -a docker rm 容器id #删除停止的容器 docker rm -f mynginx docker stop 容器id #停止容器 docker start 容器id # 再次启动 docker update 容器id --restart=always #应用开机自启
修改容器内容
# 进入容器内部修改 docker exec -it 容器id /bin/bash # 挂载数据到外部修改 docker run --name=mynginx -d --restart=always -p 80:80 -v /data/html:/usr/share/nginx/html:ro nginx
提交改变,将自己修改好的镜像提交
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] docker commit -a "leifengyang" -m "首页变化" 341d81f7504f guignginx:v1.0
docker-compose工具
docker compose up # 用于启动应用程序的服务,如果在命令中不带任何参数,将根据docker-compose.yml文件启动所有服务
docker compose up service1 service2 #启动某个服务,可以在命令后面指定服务名
docker compose down # 停止应用程序的服务,并移除关联的网络和容器
docker-compose build: 这个命令用于构建应用程序的服务,根据 docker-compose.yml 中定义的配置。它会构建每个服务的 Docker 镜像,以便后续的 docker-compose up 命令可以使用。例如:docker-compose build
docker-compose start: 这个命令用于启动已经停止的服务,但不会重新构建它们。例如:docker-compose start
docker-compose stop: 这个命令用于停止正在运行的服务,但不会移除相关的容器或网络。例如:docker-compose stop
docker-compose restart: 这个命令用于重启正在运行的服务,等同于执行 docker-compose stop 和 docker-compose start。例如:docker-compose restart
docker-compose ps: 这个命令用于列出所有由 docker-compose.yml 文件定义的服务,并显示它们的状态。例如:docker-compose ps
docker-compose logs: 这个命令用于查看服务的日志输出。可以使用 -f 选项来实时查看日志。例如:docker-compose logs -f
docker-compose exec: 这个命令用于在服务的容器中执行命令。可以使用该命令连接到正在运行的服务,并在其中执行特定的命令。例如:docker-compose exec service_name command
docker-compose down --volumes: 在执行 docker-compose down 时,使用 --volumes 选项可以移除关联的数据卷。这将会移除所有由 docker-compose 创建的数据卷。
面向多个容器,多个容器共同协作
- 比如:使用一个容器来部署web应用,另一个容器运行数据库系统
- 容器2中的数据库系统为容器1中的web应用提供数据,做到数据与应用逻辑的有效分离
- 比如当web应用宕机了,数据库仍然在有效运转
- Kubernetes将各个容器分发到一个集群cluster上运行,做到负载均衡
Kubernetes
K8s最精简的定义
- K8s 为你提供了一个 可弹性运行的分布式系统框架(平台),K8s会满足你的扩展要求、故障转移、部署模式等
K8s的架构
Kubernetes Cluster = N Master Node + N Worker Node
N个主节点+N个工作节点 N>=1
组件架构
Control Plane Components 控制平面组件 CPC
- 控制平面组件对集群做出全局决策,比如调度,以及检测和响应集群事件
- 相当于Hadoop的Master节点
- 若干个Node节点需要相互协调才能做到负载均衡和故障转移,这就需要一台中心计算机来集中管理
- 会实时监测节点的网络状态来平衡服务器的负载
Node组件
- K8s管理着一系列的主机或服务器,这些服务器称为节点Node,Node是多个容器(Pod)的集合
- 每个节点运行着若干个相互独立的Pod,Pod是K8s中可以部署的最小执行单元
- 这么多的Pod需要相互协调才能做到负载均衡和状态转移
- 节点组件在每个节点上运行,维护运行的Pod并提供K8s运行环境
kubeadm创建集群
Replica Set 副本集合
- 当K8s发现某个容器或者Pod挂掉了,会立刻启用在后台预先准备好的、随时待命的备用容器来替换
K8s操作实战
deployment.yaml
- Docker中,自动化部署脚本文件是dockerfile
- K8s中,自动化部署脚本文件是deployment.yaml
- 内部定义了里面的Pod、里面运行了哪些容器、网络配置等
通信
- 在默认情况下,我们的Pod只能与同一个Cluster集群中的其它Pod进行通信
- 虽然每个Pod都有一个独立的IP,但是这个IP地址对于外网来说是不可见的
- 如果要从外网中访问我们的Pod,就需要K8s中另一个组件:服务Service
NodePort
- NodePort是原始的将应用端口暴露给外网的方式
Kubectl部署应用
Kubectl是一个全平台通用的工具
使用kubectl apply 来部署我们的应用
kubectl apply -f deployment.yaml
使用kubectl get pods来获取所有pod的运行状态
使用kubectl get services来获取之前定义的services服务
具体操作还请见转载博客
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 h3110w0r1d's Blog!