容器和虚拟机的比较
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为 MB | 一般为 GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 完全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
镜像自身是只读的,容器从镜像启动的时候,会在镜像的最上层创建一个可写层
Dockerfile
dockerfile 一般格式
1 | FROM |
.dockerignore 忽略 build 的内容
基础镜像 alpine
apk –update add –no-cache
这样可以大幅度减少构建出来的 docker 镜像的大小
神秘镜像 scratch
其实这个镜像你去拉是会报错的,更多的是一种类似约定的东西,告诉 Docker,这个就是一个空的东西
1 | FROM scratch |
基本概念
docker 本质上是一个 C/S 架构
docker 服务端 unix://var/run/docker.socket
如果要以端口的方式暴露,则需要修改执行命令,设置地址和端口,比如 docker daemon -H 0.0.0.0:1234
客户端如果要连接不同的服务端,也需要额外指定,比如 docker -H tcp://127.0.0.1:1234 version
命令 ip addr show docker0
能看到 docker 网卡的相关信息
docker registry 可以配置 hooks 通知(pull or push)
docker 第三方安全检测工具:
- docker -> docker bench
- CoreOS -> clair
容器里的网络 eth0 <-> docker0 网桥上的 vethXXX(veth pair,当数据包发送到一个接口时另外一个接口也可以接收到相同的数据包)
docker 的 link 主要是添加一个所连接容器的主机名到容器内的/etc/hosts 文件中
查看 docker 网络信息 docker network ls
docker 网络分三种:null、host、bridge
etcd
简单: RESTful 接口
安全: 基于 HTTPS
快速: 支持每秒 1000 个写操作
可靠: 基于 Raft 算法
节点个数推荐为奇数个,最少为 3 个
越多节点能提供更多的冗余性,但会带来写数据性能的下降
Docker Swarm
docker swarm 也支持调度,亲和性这些 k8s 的概念
Kubernetes
Pod 为什么不能通过 IP 访问?
因为 Pod 随时可能会发生故障,重启后可能会被调度到其他节点上,IP 地址就会改变
通过 Service 来访问,Service 被创建后,会自动分配一个 Cluster IP,基于 kube-proxy 实现
kube-proxy 维护节点上的网络规则,作用是使发往 Service 的流量(ClusterIP + 端口)负载均衡到正确的后端 Pod
Label 主要是用来分类资源,比如 name=nginx,release=alpha|beta,有长度限制
Annotation 则主要是给对象增加更丰富的描述信息,可以是任意的,数据量可以很大,可以包含结构化或非结构化数据
Namespace
类似于租户的概念,同一个命名空间的资源不允许重名,但不同命名空间下则允许
default: 资源未指定命名空间的情况下,默认属于该命名空间
kube-system:由 Kubernetes 自身创建的资源属于该命名空间下
hyperkube:提供所有的 k8s 组件支持
etcd:提供数据库存储
pause:一个轻量级的基础设施容器,用于为每个 Pod 提前创建命名空间,其他什么也不做
Pod
Pod 的创建流程
- kubectl 命令发起一个创建 Pod 的请求去到 kube-apiserver
- kube-apiserver 完成基本的验证和授权操作,把 Pod 的相关信息写入 etcd
- kube-scheduler 定时请求 kube-apiserver,确定 Pod 要调度的位置
- kube-apiserver 写 etcd
- kube-apiserver 将信息发给 kubelet 完成 Pod 的创建
- kube-controller-manager 定时请求 kube-apiserver,看 Pod 是否挂掉
各个组件及其作用
名称 | 作用 |
---|---|
etcd | 记录所有节点和资源的状态 |
kube-apiserver | 接收来自客户端和其他组件的请求,更新 etcd 中的数据 |
kube-scheduler | 负责具体的资源调度工作 |
kube-controller-manager | 提供控制器服务,监视集群的状态,一但不满足状态则采取操作,让状态恢复正常 |
kubelet | 负责干活 |
kube-proxy | 网络转发(默认轮询) |