第一章 Kubernetes系统基础
1.1 容器技术概述
近几十年来,IT领域新技术、新概念层出不穷,例如DevOps、微服务(Microservice)、容器(Container),云计算(Cloud Computing)和区块链(Blockchain)等,真有“乱花渐欲迷人眼”之势。另外,出于业务的需要,IT应用模型也在不断的变革,例如,开发模式从瀑布式(Waterfall)到敏捷(Agile)再到精益(Lean),甚至是与QA和Operations融合的DevOps,应用程序架构从单体(monolithic)模型到分层模型再到微服务,部署及打包方式从面向物理机到虚拟机再到容器。应用程序的基础架构从自建机房到托管再到云计算,等等。这些变革使得IT技术应用的效率大大提升,同时却以更低的成本交付更高质量的产品。
容器是一种轻量级、可移植、自包含的软件打包技术,它使得应用程序可以在几乎任何地方以相同的方式运行。
容器与虚拟机对比关系图:

运用容器技术有如下优点:
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
容器简单命令:
启动
# docker run -it:交互 -d:后天运行 -p:端口映射 -v:磁盘挂载
启动已终止容器
# docker start
停止容器
# docker stop
查看容器进程
# docker ps
查看容器细节
# docker inspect <containerid>
进入容器
# docker attach
# docker exec
通过nsenter:
PID=$(docker inspect --format "{{.State.Pid}}" <container>)
# nsenter --target $PID --mount --uts --ipc --net --pid
拷贝文件之容器内
# docker cp file1 <containerid>:/file-to-path
初识容器
第一步 # cat Dockerfile FROM ubuntu ENV MY_SERVICE_PORT=80 ADD bin/amd64/httpserver /httpserver ENTRYPOINT /httpserver 第二步 # 将Dockerfile打包成镜像 # docker build -t cncamp/httpserver:${tag} # docker push cncamp/httpserver:v1.0 第三步 运行容器 # docker run -d cncamp/httpserver:v1.0
Namespace
Linux Namespace是一种Linux Kernel提供的资源隔离方案:
- 系统可以为进程分配不同的Namespace
- 并保证不同的Namespace资源独立分配,进程彼此隔离,即不同的Namespace下的进程互不干扰。
关于namespace的常用操作
查看当前系统的namespace: lsns -t <type> 查看某进程的namespace: ls -la /proc/<pid>/ns/ 进入某namespace运行命令 nsenter -t <pid> -n ip addr
Namespace练习
在新network namespace执行sleep指令: # unshare -fn sleep 60 查看进程信息 # ps -er|grep sleep root 32882 4935 0 10:00 pts/0 root 32883 32882 0 10:00 pts/0 查看网络 Namespace lsns -t net 4026532508 net 2 32882 root unassigned unshare 进入该进程所在namespace查看网络配置,与主机不一致,说明进行了隔离 nsenter -t 32882 -n ip a 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
Cgroups
- Cgroups(Control Groups)是Linux下用于对一个或一组进程进行资源控制和监控的机制;
- 可以对诸如CPU使用时间、内存、磁盘I/O等进程所需的资源进行限制;
- 不同资源的具体管理工作由相应的Croups子系统(Subsystem)来实现;
- 针对不同类型的资源限制,只要将限制策略在不同的子系统上进行关联即可;
CPU 子系统练习 • 在cgroupcpu子系统目录中创建目录结构 cd /sys/fs/cgroup/cpu mkdir cpudemo cd cpudemo • 运行busyloop • 执行top查看CPU使用情况,CPU占用200% • 通过cgroup限制CPU cd /sys/fs/cgroup/cpu/cpudemo • 把进程添加到 cgroup 进程配置组 echo ps -ef|grep busyloop|grep -v grep|awk '{print $2}' > cgroup.procs • 设置 cpuquota echo 10000 > cpu.cfs_quota_us • 执行top查看CPU使用情况,CPU占用变为10% ================================================= memory 子系统练习 • 在cgroupmemory子系统目录中创建目录结构: cd /sys/fs/cgroup/memory mkdir memorydemo cd memorydemo • 运行malloc(在Linux机器makebuild); • 查看内存使用情况; watch 'ps -aux|grep malloc|grep -v grep‘ • 通过cgroup限制memory: • 把进程添加到 cgroup 进程配置组: echo ps -ef|grep malloc |grep -v grep|awk '{print $2}' > cgroup.procs • 设置 memory.limit_in_bytes: echo 104960000 > memory.limit_in_bytes • 等待进程被oomkill。
什么是Kubernetes?
Kubernetes是谷歌开源的容器集群管理系统,是Google多年 大规模容器管理技术Borg的开源版本,主要功能包括:
- 基于容器的应用部署、维护和滚动升级;
- 负载均衡和服务发现
- 跨机器和跨地区的集群调度;
- 自动伸缩;
- 无状态服务和有状态服务;
- 插件机制保证扩展性;
命令式🆚声明式
命令式系统关注“如何做”
在软件工程领域,命令式系统是写出解决某个问题,完成某个任务,或者达到某个目标的明确步骤,此方法明确写出系统应该执行某指令,并且期待系统返回期望结果
声明式系统关系“做什么”
在软件工程领域,声明式系统指程序代码描述系统应该做什么而不是怎么做。仅限于描述要达到什么目的,如何达到目的交给系统。
Kubernetes采用与Brog类似的架构

Kubernetes集群组件
Mater组件
- api server:api server负责输出RESTful API,他是发往集群的所有REST操作命令的接入点,并负责接收,校验并响应所有的REST请求,结果状态被持久存储于etcd中,因此,API Server是整个集群的网关:
- 集群状态存储:kubernetes集群的所有状态信息都需要持久存储于存储系统etcd中,生产环境中应该以etcd集群的方式进行以确保服务可用性。
- 控制器管理器(Controller Manager):
- 调度器(Scheduler):
Pod节点:
- ReplicaSet:新一代ReplicationController,他与ReplicaationController的唯一不同之处仅在于支持的标签选择器不同,ReplicationController只支持等值选择器,而ReplicaSet还额外支出基于集合的选择器。
- Deployment:用于管理无状态持久化应用,例如HTTP服务器,它用于为Pod和ReplicaSet提供声明式更新,是构建在ReplicaSet之上的更为高级的控制器。
- StatefulSet:用于管理有状态的持久化应用,如database服务程序;其与Develoyment的不同之处在于StatefulSet会为每个Pod创建一个独有的持久性标识符,并会确保各Pod之间的顺序性。
- DaemonSet:用于确保每个节点都运行了某Pod的一个副本,新增的节点一样会被添加此类Pod;在节点移除时,此类Pod会被回收;DaemonSet常用于运行集群存储守护进程--如glusterd和ceph,还有日志收集进程--如fluentd和logstash;以及监控进程--如prometheus的Node Exporter、collectd、Datadog agent和Ganglia的gmond等
- Job:用于管理运行完成后即可终止的应用,例如批处理作业任务,换句话讲,Job创建一个或多个Pod,并确保其符合目标数量,直到Pod政策结束而终止。
不积跬步,无以至千里;不积小流,无以成江海。

浙公网安备 33010602011771号