前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >K8s 实践:优雅限制 K8s 集群中文件描述符与线程数量

K8s 实践:优雅限制 K8s 集群中文件描述符与线程数量

作者头像
公众号: 云原生生态圈
发布于 2023-08-23 00:59:58
发布于 2023-08-23 00:59:58
2.4K00
代码可运行
举报
文章被收录于专栏:云原生生态圈云原生生态圈
运行总次数:0
代码可运行

背景

linux 中为了防止进程恶意使用资源,系统使用 ulimit 来限制进程的资源使用情况(包括文件描述符,线程数,内存大小等)。同样地在容器化场景中,需要限制其系统资源的使用量。

限制方法
  • ulimit: docker 默认支持 ulimit 设置,可以在 dockerd 中配置 default-ulimits 可为宿主机所有容器配置默认的 ulimit,docker 启动时可添加 –ulimit 为每个容器配置 ulimit 会覆盖默认的设置;目前 k8s 暂不支持 ulimit
  • cgroup: docker 默认支持 cgroup 中内存、cpu、pid 等的限制,对于线程限制可通过 –pids-limit 可限制每个容器的 pid 总数,dockerd 暂无默认的 pid limit 设置;k8s 限制线程数,可通过在 kubelet 中开启 SupportPodPidsLimit 特性,设置 pod 级别 pid limit
  • /etc/securiy/limits.conf,systcl.confg: 通过 ulimit 命令设置只对当前登录用户有效,永久设置可通过 limits.conf 配置文件实现,以及系统级别限制可通过 systcl.confg 配置文件

实验对比

环境
  • 本地环境:os: Ubuntu 16.04.6 LTS 4.4.0-154-generic docker: 18.09.7 base-image: alpine:v3.9
  • k8s 环境:kubelet: v1.10.11.1 docker: 18.09.6
ulimit

用户级别资源限制,分为 soft 限制与 hard 限制

  • soft :用户可修改,但不能超过硬限制
  • hard:只有 root 用户可修改

修改方式:ulimit 命令,临时修改;/etc/security/limits.conf,永久修改

工作原理:根据 PAM ( Pluggable Authentication Modules 简称 PAM)机制,应用程序启动时,按 /etc/pam.d 配置加载 pam_xxxx.so 模块。/etc/pam.d 下包含了 login 、sshd 、su 、sudo 等程序的 PAM 配置文件, 因此用户重新登录时,将调用 pam_limits.so 加载 limits.conf 配置文件

文件描述符限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RLIMIT_NOFILE
              This specifies a value one greater than the maximum file
              descriptor number that can be opened by this process.
              Attempts (open(2), pipe(2), dup(2), etc.)  to exceed this
              limit yield the error EMFILE.  (Historically, this limit was
              named RLIMIT_OFILE on BSD.)

              Since Linux 4.5, this limit also defines the maximum number of
              file descriptors that an unprivileged process (one without the
              CAP_SYS_RESOURCE capability) may have "in flight" to other
              processes, by being passed across UNIX domain sockets.  This
              limit applies to the sendmsg(2) system call.  For further
              details, see unix(7).

根据定义,nofile 限制进程所能最多打开的文件数量,作用范围进程。

  1. 设置 ulimit nofile 限制 soft 100/hard 200,默认启动为 root 用户
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d --ulimit nofile=100:200  cr.d.xiaomi.net/containercloud/alpine:webtool top
  1. 进入容器查看, fd soft 限制为 100 个
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        unlimited
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      unlimited
-n: file descriptors               100
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0
  1. 使用 ab 测试,并发 90 个 http 请求,创建 90 个 socket,正常运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # ab -n 1000000 -c 90 http://61.135.169.125:80/ &
/ # lsof | wc -l
108
/ # lsof | grep -c ab
94
  1. 并发 100 个 http 请求,受到 ulimit 限制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ #  ab -n 1000000 -c 100 http://61.135.169.125:80/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 61.135.169.125 (be patient)
socket: No file descriptors available (24)

线程限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RLIMIT_NPROC
              This is a limit on the number of extant process (or, more pre‐
              cisely on Linux, threads) for the real user ID of the calling
              process.  So long as the current number of processes belonging
              to this process's real user ID is greater than or equal to
              this limit, fork(2) fails with the error EAGAIN.

              The RLIMIT_NPROC limit is not enforced for processes that have
              either the CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.

由定义可知,nproc 进程限制的范围是对于每个 uid,并且对于 root 用户无效。

容器 uid

同一主机上运行的所有容器共享同一个内核(主机的内核),docker 通过 namspace 对 pid/utc/network 等进行了隔离,虽然 docker 中已经实现了 user namespace,但由于各种原因,默认没有开启,见 docker user namespace

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d  cr.d.xiaomi.net/containercloud/alpine:webtool top

宿主机中查看 top 进程,显示 root 用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ps -ef |grep top
root      4096  4080  0 15:01 ?        00:00:01 top

容器中查看 id,uid 为 0 对应宿主机的 root 用户,虽然同为 root 用户,但 Linux Capabilities 不同,实际权限与宿主机 root 要少很多

在容器中切换用户到 operator(uid 为 11),执行 sleep 命令,主机中查看对应进程用户为 app,对应 uid 同样为 11

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ # su operator
/ $ id
uid=11(operator) gid=0(root) groups=0(root)
/ $ sleep 100
$ ps -ef |grep 'sleep 100'
app      19302 19297  0 16:39 pts/0    00:00:00 sleep 100
$ cat /etc/passwd | grep app
app❌11:0::/home/app:

验证不同用户下 ulimit 的限制

设置 ulimit nproc 限制 soft 10/hard 20,默认启动为 root 用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d --ulimit nproc=10:20  cr.d.xiaomi.net/containercloud/alpine:webtool top

进入容器查看, fd soft 限制为 100 个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        unlimited
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      10
-n: file descriptors               1048576
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0

启动 30 个进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # for i in `seq 30`;do sleep 100 &; done
/ # ps | wc -l
36

切换到 operator 用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # su operator

# 启动多个进程,到第11个进程无法进行fork
/ $ for i in `seq 8`; do
> sleep 100 &
> done
/ $ sleep 100 &
/ $ sleep 100 &
sh: can't fork: Resource temporarily unavailable

root 下查看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # ps -ef | grep operator
   79 operator  0:00 sh
   99 operator  0:00 sleep 100
  100 operator  0:00 sleep 100
  101 operator  0:00 sleep 100
  102 operator  0:00 sleep 100
  103 operator  0:00 sleep 100
  104 operator  0:00 sleep 100
  105 operator  0:00 sleep 100
  106 operator  0:00 sleep 100
  107 operator  0:00 sleep 100
  109 root      0:00 grep operator
/ # ps -ef | grep operator| wc -l
10

验证 ulimit 在不同容器相同 uid 下的限制

设置 ulimit nproc 限制 soft 3/hard 3,默认启动为 operator 用户,起 4 个容器,第四个启动失败

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d --ulimit nproc=3:3 --name nproc1 -u operator  cr.d.xiaomi.net/containercloud/alpine:webtool top
eeb1551bf757ad4f112c61cc48d7cbe959185f65109e4b44f28085f246043e65
$ docker run -d --ulimit nproc=3:3 --name nproc2 -u operator  cr.d.xiaomi.net/containercloud/alpine:webtool top
42ff29844565a9cb3af2c8dd560308b1f31306041d3dbd929011d65f1848a262
$ docker run -d --ulimit nproc=3:3 --name nproc3 -u operator  cr.d.xiaomi.net/containercloud/alpine:webtool top
b7c9b469e73f969d922841dd77265467959eda28ed06301af8bf83bcf18e8c23
$ docker run -d --ulimit nproc=3:3 --name nproc4 -u operator  cr.d.xiaomi.net/containercloud/alpine:webtool top
b49d8bb58757c88f69903059af2ee7e2a6cc2fa5774bc531941194c52edfd763
$
$ docker ps -a |grep nproc
b49d8bb58757        cr.d.xiaomi.net/containercloud/alpine:webtool      "top"                    16 seconds ago      Exited (1) 15 seconds ago                               nproc4
b7c9b469e73f        cr.d.xiaomi.net/containercloud/alpine:webtool      "top"                    23 seconds ago      Up 22 seconds                                           nproc3
42ff29844565        cr.d.xiaomi.net/containercloud/alpine:webtool      "top"                    31 seconds ago      Up 29 seconds                                           nproc2
eeb1551bf757        cr.d.xiaomi.net/containercloud/alpine:webtool      "top"                    38 seconds ago      Up 36 seconds                                           nproc1

总结

  • ulimit 限制 fd 总数,限制级别进程,可对所有用户生效
  • ulimit 限制线程总数,限制级别用户(uid),限制同一个 uid 下所有线程/进程数,对于 root 账号无效
  • 对于目前线上情况,有较小的概率因 ulimit 限制导致 fork 失败,如同一个宿主机中有多个 work 容器且基础镜像相同(即 uid 相同),若一个容器线程泄露,由于 ulimit 限制会影响其他容器正常运行

cgroup

cgroup 中对 pid 进行了隔离,通过更改 docker/kubelet 配置,可以限制 pid 总数,从而达到限制线程总数的目的。线程数限制与系统中多处配置有关,取最小值,参考 stackoverflow 上线程数的设置

  • docker,容器启动时设置 –pids-limit 参数,限制容器级别 pid 总数
  • kubelet,开启 SupportPodPidsLimit 特性,设置–pod-max-pids 参数,限制 node 每个 pod 的 pid 总数 以 kubelet 为例,开启 SupportPodPidsLimit,--feature-gates=SupportPodPidsLimit=true
  1. 配置 kubelet,每个 pod 允许最大 pid 数目为 150
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node01 ~]# ps -ef |grep kubelet
root     18735     1 14 11:19 ?        00:53:28 ./kubelet --v=1 --address=0.0.0.0 --feature-gates=SupportPodPidsLimit=true --pod-max-pids=150 --allow-privileged=true --pod-infra-container-image=cr.d.xiaomi.net/kubernetes/pause-amd64:3.1 --root-dir=/home/kubelet --node-status-update-frequency=5s --kubeconfig=/home/xbox/kubelet/conf/kubelet-kubeconfig --fail-swap-on=false --max-pods=254 --runtime-cgroups=/systemd/system.slice/frigga.service --kubelet-cgroups=/systemd/system.slice/frigga.service --make-iptables-util-chains=false
  1. 在 pod 中起测试线程,root 下起 100 个线程
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # for i in `seq 100`; do
> sleep 1000 &
> done
/ # ps | wc -l
106
  1. operator 下,创建线程受到限制,系统最多只能创建 150 个
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ # su operator
/ $
/ $ for i in `seq 100`; do
> sleep 1000 &
> done
sh: can't fork: Resource temporarily unavailable
/ $ ps | wc -l
150
  1. 在 cgroup 中查看,pids 达到最大限制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node01 ~]# cat /sys/fs/cgroup/pids/kubepods/besteffort/pod8b61d4de-a7ad-11e9-b5b9-246e96ad0900/pids.current
150
[root@node01 ~]# cat /sys/fs/cgroup/pids/kubepods/besteffort/pod8b61d4de-a7ad-11e9-b5b9-246e96ad0900/pids.max
150
  1. 总结 cgroup 对于 pid 的限制能够达到限制线程数目的,目前 docker 只支持对每个容器的限制,不支持全局配置;kubelet 只支持对于 node 所有 pod 的全局配置,不支持具体每个 pod 的配置

limits.conf/sysctl.conf

limits.conf 是 ulimit 的具体配置,目录项/etc/security/limit.d/中的配置会覆盖 limits.conf。

sysctl.conf 为机器级别的资源限制,root 用户可修改,目录项/etc/security/sysctl.d/中的配置会覆盖 sysctl.conf,在/etc/sysctl.conf 中添加对应配置(fd: fs.file-max = {}; pid: kernel.pid_max = {})

  1. 测试容器中修改 sysctl.conf 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d --ulimit nofile=100:200 cr.d.xiaomi.net/containercloud/alpine:webtool top
cb1250c8fd217258da51c6818fa2ce2e2f6e35bf1d52648f1f432e6ce579cf0d
$ docker exec -it cb1250c sh

/ # ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        unlimited
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      unlimited
-n: file descriptors               100
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0
/ #
/ # echo 10 > /proc/sys/kernel/pid_max
sh: can't create /proc/sys/kernel/pid_max: Read-only file system
/ # echo 10 > /proc/sys/kernel/pid_max
sh: can't create /proc/sys/kernel/pid_max: Read-only file system
/ # echo "fs.file-max=5" >> /etc/sysctl.conf
/ # sysctl -p
sysctl: error setting key 'fs.file-max': Read-only file system
  1. 以 priviledged 模式测试,谨慎测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat /proc/sys/kernel/pid_max
32768
$ docker run -d -- --ulimit nofile=100:200 cr.d.xiaomi.net/containercloud/alpine:webtool top
$ docker exec -it pedantic_vaughan sh
/ # cat /proc/sys/kernel/pid_max
32768
/ # echo 50000 > /proc/sys/kernel/pid_max
/ # cat /proc/sys/kernel/pid_max
50000
/ # exit
$ cat /proc/sys/kernel/pid_max
50000 # 宿主机的文件也变成50000
  1. 总结 由于 docker 隔离的不彻底,在 docker 中修改 sysctl 会覆盖主机中的配置,不能用来实现容器级别资源限制 limits.conf 可以在容器中设置,效果同 ulimit

结论

推荐方案如下:

  • fd 限制:修改 dockerd 配置 default-ulimits,限制进程级别 fd
  • thread 限制:修改 kubelet 配置--feature-gates=SupportPodPidsLimit=true - -pod-max-pids={},cgroup 级别限制 pid,从而限制线程数
  • 其他注意事项,调整节点 pid.max 参数;放开或者调大镜像中 ulimit 对非 root 账户 nproc 限制

本公众号【云原生生态圈】(以下均称为本公众号)分享的软件服务以及技术方案均来源于互联网,主要是对互联网上出现的开源产品、技术解决方案以及部分编程语言的实践使用进行分享和整理。本公众号不对任何人进行相关技术的方案的推荐,如果您使用文章中涉及到软件或拷贝了相关代码比如说造成了相关生产事故、甚至导致数据丢失,请您自行承担相应的后果!本公众号维护者概不负责! 对于本公众号的所有原创文章,均是受益于互联网学习后,个人总结整理而来,欢迎大家在技术实践上能够多相互交流与学习,您可以在文章底部进行留言回复,也可以在公众号内添加作者有素质、有文化的、礼貌的进行微信交流。若您觉得公众号发布的内容若侵犯到您的权益,请联系即时管理员沟通!

云原生生态圈 · 往期推荐

云原生生态圈之玩转容器系列文章

云原生生态圈之运维架构专辑文章

云原生生态圈之DevOps理论与实践系列文章

云原生生态圈之Kubernetes理论与实践系列文章

云原生生态圈之Go语言系列文章 技术源于生活系列视频

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5.1K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
Kubernetes面试题
1、简述ETCD及其特点? etcd是一个分布式的、高可用的、一致的key-value存储数据库,基于Go语言实现,主要用于共享配置和服务发现。 特点: 完全复制:集群中的每个节点都可以使用完整的存档
院长技术
2022/03/11
1.1K0
Kubernetes 常见的面试题总结分享
etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。
kubernetes中文社区
2021/06/21
1.2K0
k8s实践(1)--k8s集群入门介绍和基础原理
1、简单了解集群的工作原理和基础概念,名词解释。 2、安装etcd集群:etcd分布式键值存储系统,用于保持集群状态,比如Pod、Service等对象信息。 3、安装k8s集群,简单了解集群的如何工作。 4、搭建集群网络:基础网络搞好,后面才能顺利部署各种资源。 5、学习k8s的安全、Secrets,ssl认证。如果安全认证没有搞好,创建pod和service都会报各种错误。 6、然后我们深入学习pod和service。 7、深入学习集群工作原理分析,从基础到深度,才能学的扎实。 8、有了pod和service,就需要知道如果发现,学习coreDNS 9、开始部署一些有状态的服务 10、案例实践
黄规速
2022/04/14
1.9K0
k8s实践(1)--k8s集群入门介绍和基础原理
Kubernetes 系列(1) —— Kubernetes 的基本概念
Kubernetes 架构是一个比较典型的二层架构和 server-client 架构。Master 作为中央的管控节点,会去与 Node 进行一个连接。
求和小熊猫
2021/03/20
4390
IT运维面试问题总结-LVS、Keepalived、HAProxy、Kubernetes、OpenShift等
etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。
杰哥的IT之旅
2020/10/23
5.5K1
关于 Kubernetes中kube-controller-managerr的一些笔记
Kubernetes 控制器管理器是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 控制回路是一个永不休止的循环(所以说K8S中的控制管理器是一个死循环),用于调节系统状态。
山河已无恙
2023/03/02
4980
Kubernetes K8S 基本概述、设计架构和设计理念
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署、规划、更新、维护的一种机制。
踏歌行
2020/10/15
3.5K0
Kubernetes K8S 基本概述、设计架构和设计理念
k8s实践(10) -- Kubernetes集群运行原理详解
Kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(如Pod、RC、Service等)的增、删、改、查及Watch等HTTP Rest接口,成为集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。除此之外,它还有以下一些功能特性:
黄规速
2022/04/14
2.6K0
k8s实践(10) -- Kubernetes集群运行原理详解
Kubernetes组件之kube-controller-manager
Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
菲宇
2019/06/12
1.2K0
Kubernetes组件之kube-controller-manager
Kubernetes 编排系统
1.1 Kubernetes简介 1.1.1 什么是Kubernetes Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用于自动部署、扩展和管理
惨绿少年
2018/03/30
3.1K1
[Kubernetes](二)Kubernetes核心组件解读(上)
Kubernetes由两种节点组成:master节点和工作节点,前者是管理节点,后者是容器运行的节点。其中master节点中主要有3个重要的组件,分别是APIServer,scheduler和controller manager。APIServer组件负责响应用户的管理请求、进行指挥协调等工作;scheduler的作用是将待调度的pod绑定到合适的工作节点上;controller manage提一组控制器的合集,负责控制管理对应的资源,如副本(replication)和工作节点(node)等。工作节点上运行了两个重要组件,分别为kubelet和kube-proxy。前者可以被看作一个管理维护pod运行的agent,后者则负责将service的流量转发到对应的endpoint。在实际生产环境中,不少用户都弃用了kube-proxy,而选择了其他的流量转发组件。
baron
2019/12/05
1.1K0
Kubernetes 概念介绍
​ Master指的是集群控制节点,在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它负责具体的执行过程,我们后面执行的所有命令基本都是在Master上运行的
星哥玩云
2022/09/15
4370
k8s必学必会知识梳理
对外暴露了Kubernetes API。它是的 Kubernetes 核心控制层。它被设计为水平扩展,即通过部署更多实例来横向扩展。API Server 负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),是整个 kubernetes 集群的数据中心,所有的交互都是以 API Server 为核心的。API Server 提供了以下的功能:
我的小碗汤
2019/07/30
2K0
Kubernetes架构原来这么简单
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
用户1107783
2023/09/14
1.5K0
Kubernetes架构原来这么简单
【容器之集群管理】kubernetes初识
什么是Kubernetes Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。而且Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台上运行,也可以直接部署在物理主机上。 ---- 举个例子: openstack用来管理虚拟化(kvm、xen、vmware等) kubernetes用来管理容器(docker) Kubernetes概念(角色)组成 Pod
小小科
2018/05/04
1.2K0
【容器之集群管理】kubernetes初识
Kubernetes 入门之知识点梳理
最近在挺哥的指导下学习 Kubernetes,会定期写一些学习总结和大家分享,本篇文章是第一篇,从介绍 k8s 知识点和常见名词开始。
CS实验室
2021/03/22
7160
Kubernetes 入门之知识点梳理
001.Kubernetes简介
Kubernetes是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
木二
2019/07/26
7830
【重识云原生】第六章容器6.2.1节——Kubernetes概述
        为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,便诞生了容器技术。容器管理类似于虚拟机管理,主要用于容器的创建、启动、关闭、删除等容器生命周期的管理。常见的容器管理工具有:
江中散人_Jun
2022/09/28
7960
【重识云原生】第六章容器6.2.1节——Kubernetes概述
Kubernetes架构和组件
核心组件组成: kubectl: 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。 kube-apiserver: 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;这是kubernetes API,作为集群的统一入口,各组件协调者,以HTTPAPI提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。 kube-scheduler: 资源调度,按照预定的调度策略将Pod调度到相应的机器上;它负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。它会根据调度算法为新创建的Pod选择一个Node节点。 kube-controller-manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;它用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等, 一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。 etcd: 集群的主数据库,保存了整个集群的状态; etcd负责节点间的服务发现和配置共享。etcd分布式键值存储系统, 用于保持集群状态,比如Pod、Service等对象信息。 kubelet: 负责维护容器的生命周期,负责管理pods和它们上面的容器,images镜像、volumes、etc。同时也负责Volume(CVI)和网络(CNI)的管理;kubelet运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver; kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。 container runtime: 负责镜像管理以及Pod和容器的真正运行(CRI); kube-proxy: 负责为Service提供cluster内部的服务发现和负载均衡;它运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。它在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。 docker或rocket(rkt): 运行容器。 其中: master组件包括: kube-apiserver, kube-controller-manager, kube-scheduler; Node组件包括: kubelet, kube-proxy, docker或rocket(rkt); 第三方服务:etcd
MySQL轻松学
2021/01/12
6550
Kubernetes架构和组件
推荐阅读
相关推荐
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档