容器与云原生

此文档为给客户培训时是整理文档内容

容器技术交流

虚拟机和容器

虚拟机:虚拟机是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中具有完整计算机系统。

image-20200312141328342

容器:是一个允许在资源隔离过程中、运行应用程序和其依赖的、轻量级的操作系统级别的虚拟化技术

image-20200312141335274

为什么使用容器

  • 高效的利用系统资源

  • 快速的启动时间

  • 一致的运行环境

  • 持续交付和持续部署

  • 方便的迁移

  • 方便的维护和扩展

容器和虚拟机对比

特性 容器 虚拟化
启动 秒级别 分钟级别
存储使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机最大可达数千个 一般几十个
  • 容器为当前CI/CD、DevOps、serverless等先进技术理念提供了更好的技术土壤

docker三要素

image-20200312162117664

repository:Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库

镜像:Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。unionFS

容器:Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。

数据卷

数据卷是一个可以供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多特性。

  • 数据卷可以在容器之间共享和重用

  • 对数据卷的修改会立马生效

  • 对数据卷的更新,不会影响镜像

  • 数据卷会一致存在,即使容器被删除

网络

docker有多种网络模式

  • host 模式,使用 –net=host 指定。

  • container 模式,使用 –net=container:NAMEorID 指定。

  • none 模式,使用 –net=none 指定。

  • bridge 模式,使用 –net=bridge 指定,默认设置。

image-20200312162334994

容器编排

单机运行容器无法体现出容器的优势,只有在编排时才能体现出容器的魅力。

docker-compose

docker 三剑客

Machine

Docker Swarm

compose

compose 项目是docker官方开源项目,负责实现对docker容器集群的快速编排,其定位是定义和运行多个docker容器的应用。

两个核心概念

服务(service): 一个应用容器,实际上可以包括若干个运行相同镜像的容器实例。

项目(project):由一组关联的应用容器组成的完成业务单元,在docker-comose.yml中定义

docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '1'
services:
httpd-test:
image: httpd:2.4
httpd-test-2:
image: httpd:2.4
volumes:
- "/data:/var/www/html"
ports:
- "80:80"
httpd-test-3:
image: httpd:2.4
volumes:
- "/data:/usr/local/apache2/htdocs"
ports:
- "8080:80"

kubernetes

kubernetes是谷歌开源的容器集群管理系统,是谷歌多年大规模容器管理技术Borg的开源版本,也是CNCF最重要的项目之一。

k8s功能
  • 基于容器的应用部署、维护、滚动升级。

  • 跨机器和跨地区的集群调度

  • 负载均衡和服务发现

  • 自动伸缩

  • 无状态服务和有状态服务

  • 插件机制保证扩展性

k8s整体架构

image-20200312163332129

  • 核心组件

    • etcd保存了整个集群的状态;
    • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
    • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
    • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
    • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
    • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

  • Addons

•kube-dns负责为整个集群提供DNS服务

•Ingress Controller为服务提供外网入口

•Heapster提供资源监控

•Dashboard提供GUI

•Federation提供跨可用区的集群

•Fluentd-elasticsearch提供集群日志采集、存储与查询

pod调度过程

image-20200312163704823

k8s资源对象
  • Pod

Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

  • 计算资源

包含deployment,daemonset,statefulset,job等多种资源,用于pod上层的调度,编排pod的核心资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Source: tomcat/templates/appsrv.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
app: tomcat
chart: tomcat-0.4.1
release: tomcat
heritage: Tiller
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
release: tomcat
template:
metadata:
labels:
app: tomcat
release: tomcat
spec:
volumes:
- name: app-volume
emptyDir: {}
initContainers:
- name: war
image: ananwaresystems/webarchive:1.0
imagePullPolicy: IfNotPresent
command:
- "sh"
- "-c"
- "cp /*.war /app"
volumeMounts:
- name: app-volume
mountPath: /app
containers:
- name: tomcat
image: tomcat:7.0
imagePullPolicy: IfNotPresent
volumeMounts:
- name: app-volume
mountPath: /usr/local/tomcat/webapps
ports:
- containerPort: 8080
hostPort: 8009
livenessProbe:
httpGet:
path: /sample
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
failureThreshold: 6
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /sample
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
failureThreshold: 6
timeoutSeconds: 5
resources:
{}
  • 存储资源

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。PV是集群资源。

PersistentVolumeClaim(PVC)是用户存储的请求。它类似于pod。Pod消耗节点资源,PVC消耗存储资源。

StorageClass为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。

secret和configmap可以理解为特殊的存储卷,但是它们不是给Pod提供存储功能的,而是提供了从集群外部向集群内部的应用注入配置信息的功能。

  • 服务资源

service:一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,可以简单理解为k8s内部负载均衡,

image-20200312164435191

ingress:是在外面访问和service中间一层,可以简单理解为k8s中7层负载均衡

image-20200312164447625

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Source: tomcat/templates/appsrv-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat
labels:
app: tomcat
chart: tomcat-0.4.1
release: tomcat
heritage: Tiller
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: tomcat
release: tomcat

云原生

服务网格

又称为service mesh,通过sidecar的形式解决微服务之间服务控制,服务发现,负载均衡等问题。

image-20200312164957832

image-20200312165151749

云原生概念

Pivotal定义

  • 符合12因素应用

  • 面向微服务架构

  • 自服务敏捷架构

  • 基于API的协作

  • 抗脆弱性

12因素

  1. 一份基准代码,多份部署
  2. 显示声明依赖关系
  3. 在环境中存储配置
  4. 把后端服务当作附加资源
  5. 严格分离构建和运行
  6. 以一个或者多个无状态进程运行应用
  7. 通过端口绑定提供服务
  8. 通过进程模型进行扩展
  9. 快速启动和优雅终止可最大化健壮性
  10. 尽可能的保持开发、预发布、线上环境相同
  11. 把日志当作时间流
  12. 后台管理任务当作一次性进程运行

CNCF定义

  • 应用容器化

  • 面向微服务架构

  • 应用支持容器的编排调度

CNCF后期定义

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

  • 云原生应用就是为了在云上运行而开发的应用。

image-20200312170109097