HCIE
HCS部署流程
-
机器上架,物理连线
-
安装Huawei Cloud Stack Deploy(物理机器安装,也可以virtalbox,此处使用物理服务器安装)以前叫FCD(FusionCloud Deploy),现在叫HCSD(Huawei Cloud Stack Deploy)
-
配置交换机
- 前期可以只做交换机堆叠配置,交换机堆叠有专业的堆叠线缆,有40GE、100GE的;两交换机之间有高速的数据往来,堆叠之后可以把两台交换机看做一台交换机,类似于LACP(链路聚合:把两个网卡聚合在一起)
- 配置telnet
- 放行External_OM平面
-
配置Huawei Cloud Stack Deploy
- 配置external_om平面vlan,执行脚本,测试网络通讯
- 核对工程信息
- 校验云服务插件包
- 配置工程参数
- 安装前检查
- 上传和检验软件包
- 安装组件
-
第四步的具体流程
-
物理连线,参照《交换机物理接口规划表》
- 每台服务器(BMC)都有一个接口连接交换机,运行的TCP/IP协议
- BMC接口是电口,所以BMC接口可以光转电,接交换机(华为SmartKit工具可以批量修改BMC的IP)
-
控制节点一般来说有三个平面;管理平面、业务平面、存储平面;共六块网卡,实现两两冗余
- 存储平面走的是IP-SAN,控制节点的存储平面用来连接分布式存储,需要单独的存储平面来实现
-
0:是BMC的板载网卡;0.1的0是插槽号(solt),1是接口号,代表0号插槽的1号口;分别连接交换机的管理口
- 主板自带的插槽,接口编号从左到右,分别是0和1
- 额外配置的插槽,编号从右到左,分别是0和1
- 板载网卡和额外加的网卡不能绑定,因为两种网卡的接口不一样,如果额外增加的网卡的接口和板载网卡的接口一样,那么就可以把板载网卡和额外增加的网卡绑定在一起
Huawei 2288X V5服务器(https://info.support.huawei.com/computing/server3D/res/server/2288xv5vc/index.html?lang=cn)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyc0KR0j-1687697841352)(Img/image-20230608153934162.png)]
- 业务流量和管理流量
- 业务流量:虚拟机的通信
- 管理流量:Neutron组件、nova组件、cinder组件等组件间的通信
-
部署过程中,Deploy工程会先安装第一台控制节点,称为first node,该节点配置为PXE服务器节点,通过该节点,使用PXE安装其他节点(控制节点、计算节点、网络节点等)
2023-06-03 AM 01:29:49
-
Docker
Docker原理及其安装
-
Docker出现的契机
- 传统数据中心:业务都运行在物理机器上
- 传统数据中心缺点
- 物理机器开机慢
- 资源浪费
- Docker优点
- 只需要用户态的内容,不需要内核态的内容
- 运行速度快
- 至此,Docker横空出世
-
Docker VS VMware
特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 -
什么是容器
- 容器就是将软件打包成标准化单元,以用于开发、交付和部署
- 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行
- 开发人员在自己电脑上创建并测试好的容器,无序任何修改就能够在生产系统的虚拟机、物理服务器及公有云上运行
- 容器赋予了软件独立性,使其免受外在环境差异的影响
- Docker是基于容器技术的轻量级虚拟化解决方案
-
为什么需要容器
- 容器使软件具备了超强的可移植能力
-
Docker不等于容器,Docker只是实现容器的一种解决方案,类似于云计算不等于openstack,openstack只是实现云计算的一种解决方案最为知名
-
红帽实现容器是使用的Podman
-
华为实现容器是使用的Containerd
-
K8S的由来
- Docker最早做容器,想要一家独大,垄断业内,研发出Docker Compose(容器调度解决方案),Google为了防止此类事情发生,研发出Kubernetes(K8S,也是容器调度解决方案)
-
Docker的特性
- 标准化
- 保证一致的运行环境
- 弹性伸缩,快速扩容
- 方便迁移
- 持续集成、持续交付与持续部署
- 高性能
- 不需要进行硬件虚拟以及运行完整的操作系统
- 轻量级
- 快速启动
- 只有用户空间,没有内核空间
- 隔离性
- 进程隔离
- 容器为任务而生,没有任务的容器就不应该运行
- 标准化
-
Docker核心组件
- Docker客户端——Docker
- Docker服务端——Docker Daemon
- Docker镜像——Tmage
- Docker容器——Docker Container
- Docker镜像仓库——Registry
Dockerhub镜像仓库(https://hub.docker.com/)
aliyun镜像站(https://developer.aliyun.com/)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-36Y6LQ8H-1687697841354)(Img/whco6gkixor4i_65425d5865854d83a6dc2c4d33869ef9.png)]
docker build # 构建镜像
docker pull # 在客户端执行docker pull会把镜像仓库Registry内的镜像拉取到本地
docker run # 运行镜像
CentOS安装Docker教程
- 参考文档(https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.2ba01b11RUot9S)
[root@CentOSteam8 ~]# free -m # 查看内存,有4G就可以
total used free shared buff/cache available
Mem: 3896 644 2769 11 483 3009
Swap: 499 0 499
[root@CentOSteam8 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装必要的一些系统工具
# 添加软件源信息
[root@CentOSteam8 ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@CentOSteam8 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 开启缓存,可有可无
[root@CentOSteam8 ~]# yum makecache timer
Metadata cache refreshed recently.
# 安装docker-ce
[root@CentOSteam8 ~]# yum -y install --allowerasing docker-ce
# 启动docker服务
[root@CentOSteam8 ~]# systemctl enable docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@CentOSteam8 ~]# systemctl restart docker.service
[root@CentOSteam8 ~]# systemctl is-active docker.service
active
# 查询docker版本
[root@CentOSteam8 ~]# docker -v
Docker version 24.0.2, build cb74dfc
[root@CentOSteam8 ~]# docker version
Client: Docker Engine - Community
Version: 24.0.2
API version: 1.43
Go version: go1.20.4
Git commit: cb74dfc
Built: Thu May 25 21:53:10 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.2
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Git commit: 659604f
Built: Thu May 25 21:52:10 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker镜像加速器配置
华为镜像加速器网址(https://console.huaweicloud.com/swr/?agencyId=0c7d0e9afb00f2dc1febc006187d8873®ion=cn-north-4&locale=zh-cn#/swr/mirror)在镜像中心右上角
# 把加速器地址写入docker
[root@CentOSteam8 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [ "https://0c7d0e9a1080259e0fe4c006b76df820.mirror.swr.myhuaweicloud.com" ]
}
[root@CentOSteam8 ~]# systemctl restart docker.service
[root@CentOSteam8 ~]# docker info | grep -A 1 'Registry Mirrors'
Registry Mirrors:
https://0c7d0e9a1080259e0fe4c006b76df820.mirror.swr.myhuaweicloud.com/
Docker容器管理
# 下载nginx镜像,不指定版本的话就是最终版本
[root@CentOSteam8 ~]# docker pull nginx
# 下载mysql镜像,指定版本5.6
[root@CentOS ~]# docker pull mysql:5.6
# 查询镜像
[root@CentOSteam8 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest eb4a57159180 3 days ago 187MB
# 创建容器
[root@CentOSteam8 ~]# docker create --name web01 nginx
017702126da4e1c3e4a29f49b38fa3f5bd2032c8a316f36625a6a2009e2e5723
# 列出所有容器
[root@CentOSteam8 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
017702126da4 nginx "/docker-entrypoint.…" About a minute ago Created web01
# 运行容器
[root@CentOSteam8 ~]# docker start 017702126da4
017702126da4
#容器已经运行,并且监听的是80端口
[root@CentOSteam8 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
017702126da4 nginx "/docker-entrypoint.…" 2 minutes ago Up 9 seconds 80/tcp web01
# 访问容器,默认使用的是宿主机的IP的80端口,在浏览器中输入IP和端口访问
# 删除容器
[root@CentOSteam8 ~]# docker rm -f 017702126da4
017702126da4
# 删除镜像
# ※:注意,在删除镜像之前先删除容器
[root@CentOS ~]# docker rmi -f ae1328b946d1
Deleted: sha256:ae1328b946d1a825337fc8eeafde5450be58322872997d7fe52f948dd02dd801
Deleted: sha256:ba1870a9436cb85443810fdbed695ffa7960b4e0329495b1c2dbc69fba1fa4a8
# 创建并运行容器
[root@CentOSteam8 ~]# docker run -d -p 8080:80 --name web01 nginx
9ee522d76dc5e66479ca67d697eb67cf0194a66860dd7aa072d6ec6b749f6275
-d:放在后台运行
-p:指定端口映射
-P:随机端口映射
–name:容器名称
nginx:部署容器用到的镜像
# 下载httpd服务,并且创建并运行web02
[root@CentOSteam8 ~]# docker run -d -p 80:80 --name web02 httpd
# 查看容器路径,只有容器在运行的时候才能看到
[root@CentOS merged]# df -h
overlay 30G 5.7G 25G 19% /var/lib/docker/overlay2/b16e7ea95c7ce1514118001c39e6ea7f9485ac6c40bd648ff29c32cf6259ec90/merged
# 查询容器在本机的位置
[root@CentOS lib]# docker inspect 51de133091a6 | grep 51de133091a6
# 查看内存信息
[root@CentOS merged]# free -m
total used free shared buff/cache available
Mem: 1950 1115 113 11 721 675
Swap: 4095 24 4071
[root@CentOS merged]# cat /proc/meminfo
# 实时查看容器的资源使用情况
[root@CentOSteam8 ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9ee522d76dc5 web01 0.00% 8.605MiB / 3.805GiB 0.22% 5.78kB / 0B 13.9MB / 0B 6
#查看单个容器(ID)
docker stats 7c3e162bef49
#查看单个容器(名称)资源使用情况
docker stats name
#查看多个容器资源使用情况
docker stats xxx xxx
CONTAINER ID:容器ID
NAME:容器名称
CPU %:容器使用的主机 CPU百分比
MEM USAGE / LIMIT:容器使用的总内存、以及允许使用的内存总量
MEM %:容器所使用的内存百分比
NET I/O:容器通过网络接口接收和发送的数据量
BLOCK I/O:容器从主机上的块设备写入和的读取数据量
PIDS:容器创建的进程或线程数
- 进入容器
# 进入容器交互;-i:;-t:terminal(终端);
[root@CentOS ~]# docker exec -it 7a849e10ca1e /bin/bash
root@7a849e10ca1e:/#
-i:在前台运行
-d:在后台运行
-t:tty,控制台
/bin/bash:开启一个新的环境变量
root@7a849e10ca1e:~# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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>
# 退出容器
root@7a849e10ca1e:~# exit
exit
- 对容器内内容进行修改
- 容器没有内核,只有用户空间,因此很多命令都没有
- 可以把容器内文件拷贝到外部进行更改后再拷贝回去
# 把容器内文件拷贝出来
[root@CentOS ~]# docker cp 7a849e10ca1e:/usr/share/nginx/html/index.html ./
Successfully copied 2.56kB to /root/./
# 修改文件内容
[root@CentOS ~]# echo "hello Docker" > index.html
# 把修改后的内容拷贝回去
[root@CentOS ~]# docker cp ./index.html 7a849e10ca1e:/usr/share/nginx/html/index.html
Successfully copied 2.05kB to 7a849e10ca1e:/usr/share/nginx/html/index.html
- 容器内组件下载
- 一般从镜像站下载下来的镜像基本都是Ubuntu系统
- Ubuntu系统对容器支持好,所以业内对Ubuntu做容器的更多一些
- 容器寻找文件可以使用find命令,find / -name index.html
Docker部署MySQL数据库
[root@CentOS ~]# docker run -p 3366:3306 --name mysql --restart=always --privileged=true \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=redhat -d mysql:5.6
-p 3366:3306:指定宿主机端口3366与容器端口3306映射关系
–name mysql:创建的容器名称
–restart=always:总是跟随docker启动
–privileged=true:获取宿主机root权限
-v /usr/local/mysql/log:/var/log/mysql:映射日志目录,宿主机:容器
-v /usr/local/mysql/data:/var/lib/mysql:映射数据目录,宿主机:容器
-v /usr/local/mysql/conf:/etc/mysql:映射配置目录,宿主机:容器
-v /etc/localtime:/etc/localtime:ro:让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读
-e MYSQL_ROOT_PASSWORD=123456:指定mysql环境变量,root用户的密码为redhat
-d mysql:5.6:后台运行mysql容器,版本是5.6
# 在容器外部访问容器内MySQL数据库
# 1.先在外部安装MySQL数据库客户端,红帽7及以后的版本叫mariadb
[root@CentOS ~]# yum list | grep mariadb # 查询MySQL数据库客户端
mariadb.x86_64 3:10.3.27-3.module_el8.3.0+599+c587b2e7 AppStream
[root@CentOS ~]# yum -y install mariadb.x86_64 # 安装MySQL数据库客户端
# 进入容器内的数据库
[root@CentOS ~]# mysql -u root -p -h 192.168.8.68 -P 3366
Enter password:
# 在容器内直接进入数据库
root@49bebcc8330f:/# mysql -u root -p
Enter password:
-h:用来指定主机名
-P:用来指定数据库端口,默认是3306
# 查看数据库日志;貌似没什么用
[root@CentOS ~]# docker logs -f -n 10 49bebcc8330f
# 容器为任务而生,没有任务的容器不应该运行;command记录了容器的后台脚本,该脚本能保证容器一直在运行
[root@CentOS ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49bebcc8330f mysql:5.7 "docker-entrypoint.s…" 2 hours ago Exited (0) About an hour ago mysql
51de133091a6 httpd "httpd-foreground" 47 hours ago Up 13 minutes 0.0.0.0:2020->80/tcp, :::2020->80/tcp web02
7a849e10ca1e nginx "/docker-entrypoint.…" 47 hours ago Exited (0) 2 hours ago web01
# 查看脚本内容
root@51de133091a6:~# cat /usr/local/bin/httpd-foreground
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND "$@"
Docker资源管理
# 后面加上一个&符号代表在后台运行,此时前台不会被占用
[root@CentOS ~]# rm -f index.html &
[3] 124212
# $()代表引用命令执行的结果
# 结束所有的容器:docker stop $(docker ps -aq)
# 删除所有的容器:docker rm -f $(docker ps -aq)
[root@CentOS ~]# docker stop $(docker ps -aq)
49bebcc8330f
51de133091a6
7a849e10ca1e
-
容器不适合的业务场景
- 容器的隔离性不如虚拟机,毕竟容器使用的是同一个内核,所以对安全性要求高的业务不适合运行在容器内
- 对内核有要求的业务不适合运行在容器内
- windows上面的业务不适合运行在容器内
-
容器用到两种技术
- namespace:资源隔离
- cgroup:Controller Group资源控制
-
为什么要限制资源
- 一个主机运行若干个容器,每个容器都需要cpu、内存、IO等资源
- 对于虚拟化技术,用户可以控制分配多少的cpu及内存资源给每个虚拟机
- docker也提供类似的技术,以避免因为单个容器占用过多资源而影响到所有其他容器乃至整个宿主机的性能
-
内存资源限制
[root@CentOS ~]# docker run -it -m 200M --memory-swap 300M --name web03 httpd
[root@CentOS ~]# docker run -it -m 200M --name test02 --memory-swappiness 50 --memory-swap 300M progrium/stress --vm 1 --vm-bytes 280M
progrium/stress:一个压力测试的镜像
-m:允许分配的内存大小
–memory-swap:允许分配的内存和swap的总大小
–memory-swapiness:控制内存与swap置换的比例,取值范围0~100,0代表不使用swap只使用内存,100代表不使用内存,只使用swap
–vm:设置内存工作线程数
–vm-bytes:设置单个内存工作线程使用的内存大小
# 有做资源限制的容器
[root@CentOS ~]# docker inspect 96bca9086f5b | grep -i memory
"Memory": 209715200,
"MemoryReservation": 0,
"MemorySwap": 314572800,
"MemorySwappiness": 0,
# 未作内存限制的容器
[root@CentOS ~]# docker inspect 51de133091a6 | grep -i memory
"Memory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
- cpu资源限制
- cpu不能像内存那样限制多少赫兹,只能限制cpu的时间片,设置使用权重,权重越高使用的cpu的资源就越多,就能得到更多的时间片,默认权重1024,权重范围是2~262144
[root@CentOS ~]# docker run --name test03 -c 1024 progrium/stress --cpu 1
-c:设置容器使用cpu的权重
–cpu:设置cpu工作线程的数量
- bps和iops限制
- bps:byte per second,每秒读写的数据量;每秒钟读写的带宽
- iops:io per second,每秒的10次数;每秒钟处理的IO的数量
[root@CentOS ~]# docker run -it --device-write-bps /dev/sda:30MB centos:7
–device-read-bps:限制读某个设备的bps
–device-write-bps:限制写某个设备的bps
–device-read-iops:限制某个设备的iops
–device-write-iops:限制写某个设备的iops
Docker存储管理
-
Linux文件系统简介
- Linux文件系统由bootfs(启动分区)和rootfs(根分区)组成。
- bootfs主要包含bootloader(引导程序)和kernel(内核),bootloader主要是引导加载kernel,当kernel被加载到内存之后bootfs就被卸载掉了。
- rootfs包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录
-
Docker文件系统简介
- 写时复制(CoW)
- 即Copy-on-Write,表示只在需要写时才去复制,针对已有文件的修改场景
- 多个容器使用同一个镜像时,并不会为每个容器分配一个image一样的文件系统,所有数据都是从image读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改
- 用时复制(AoD)
- 即Allocate on Demand,表示在使用时才分配存储空间,针对写入新文件的场景
- 启动一个容器,并不会为这个容器预分配存储空间,而是当有新文件写入时才按需分配空间
- 写时复制(CoW)
-
Docker保存位置
# 查看docker保存在本机的位置
[root@CentOS ~]# docker inspect busybox
···
"Data": {
"LowerDir": "/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d-init/diff:/var/lib/docker/overlay2/776eb1ee4815e68c13db630b07c9fd68b5e27e3fcd863d4b709c6b55617c6505/diff",
"MergedDir": "/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/merged",
"UpperDir": "/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/diff",
"WorkDir": "/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/work"
},
···
LowerDir:镜像文件所在位置
UpperDir:修改文件保存的位置,把要修改的文件从镜像里面复制出来保存在这里
MergedDir:看到的内容,指针指向LowerDir和UpperDir(有改动的话),实际不占空间
WorkDir:对用户不可见,底层工作时的临时目录
2023-06-17-AM 01:14:00
6505/diff",
“MergedDir”: “/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/merged”,
“UpperDir”: “/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/diff”,
“WorkDir”: “/var/lib/docker/overlay2/bf24eae4ae40c2a227bdcb7c2d90277406a71665b707939ed646e3900118c48d/work”
},
···
> LowerDir:镜像文件所在位置
>
> UpperDir:修改文件保存的位置,把要修改的文件从镜像里面复制出来保存在这里
>
> MergedDir:看到的内容,指针指向LowerDir和UpperDir(有改动的话),实际不占空间
>
> WorkDir:对用户不可见,底层工作时的临时目录
2023-06-17-AM 01:14:00
### Docker网络管理