第一章 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政策结束而终止。

 

posted @ 2022-11-09 17:34  摩天居士-谢烟客  阅读(45)  评论(0)    收藏  举报