Files
kuboard-press/learning/k8s-basics/deploy-app.md
huanqing.shao 6ffe11aef3 ConfigMap
2019-08-29 16:25:04 +08:00

186 lines
6.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
description: 本文详细讲解了 Kubernetes Deployment 的概念,并描述了如何使用 kubectl / Kuboard 创建一个 Deployment
---
# 1. 部署第一个应用程序
本文翻译自 Kubernetes 官网 [Using kubectl to Create a Deployment](https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/) ,并有所改写
### 前提
假设您已经
* 完成 Kubernetes 集群的安装,请参考文档 [安装 Kubernetes 单Master节点](/install/install-k8s.html)
* 完成 Kuboard 的安装,请参考文档 [安装 Kuboard](/install/install-dashboard.html)
### 目标
- 使用 kubectl 在 k8s 上部署第一个应用程序。
::: tip
* kubectl 是 k8s 的客户端工具,可以使用命令行管理集群。
* 如果参考文档 [安装 Kubernetes 单Master节点](/install/install-k8s.html),您可以在 master 节点的 root 用户使用 kubectl 操作您的集群
* 您也可以尝试 [从客户端电脑远程管理 Kubernetes](/install/install-kubectl.html)
:::
### Kubernetes 部署
在 k8s 上进行部署前,首先需要了解一个基本概念 **Deployment**
**Deployment** 译名为 **部署**。在k8s中通过发布 Deployment可以创建应用程序 (docker image) 的实例 (docker container),这个实例会被包含在称为 **Pod** 的概念中,**Pod** 是 k8s 中最小单元的可管理单元。
在 k8s 集群中发布 Deployment 后Deployment 将指示 k8s 如何创建和更新应用程序的实例master 节点将应用程序实例调度到集群中的具体的节点上。
创建应用程序实例后Kubernetes Deployment Controller 会持续监控这些实例。如果运行实例的 worker 节点关机或被删除,则 Kubernetes Deployment Controller 将在群集中资源最优的另一个 worker 节点上重新创建一个新的实例。**这提供了一种自我修复机制来解决机器故障或维护问题。**
在容器编排之前的时代各种安装脚本通常用于启动应用程序但是不能够使应用程序从机器故障中恢复。通过创建应用程序实例并确保它们在集群节点中的运行实例个数Kubernetes Deployment 提供了一种完全不同的方式来管理应用程序。
## 在 Kubernetes 上部署第一个应用程序
![img](./deploy-app.assets/module_02_first_app.svg)
上图是在第一篇文章的基础上添加上了Deployment、Pod和Container。
Deployment 处于 master 节点上,通过发布 Deploymentmaster 节点会选择合适的 worker 节点创建 Container即图中的正方体Container 会被包含在 Pod (即蓝色圆圈)里。
## 实战:部署 nginx Deployment
本套教程提供了两种实战方式:
* 使用 kubectl
* 使用 Kuboard
:::: tabs type:border-card
::: tab 使用kubectl lazy
**创建 YAML 文件**
创建文件 nginx-deployment.yaml内容如下
<CodeSwitcher :languages="{comment:'有注释',nocomment:'无注释'}" :isolated="true">
<template v-slot:comment>
```yaml
apiVersion: apps/v1 #与k8s集群版本有关使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签可以灵活定位一个或多个资源其中key和value均可自定义可以定义多组目前不需要理解
app: nginx #为该Deployment设置key为appvalue为nginx的标签
spec: #这是关于该Deployment的描述可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能即在pod中部署
containers: #生成container与docker中的container是同一种
- name: nginx #container的名称
image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container该container默认80端口可访问
```
</template>
<template v-slot:nocomment>
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
```
</template>
</CodeSwitcher>
**应用 YAML 文件**
``` sh
kubectl apply -f nginx-deployment.yaml
```
**查看部署结果**
``` sh
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
```
:::
::: tab 使用Kuboard lazy
**打开 Kuboard 集群概览界面**,如下图所示:
![image-20190822165220992](./deploy-app.assets/image-20190822165220992.png)
**点击 default 名称空间**
![image-20190822165351264](./deploy-app.assets/image-20190822165351264.png)
点击 **创建工作负载**
并填写表单如下:
| 字段名 | 填写内容 | 备注 |
| -------- | ----------- | ------------------------------------------------------- |
| 服务类型 | Deployment | |
| 服务分层 | 展现层 | Kuboard使用这个字段确定将部署显示在微服务架构的哪个分层 |
| 服务名称 | nginx | 服务分层的前缀 + 服务名 组成最终的 K8S Deployment name |
| 服务描述 | Nginx部署 | 显示在微服务分层架构图中便于识别的名字,可以是中文 |
| 副本数量 | 1 | replicas |
| 容器名称 | nginx | |
| 镜像 | nginx:1.7.9 | |
| 抓取策略 | Always | 每次创建 Pod 都尝试抓取镜像 |
![image-20190822171013606](./deploy-app.assets/image-20190822171013606.png)
点击 ***保存***
点击 ***应用***
点击 ***完成***
此时可查看到该应用的部署结果
:::
::::
可分别查看到一个名为 nginx-deployment 的 Deployment 和一个名为 nginx-deployment-xxxxxxx 的 Pod
~~任务二达成至此你已经成功在k8s上部署了一个实例的nginx应用程序
~~想要知道 Deployment部署、Pod容器组 和 Node(节点) 之间的关系吗?
~~lets go-> [查看 Pods容器组和 Nodes节点](./explore.html)