docker
一个应用想以容器化的形式部署运行起来,需要经过2个步骤:
构建镜像
实例化
以dmp为例,按照一个镜像只包含单个应用的原则,dmp需要构建3个镜像:console、client、front。
那么每次部署需要执行 docker build 、docker run 各3次,且3个容器run的参数是很不一样的,再加上要考虑多个容器之间的依赖、网络问题,这就导致部署变得非常复杂。
举例一个mysql的 docker run :
docker run -d --rm --name mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/init:/docker-entrypoint-initdb.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
docker-compose
用途:docker容器快速编排,解决了容器依赖、组网等问题
适用场景:本地开发、测试环境
不适用场景:生产环境
docker-compose.yaml,以dmp为例
version: "3"
services:
console:
build: ./console
ports:
- "8020:8020"
volumes:
- /data1/release/dmp/${test_env}/logs:/home/nginx/release/logs
- /etc/hosts:/etc/hosts
env_file:
- ./console/console.env
networks:
dmp:
aliases:
- console
client:
build: ./client
ports:
- "8080:8080"
volumes:
- /data1/release/dmp/${test_env}/logs:/home/nginx/release/logs
- /etc/hosts:/etc/hosts
env_file:
- ./client/client.env
networks:
dmp:
aliases:
- client
front:
build: ./front
ports:
- "${port}:80"
volumes:
- /data1/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /data1/nginx/conf/vhosts:/etc/nginx/conf/vhosts
- /data1/nginx/logs/${test_env}:/data/logs/nginx
- /data1/release/dmp/${test_env}/front/dmp-resource:/data/www/release/dmp-resource
- /data1/release/dmp/${test_env}/front/dmp-front-v2:/data/www/release/dmp-front-v2
networks:
- dmp
networks:
dmp:
镜像仓库
集中存放docker镜像的地方,叫镜像仓库,类似于git的远程仓库。
镜像仓库有公用的如docker hub,也有私有的registry,比如自己搭建harbor。
与远程镜像仓库交互:
docker push:将本地镜像推送至镜像仓库
docker pull:从镜像仓库拉取镜像到本地
镜像仓库也可以用来管理helm charts,后面会介绍到。
kubernetes
what is k8s
Kubernetes 是一个提供了基于容器的应用集群管理解决方案,Kubernetes 为容器化应用提供了部署运行、资源调度、服务发现和动态伸缩等一系列完整功能。
Kubernetes 的核心设计理念是: 用户定义要部署的应用程序的规则,而 Kubernetes 则负责按照定义的规则部署并运行应用程序。如果应用程序出现问题导致偏离了定义的规则,Kubernetes 负责对其进行自动修正。例如:定义的应用规则要求部署两个实例(Pod),其中一个实例异常终止了,Kubernetes 会检查到并重新启动一个新的实例。
a k8s cluster
Master:负责管理集群,只有一个
Node:节点是运行容器服务的机器,可以有多个,可以是虚拟机或者物理机
节点与master之间通过Kubernetes API进行通信。
https://kubernetes.io/docs/tutorials/kubernetes-basics/
k8s objects
用户通过使用 Kubernetes API 对象来描述应用程序规则,包括 Pod、Service、Volume、Namespace、Deployment、Job等等。
名词解释
Pod:最小管理单元,可以包含一个或多个紧密相连的容器应用
Deployment:为Pod提供声明式定义
Service:是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略
Labels & Selectors:键值对,用来标识和识别对象
Ingress:为进入集群的请求提供路由规则的集合
ConfigMap:用来保存配置数据的键值对,可以是单个属性,也可以是配置文件
Volumes:数据卷,用来做数据持久化
一般这些资源对象的定义需要写入一系列的 YAML 文件中,如:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
kubectl
k8s集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
kubectl get - list resources
kubectl describe - show detailed information about a resource
kubectl logs - print the logs from a container in a pod
kubectl exec - execute a command on a container in a pod
kubectl version
kubectl get nodes
kubectl get deployments
kubectl get pods
kubectl describe pods
kubectl logs $pod_name
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
kubectl create -f nginx.yaml
Rancher
what is rancher
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
使用rancher部署应用
以DMP为例:
https://k8s-test-rancher.mycompany.com/p/c-xpl64:p-lc589/workloads
工作负载
负载均衡
服务发现
配置映射
部署一个DMP下来,我们会发现一个DMP应用需要维护多份YAML文件。面临问题:
如何管理、编辑和更新这些分散的 Kubernetes 应用配置文件。
如何把一套相关的配置文件作为一个应用进行管理。
如何分发和重用 Kubernetes 的应用配置。
Helm
Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来管理 Charts。有点类似于 Ubuntu 中的 apt 或 CentOS 中的 yum 或 Python 中的 pip 。
Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。
对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。
Helm应用
helm chart目录结构
helm chart管理
打包后上传镜像仓库进行管理
在rancher上使用helm进行一键部署
运行中的状态
一键回滚、升级、删除
参考文档:
What is Kubernetes
helm入门指南