云环境下的容器管理与应用部署
1. 启动 Wordpress 容器
启动 Wordpress 容器后,需要使用标签打开防火墙。以下是相关信息和操作步骤:
1.1 容器信息
| POD | IP | CONTAINER(S) | IMAGE(S) | HOST | LABELS | S |
|---|---|---|---|---|---|---|
| wordpress | 10.188.0.5 | wordpress | tutum/wordpress | k8s - cook - node - 1.c… | name = wordpress | P |
1.2 打开防火墙
使用以下命令创建防火墙规则:
$ gcloud compute firewall - rules create wordpress - 80 --allow tcp:80 \
--target - tags k8s - cook - node
创建后的防火墙规则信息如下:
| NAME | NETWORK | SRC_RANGES | RULES | SRC_TAGS | TARGET_TAGS |
| — | — | — | — | — | — |
| wordpress - 80 | default | 0.0.0.0/0 | tcp:80 | | k8s - cook - node |
完成上述操作后,就可以使用 Wordpress 了。
2. 使用 kubecfg 管理 Google 容器引擎资源
2.1 问题与解决方案
如果你已经通过 Google 容器引擎服务创建了 Kubernetes 集群,并且想使用默认的 kubecfg CLI 来创建 Pod、服务和复制控制器,可以按照以下步骤操作:
1. 启动 Kubernetes 集群:
$ gcloud preview container clusters create cookbook --num - nodes 2 \
--machine - type g1 - small
- 列出实例:
$ gcloud compute instances list
输出结果示例:
| NAME | ZONE | MACHINE_TYPE | INTERNAL_IP | EXTERNAL_IP | STATUS |
| — | — | — | — | — | — |
| k8s - cookbook - node - 2 | us - central1 - a | g1 - small | 10.240.222.210 | 104.154.39.165 | RUNNING |
| k8s - cookbook - node - 1 | us - central1 - a | g1 - small | 10.240.240.234 | 130.211.170.38 | RUNNING |
| k8s - cookbook - master | us - central1 - a | g1 - small | 10.240.154.207 | 130.211.115.17 | RUNNING |
3. 通过 SSH 连接到主节点:
$ gcloud compute ssh k8s - cookbook - master --zone us - central1 - a
- 检查 kubecfg 路径:
sebastiengoasguen@k8s - cookbook - master:~$ which kubecfg
/usr/local/bin/kubecfg
2.2 kubecfg 的使用
kubecfg CLI 可用于管理 Kubernetes 集群中的所有资源,其基本用法如下:
Usage: kubecfg - h [- c config/file.json|url|-] <method>
Kubernetes REST API:
kubecfg [OPTIONS] get|list|create|delete|update \
<events|minions|nodes|pods|replicationControllers|services>[/<id>]
2.3 启动 Pod
要启动一个 Pod,需要在 YAML 或 JSON 文件中定义它。以下是一个使用 Kubernetes v1beta2 API 版本的 JSON 文件示例,用于启动 Nginx:
{
"id": "nginx",
"kind": "Pod",
"apiVersion": "v1beta2",
"desiredState": {
"manifest": {
"id": "nginx",
"version": "v1beta2",
"containers": [{
"name": "nginx",
"image": "nginx",
"imagePullPolicy": "PullIfNotPresent",
"ports": [{"containerPort": 80, "hostPort": 80}]
}]
}
}
}
启动 Pod 并检查其状态:
$ kubecfg - c nginx.json create pods
$ kubecfg list pods
输出结果示例:
| Name | Image(s) | Host | Labels |
| — | — | — | — |
| nginx | nginx | k8s - cookbook - node - 2.c.runseb.internal/104.154.39.165 | |
| skydns - fplln | quay.io… | k8s - cookbook - node - 1.c.runseb.internal/130.211.170.38 | k8s - app = skydns |
清理资源:
$ kubecfg delete pods/nginx
$ exit # On the kubernetes master
$ gcloud preview container clusters delete cookbook
3. 准备使用 EC2 容器服务(ECS)
3.1 问题与解决方案
如果你想尝试新的 Amazon AWS EC2 容器服务(ECS),需要完成以下步骤:
1. 注册 AWS 账户(如果尚未注册)。
2. 登录 AWS 控制台。确保创建了 VPC 和安全组,或者使用默认的 VPC 和安全组。
3. 进入身份和账户管理(IAM)控制台,为 ECS 创建一个角色。如果不熟悉 IAM,可以参考 AWS 文档中的 ECS 部分逐步操作。
4. 为刚创建的角色创建一个内联策略。可以使用 Boto 自动化创建此策略。
5. 安装最新的 AWS CLI。ECS API 在 1.7.0 或更高版本中可用:
$ sudo pip install awscli
$ aws --version
aws - cli/1.7.8 Python/2.7.9 Darwin/12.6.0
$ aws ecs help
- 创建 AWS CLI 配置文件,包含 IAM 用户的 API 密钥,并将区域设置为 us - east - 1(ECS 当前可用的北弗吉尼亚地区):
$ cat ~/.aws/config
[default]
output = table
region = us - east - 1
aws_access_key_id = <your AWS access key>
aws_secret_access_key = <your AWS secret key>
完成以上步骤后,就可以使用 ECS 了。后续需要创建集群、定义任务并运行这些任务以在集群上启动容器。
3.2 使用 Boto 自动化创建策略
可以使用以下步骤自动化创建策略:
$ git clone https://github.com/how2dock/docbook.git
$ sudo pip install boto
$ cp ~/.aws/config ~/.aws/credentials
$ cd ch08/ecs
$ ./ecs - policy.py
此脚本将创建一个 ecs 角色、一个 ecspolicy 策略和一个 cookbook 实例配置文件。完成后,可以在 IAM 控制台中看到这些角色和策略。
4. 创建 ECS 集群
4.1 问题与解决方案
如果你已经准备好使用 ECS,可以使用 AWS CLI 探索新的 ECS API 来创建集群和实例。需要学习使用以下命令:
-
aws ecs list - clusters
-
aws ecs create - cluster
-
aws ecs describe - clusters
-
aws ecs list - container - instances
-
aws ecs delete - cluster
4.2 激活默认集群
默认情况下,ECS 中有一个集群,但在启动实例之前它处于非活动状态。可以使用以下命令描述默认集群:
$ aws ecs describe - clusters
输出结果示例:
---------------------------------------------------------------------
| DescribeClusters |
+-------------------------------------------------------------------+
|| failures ||
|+------------------------------------------------------+----------+|
|| arn | reason ||
|+------------------------------------------------------+----------+|
|| arn:aws:ecs:us - east - 1:587264368683:cluster/default | MISSING ||
|+------------------------------------------------------+----------+
要激活此集群,使用 Boto 启动一个实例:
$ python
>>> import boto
>>> c = boto.connect_ec2()
>>> c.run_instances('ami - 34ddbe5c', \
key_name='ecs', \
instance_type='t2.micro', \
instance_profile_name='cookbook')
等待实例运行并注册到集群后,再次描述集群:
$ aws ecs describe - clusters
输出结果示例:
-----------------------------------------------------------------------------------
| DescribeClusters |
+---------------------------------------------------------------------------------+
|| clusters ||
|+-----------------------------------------------------+--------------+----------+|
|| clusterArn | clusterName | status ||
|+-----------------------------------------------------+--------------+----------+|
|| arn:aws:ecs:us - east - 1:587264368683:cluster/default | default | ACTIVE ||
|+-----------------------------------------------------+--------------+----------+|
还可以列出容器实例:
$ aws ecs list - container - instances
4.3 创建自定义集群
可以使用以下命令创建自定义集群:
$ aws ecs create - cluster --cluster - name cookbook
输出结果示例:
------------------------------------------------------------------------------------
| CreateCluster |
+----------------------------------------------------------------------------------+
|| cluster ||
|+------------------------------------------------------+--------------+----------+|
|| clusterArn | clusterName | status ||
|+------------------------------------------------------+--------------+----------+|
|| arn:aws:ecs:us - east - 1:587264368683:cluster/cookbook | cookbook | ACTIVE ||
|+------------------------------------------------------+--------------+----------+|
列出集群:
$ aws ecs list - clusters
输出结果示例:
-----------------------------------------------------------
| ListClusters |
+---------------------------------------------------------+
|| clusterArns ||
|+-------------------------------------------------------+|
|| arn:aws:ecs:us - east - 1:587264368683:cluster/cookbook ||
|| arn:aws:ecs:us - east - 1:587264368683:cluster/default ||
|+-------------------------------------------------------+|
要在新创建的集群中启动实例,可以使用以下脚本传递用户数据:
#!/usr/bin/env python
import boto
import base64
userdata="""
#!/bin/bash
echo ECS_CLUSTER=cookbook >> /etc/ecs/ecs.config
"""
c = boto.connect_ec2()
c.run_instances('ami - 34ddbe5c', \
key_name='ecs', \
instance_type='t2.micro', \
instance_profile_name='cookbook', \
user_data=base64.b64encode(userdata))
完成集群使用后,可以使用以下命令删除集群:
$ aws ecs delete - cluster --cluster cookbook
4. 启动 Docker 容器
4.1 问题与解决方案
如果你已经知道如何在 AWS 上创建 ECS 集群,现在可以在集群的实例上启动容器。具体步骤如下:
1.
定义任务
:将容器或容器组在 JSON 格式的定义文件中定义,这被称为任务。例如,要在基于 Docker hub 的 Nginx 镜像的容器中运行 Nginx,可以创建以下任务定义:
[
{
"environment": [],
"name": "nginx",
"image": "nginx",
"cpu": 10,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
],
"memory": 10,
"essential": true
}
]
-
注册任务
:使用 ECS 的
register - task - definition调用注册任务,并指定一个家族(family)来分组任务,方便进行版本管理和回滚操作。
$ aws ecs register - task - definition --family nginx \
--container - definitions file://$PWD/nginx.json
注册成功后,可以使用以下命令列出任务定义:
$ aws ecs list - task - definitions
输出结果示例:
------------------------------------------------------------------
| ListTaskDefinitions |
+----------------------------------------------------------------+
|| taskDefinitionArns ||
|+--------------------------------------------------------------+|
|| arn:aws:ecs:us - east - 1:587264368683:task - definition/nginx:1 ||
|+--------------------------------------------------------------+|
-
运行任务
:使用
run - task命令启动容器,并指定要运行的容器数量。
$ aws ecs run - task --task - definition nginx:1 --count 1
-
停止任务
:要停止容器,需要先使用
list - tasks命令获取任务的 UUID,然后使用stop - task命令停止任务。
$ aws ecs stop - task --task 6223f2d3 - 3689 - 4b3b - a110 - ea128350adb2
4.2 多容器任务示例
除了单个容器的任务,还可以定义包含多个链接容器的任务。以下是一个运行 Wordpress 的任务定义示例,包含 Wordpress 和 MySQL 两个容器:
[
{
"image": "wordpress",
"name": "wordpress",
"cpu": 10,
"memory": 200,
"essential": true,
"links": [
"mysql"
],
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
],
"environment": [
{
"name": "WORDPRESS_DB_NAME",
"value": "wordpress"
},
{
"name": "WORDPRESS_DB_USER",
"value": "wordpress"
},
{
"name": "WORDPRESS_DB_PASSWORD",
"value": "wordpresspwd"
}
]
},
{
"image": "mysql",
"name": "mysql",
"cpu": 10,
"memory": 200,
"essential": true,
"environment": [
{
"name": "MYSQL_ROOT_PASSWORD",
"value": "wordpressdocker"
},
{
"name": "MYSQL_DATABASE",
"value": "wordpress"
},
{
"name": "MYSQL_USER",
"value": "wordpress"
},
{
"name": "MYSQL_PASSWORD",
"value": "wordpresspwd"
}
]
}
]
注册任务:
$ aws ecs register - task - definition --family wordpress \
--container - definitions file://$PWD/wordpress.json
运行任务:
$ aws ecs run - task --task - definition wordpress:1 --count 1
如果任务运行失败,可能是由于资源限制不满足。可以编辑任务定义,放宽内存限制,然后注册一个新的任务版本(revision 2),再次运行任务。
4.3 注意事项
在 ECS 的预览阶段,可能存在一些问题。例如,不太容易找到任务运行的实例和相关的 IP 地址,并且似乎没有像 Kubernetes 那样的代理服务。此外,由于 ECS 处于预览阶段,API 可能会发生变化,API 调用返回的对象也可能会改变。
5. 在云端启动应用程序
5.1 问题与解决方案
如果你想通过推送 Dockerfile 在云端部署基于 Docker 的应用程序,并希望云服务自动启动实例和配置可能的负载均衡器,可以使用 AWS Elastic Beanstalk。具体步骤如下:
1.
准备工作
:
- 拥有一个 AWS 账户。
- 安装 AWS CLI。
- 通过访问控制台注册 Beanstalk,并按照屏幕上的说明操作。
2.
应用程序部署步骤
:
-
创建应用程序
:使用 AWS CLI 创建一个名为
foobar
的应用程序。
$ aws elasticbeanstalk create - application --application - name foobar
- **列出解决方案堆栈**:列出可用的解决方案堆栈,并选择所需的 Docker 环境。
$ aws elasticbeanstalk list - available - solution - stacks
- **创建配置模板**:使用所选的解决方案堆栈创建一个配置模板。
$ aws elasticbeanstalk create - configuration - template \
--application - name foobar \
--solution - stack - name="64bit Amazon Linux 2014.09 v1.2.1 running Docker 1.5" \
--template - name foo
- **创建环境**:创建一个名为 `cookbook` 的环境。
$ aws elasticbeanstalk create - environment \
--application - name foobar \
--environment - name cookbook \
--template - name foo
-
检查环境状态
:使用
describe - environmentsAPI 调用检查环境是否准备好。
$ aws elasticbeanstalk describe - environments
输出结果示例:
--------------------------------------------------------------------------------------------------
| DescribeEnvironments |
+------------------------------------------------------------------------------------------------+
|| Environments ||
|+-------------------+--------------------------------------------------------------------------+|
|| ApplicationName | foobar ||
|| CNAME | cookbook - pmpgzmx2e6.elasticbeanstalk.com ||
|| DateCreated | 2015 - 03 - 30T15:32:47.814Z ||
|| DateUpdated | 2015 - 03 - 30T15:38:14.291Z ||
|| EndpointURL | awseb - e - 7 - AWSEBLoa - CUXDVD6RL9R7 - 992275618.eu - west - 1.elb.amazonaws.com ||
|| EnvironmentId | e - 7hamntqqnw ||
|| EnvironmentName | cookbook ||
|| Health | Green ||
|| SolutionStackName| 64bit Amazon Linux 2014.09 v1.2.1 running Docker 1.5.0 ||
|| Status | Ready ||
|+-------------------+--------------------------------------------------------------------------+|
||| Tier |||
||+-----------------------------------------+--------------------------------------------------+||
||| Name | WebServer |||
||| Type | Standard |||
||| Version | |||
||+-----------------------------------------+--------------------------------------------------+||
-
部署应用程序
:
-
安装
awsebcli:
-
安装
$ sudo pip install awsebcli
- 创建应用程序目录并编写 Dockerfile:
$ mkdir beanstalk
$ cd beanstalk
$ cat > Dockerfile
FROM ubuntu:12.04
RUN apt - get update
RUN apt - get install - y nginx zip curl
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN curl - o /usr/share/nginx/www/master.zip - L https://codeload.github.com/gabrielecirulli/2048/zip
RUN cd /usr/share/nginx/www/ && unzip master.zip && mv 2048 - master/* . && rm - rf 2048 - master master
EXPOSE 80
CMD ["/usr/sbin/nginx", "- c", "/etc/nginx/nginx.conf"]
- 初始化应用程序并部署:
$ eb init foobar
$ eb list
* cookbook
$ eb deploy
5.2 应用程序部署结果
部署完成后,应用程序将在 Beanstalk 环境中运行。可以前往 Beanstalk 控制台找到应用程序的 URL,点击该 URL 即可打开 2048 游戏。由于应用程序前面有弹性负载均衡器,游戏负载增加时将触发创建更多的实例来服务游戏。
6. 总结与操作流程梳理
6.1 各服务操作流程总结
为了更清晰地展示上述云服务的使用流程,下面以表格形式进行总结:
| 服务名称 | 操作步骤 | 关键命令 |
| — | — | — |
| 启动 Wordpress 容器 | 1. 启动容器;2. 打开防火墙 |
gcloud compute firewall-rules create wordpress-80 --allow tcp:80 --target-tags k8s-cook-node
|
| 使用 kubecfg 管理 Google 容器引擎资源 | 1. 启动 Kubernetes 集群;2. 连接主节点;3. 启动 Pod;4. 清理资源 |
gcloud preview container clusters create cookbook --num-nodes 2 --machine-type g1-small
gcloud compute ssh k8s-cookbook-master --zone us-central1-a
kubecfg -c nginx.json create pods
kubecfg delete pods/nginx
gcloud preview container clusters delete cookbook
|
| 准备使用 EC2 容器服务(ECS) | 1. 注册 AWS 账户;2. 登录控制台并配置 VPC 和安全组;3. 创建 IAM 角色和策略;4. 安装 AWS CLI;5. 创建配置文件 |
sudo pip install awscli
cat ~/.aws/config
|
| 创建 ECS 集群 | 1. 激活默认集群或创建自定义集群;2. 启动实例;3. 列出容器实例;4. 删除集群 |
aws ecs create-cluster --cluster-name cookbook
python import boto; c = boto.connect_ec2(); c.run_instances('ami-34ddbe5c', key_name='ecs', instance_type='t2.micro', instance_profile_name='cookbook')
aws ecs list-container-instances
aws ecs delete-cluster --cluster cookbook
|
| 启动 Docker 容器 | 1. 定义任务;2. 注册任务;3. 运行任务;4. 停止任务 |
aws ecs register-task-definition --family nginx --container-definitions file://$PWD/nginx.json
aws ecs run-task --task-definition nginx:1 --count 1
aws ecs stop-task --task 6223f2d3-3689-4b3b-a110-ea128350adb2
|
| 在云端启动应用程序 | 1. 准备工作;2. 创建应用程序;3. 选择解决方案堆栈;4. 创建配置模板;5. 创建环境;6. 检查环境状态;7. 部署应用程序 |
aws elasticbeanstalk create-application --application-name foobar
aws elasticbeanstalk list-available-solution-stacks
aws elasticbeanstalk create-configuration-template --application-name foobar --solution-stack-name="64bit Amazon Linux 2014.09 v1.2.1 running Docker 1.5" --template-name foo
aws elasticbeanstalk create-environment --application-name foobar --environment-name cookbook --template-name foo
aws elasticbeanstalk describe-environments
eb init foobar; eb list; eb deploy
|
6.2 操作流程 mermaid 流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(启动 Wordpress 容器):::process
B --> C(使用 kubecfg 管理 Google 容器引擎资源):::process
C --> D(准备使用 EC2 容器服务(ECS)):::process
D --> E{选择集群类型}:::decision
E -->|默认集群| F(激活默认集群):::process
E -->|自定义集群| G(创建自定义集群):::process
F --> H(启动 Docker 容器):::process
G --> H
H --> I(在云端启动应用程序):::process
I --> J([结束]):::startend
6.3 不同服务使用注意事项
- ECS 服务 :在 ECS 预览阶段,存在一些局限性,如难以确定任务运行的实例和 IP 地址,且缺乏类似 Kubernetes 的代理服务。同时,API 可能会发生变化,使用时需关注官方更新。
- AWS Elastic Beanstalk :部署应用程序时,确保 AWS 账户、AWS CLI 和 Beanstalk 注册等准备工作完成。创建配置模板和环境时,注意选择正确的解决方案堆栈。
6.4 进一步学习建议
- 对于 Google 容器引擎资源管理,深入学习 Kubernetes 的更多特性,如服务发现、自动伸缩等。
- 在使用 ECS 时,研究任务定义的更多参数,以实现更复杂的容器编排。
- 对于 AWS Elastic Beanstalk,学习如何进行环境的高级配置,如负载均衡器的详细设置、自动伸缩策略等。
通过以上的操作步骤、总结和注意事项,希望能帮助你更好地在云环境中使用各种容器服务,实现高效的应用部署和管理。在实际操作过程中,要根据具体需求和环境进行调整,不断积累经验,提升云服务的使用能力。
超级会员免费看
6万+

被折叠的 条评论
为什么被折叠?



