使用CCI部署静态Web应用
本节通过在云容器实例上部署一个名称为2048的静态Web游戏应用为例,帮助您学习如何使用云容器实例。
您将按以下流程学习如何使用云容器实例。
操作流程
操作步骤 |
说明 |
---|---|
|
|
将应用构建镜像并上传镜像仓库,便于在云容器实例创建负载时,拉取上传的镜像。 |
|
您需要在CCI服务中创建一个命名空间,便于项目管理。 |
|
配置基本信息和访问信息。 |
|
通过公网IP去访问创建好的负载。 |
|
如果您在完成实践后不需要继续使用CCI,请及时清理资源以免产生额外扣费。 |
准备工作
- 在开始操作前,请您先注册华为账号,详情请参见注册华为账号并开通华为云。
- 您可以通过控制台或使用ccictl工具部署静态Web应用,如果使用ccictl工具,请下载并配置ccictl工具,具体操作步骤请参考ccictl配置指南。
安装容器引擎
上传镜像前,您需要安装容器引擎,如果您已经安装了容器引擎,请确保容器引擎为1.11.2及以上版本。
- 参考购买弹性云服务器创建一台带有公网IP地址的Linux弹性云服务器。
作为演示,弹性云服务器和公网IP的规格不需要太高,例如弹性云服务器的规格为“1vCPUs | 2GiB”、公网IP带宽为“1 Mbit/s”即可,操作系统请选择“CentOS 8.2”。
您也可以使用其他机器安装容器引擎,不创建弹性云服务器。
- 返回弹性云服务器列表,单击“远程登录”登录购买的弹性云服务器。
- 使用如下命令快速安装容器引擎。
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh sudo systemctl daemon-reload sudo systemctl restart docker
构建镜像
此处以如何使用Dockerfile,并使用nginx为基础镜像构建镜像2048为例。在构建镜像之前,需要先创建Dockerfile文件。
- 从镜像仓库拉取nginx镜像,作为基础镜像:
docker pull nginx
- 下载2048静态页面应用:
git clone https://gitee.com/jorgensen/2048.git
- 构建Dockerfile。
- 输入命令:
vi Dockerfile
- 编辑Dockerfile文件内容:
FROM nginx MAINTAINER Allen.Li@gmail.com COPY 2048 /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
- nginx为基础镜像,基础镜像可根据创建的应用类型进行选择,例如创建的是Java应用,基础镜像可选择Java镜像。
- /usr/share/nginx/html为nginx存放Web静态页面的路径。
- 80为容器端口。
- 输入命令:
- 构建镜像2048。
- 输入命令:
docker build -t='2048' .
创建镜像成功,如下图:
图1 成功构建镜像
- 查询镜像:
docker images
显示如下图,说明镜像构建成功:
图2 查询镜像
- 输入命令:
上传镜像
- 连接容器镜像服务。
- 登录管理控制台,展开“服务列表”,选择“容器服务 > 容器镜像服务”。
- 在左侧菜单栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击
复制登录指令。
- 在安装容器引擎的机器中执行上一步复制的登录指令。
- 上传镜像。
- 在安装容器引擎的机器给2048镜像打标签。
docker tag [镜像名称:版本名称] [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
样例如下:
docker tag 2048:latest {Image repository address}/cloud-develop/2048:latest
其中:
- {Image repository address}为容器镜像服务的镜像仓库地址。
- cloud-develop为镜像的组织名称。
- 2048:latest为镜像名称和版本号。
- 上传镜像至镜像仓库。
docker push [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
样例如下:
docker push {Image repository address}/cloud-develop/2048:latest
终端显示如下信息,表明上传镜像成功。
6d6b9812c8ae: Pushed 695da0025de6: Pushed fe4c16cbf7a4: Pushed v1: digest: sha256:eb7e3bbd8e3040efa71d9c2cacfa12a8e39c6b2ccd15eac12bdc49e0b66cee63 size: 948
返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
- 在安装容器引擎的机器给2048镜像打标签。
步骤二:创建命名空间
- 通过控制台中创建命名空间webapp。
- 登录云容器实例 CCI2.0控制台。
- 左侧导航栏中选择“命名空间”。
- 进入命名空间页面,单击右侧“创建命名空间”。
- 填写命名空间名称。
- 命名空间名称在云容器实例中需全局唯一。
- 请输入1到63个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母或数字开头,小写英文字母或数字结尾。
- 监控配置(可选)。
参数
说明
对接AOM(可选)
开启后可选择对接AOM实例。
- 网络平面配置。
表1 网络平面配置 参数
说明
启用IPv6
开启后支持ipv4/ipv6双栈协议网络。
虚拟私有云
选择云容器实例所在的虚拟私有云VPC,如果没有可选项可以单击右侧“新建虚拟私有云”创建。创建后不可修改。
建议使用网段:10.0.0.0/8~22,172.16.0.0/12~22,192.168.0.0/16~22。
须知:- 此处VPC和子网的网段不能为10.247.0.0/16,10.247.0.0/16是云容器实例预留给负载访问的网段。如果您使用此网段,后续可能会造成IP冲突,导致负载无法创建或服务不可用;如果您不需要通过负载访问,而是直接访问Pod,则可以使用此网段。
- 命名空间创建完成后,在“命名空间 > 子网”中可查看到VPC和子网信息。
子网
选择子网,如果没有可选项可以单击右侧“新建子网”创建。创建后子网不可修改。
- 创建的namespace会在设置的子网中预热部分IP,默认个数为10个。
- 在高级设置中可以设置预热的个数。
- 创建namespace后,由于预热了部分IP,会影响设置的subnet和VPC的删除,需要删除namespace之后才能正常删除对应的subnet和VPC。
说明:您需要关注子网的可用IP数,确保有足够数量的可用IP,如果没有可用IP,则会导致负载创建失败。
安全组
选择已有安全组作为该命名空间下安全组,如果没有可选项可以单击右侧“创建安全组”创建。创建后不可修改。
- 高级设置(可选)。
每个命名空间下都提供了一个IP池,申请IP需要一段时间,如果需要快速创建负载,减少IP的申请时间,可通过自定义资源池大小来实现。
例如,某业务线日常的负载数为200,当达到流量高峰时,IP资源池会自动扩容,瞬间将IP资源池扩容到65535(IP资源池大小),同时会在回收间隔23h(IP资源池回收间隔)之后,进行回收超过资源池大小的部分即(65535-200=65335)个。
表2 高级设置(可选) 参数
说明
预热 IP 资源池大小(个)
- 为每个命名空间预热一个 IP 池,用来加速容器组创建。
- 预热IP资源池的大小不能超过65535个。
- 使用通用型pod规格时,建议根据业务配置合理的预热IP资源池大小,以加快负载启动速度。
- 请合理配置预热IP数量,如配置IP数量过大,可能出现预热IP资源池大于子网可用IP数,导致子网IP被耗尽,进而影响用户使用其他服务。
预热 IP 资源池回收间隔(h)
IP 资源池弹性扩容出来的空闲 IP 资源,在一定时间内可进行回收。
说明:网卡回收机制:
- 回收时间要求:根据network上配置的 yangtse.io/warm-pool-recycle-interval(单位小时)时间,控制该网卡是否能够完成回收。如 yangtse.io/warm-pool-recycle-interval 配置为 24,则回收的网卡必须已经申请了超过24小时后才会被回收。
- 回收速率:内部维持一个合理的速率,按照每次最多50个网卡的速率进行回收,避免回收过快或频繁回收导致网卡的重复创建和删除动作。
- 单击“确定”。
创建完成后,可以在命名空间详情中看到VPC、子网等信息。
- 通过ccictl工具创建命名空间webapp和对应的网络,完成工具配置后执行以下步骤:
- 创建命名空间:
ccictl create namespace webapp
- 创建命名空间对应的网络,yaml示例如下:
apiVersion: yangtse/v2 kind: Network metadata: annotations: yangtse.io/domain-id: <domain_id> # 账号ID yangtse.io/project-id: <project_id> # 项目ID name: cci-network namespace: webapp spec: networkType: underlay_neutron securityGroups: - <security_group_id> # 安全组ID subnets: - subnetID: <subnet_id> # 子网ID
步骤三:创建容器组
在创建容器组前,需要使用VPCEP将您命名空间的网络与华为云其他服务后端网络连通,请参考购买云服务VPCEP章节进行操作。创建VPCEP之后,您可参考以下方式创建容器组:
- 通过控制台创建容器组:
- 登录云容器实例 CCI2.0控制台。
- 左侧导航栏中选择“负载管理”,单击右侧“容器组”,再单击“YAML创建”。
- 添加基本信息,yaml示例如下:
apiVersion: cci/v2 kind: Pod metadata: labels: app: webapp-2048 name: webapp-2048 namespace: webapp spec: containers: - image: {Image repository address}/cloud-develop/2048:latest # 上传的镜像 name: webapp-2048 ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m memory: 1Gi requests: cpu: 500m memory: 1Gi dnsPolicy: Default
- 通过ccictl工具创建容器组。将上述yaml保存为pod.yaml并执行以下命令:
ccictl apply -f pod.yaml
步骤四:访问容器组
- 通过控制台配置服务访问容器组:
- 左侧导航栏中选择“服务管理”,再单击右侧“YAML创建”。
- 创建Load Balancer类型的服务,使用的ELB需包含公网IP,yaml示例如下:
kind: Service apiVersion: cci/v2 metadata: name: service-2048 namespace: webapp annotations: kubernetes.io/elb.class: elb kubernetes.io/elb.id: <elb_id> # 使用的ELB需要包含公网IP spec: ports: - name: service-port protocol: TCP port: 80 targetPort: 80 selector: app: webapp-2048 type: LoadBalancer
- 左侧导航栏中选择“服务管理”,再单击右侧“YAML创建”。
- 通过ccictl配置服务。保存上述yaml为service.yaml并执行命令:
ccictl apply -f service.yaml
容器组和服务创建成功后,您可以使用浏览器通过 http://<公网IP>/2048/index.html 访问您的Web应用。
步骤五:清理资源
- 使用云容器实例管理控制台,执行以下清理CCI服务资源:
- 登录云容器实例 CCI2.0控制台。
- 左侧导航栏中选择“负载管理 > 容器组”。
- 选择需要删除的容器组,在对应容器组右侧操作列单击“删除”。
如需删除CCI服务所绑定的ELB,请前往云容器实例 CCI2.0控制台先删除“网络管理”中所创建的服务,然后前往弹性负载均衡控制台删除弹性负载均衡。
- 使用ccictl,执行如下命令清理CCI服务资源:
ccictl delete -f service.yaml ccictl delete -f pod.yaml ccictl delete namespace webapp