【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

了解 kubelet:Kubernetes 节点的守护进程的深入解读 (了解昆虫的知识)

用户投稿2024-04-09热门资讯21

简介

kubelet 是 Kubernetes 节点上的一个守护进程,负责管理该节点上的容器。它负责将 Pod 调度到节点上并确保它们保持运行状态。kubelet 还负责收集节点资源利用率和事件等健康指标。

架构

kubelet 的架构包含以下组件:
  • kubelet 二进制文件:这是 kubelet 程序本身。
  • 容器运行时:例如 Docker、containerd 或 CRI-O。
  • cAdvisor:用于收集容器和节点资源利用率指标。
  • Pod 管理器:负责管理节点上的 Pod。
  • 网络插件:用于配置节点上的网络。例如,Flannel、Calico 或 Weave Net。

kubelet 的职责

kubelet 负责执行以下职责:
  • 将 Pod 调度到节点上。
  • 启动和停止容器。
  • 监控容器的健康状况并重新启动失败的容器。
  • 收集节点资源利用率和事件等健康指标。
  • 提供一个API,允许其他组件(例如 kubectl)与 kubelet 交互。

配置 kubelet

kubelet 的配置通过以下文件进行:
  • /etc/kubernetes/kubelet.conf:这是 kubelet 的主配置文件。
  • /etc/kubernetes/manifests/:这是存储用于在节点上部署的 Pod 清单文件的位置。

故障排除 kubelet

如果 kubelet 出现问题,可以使用以下方法进行故障排除:
  • 检查 /var/log/kubelet.log 以查找错误消息。
  • 使用 kubectl get pods 命令检查 Pod 的状态。
  • 使用 kubectl describe node 命令检查节点的状态。
  • 使用 kubectl logs kubelet 命令查看 kubelet 日志。

最佳实践

以下是可以优化 kubelet 性能和可靠性的最佳实践:
  • 使用 kubelet 的健康检查功能来监控容器的健康状况。
  • 将 kubelet 配置为定期轮询 Kubernetes API 服务器以查找Pod 更新。
  • 使用 kubelet 的证书管理功能来管理 TLS 证书。
  • 使用 kubelet 的授权功能来限制对 kubelet API 的访问。

结论

kubelet 是 Kubernetes 集群中一个至关重要的组件,负责管理节点上的容器。通过理解其架构、职责和配置,您可以优化 kubelet 在您的集群中的性能和可靠性。

什么是K8S?

k8s是什么?

Kubernetes 是一个可移植的,可扩展的开源容器编排平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务,支持和工具广泛可用。

为什么现在流行使用容器?

早期: 在物理服务器上面部署应用程序存在资源分配问题,因为其不能在物理服务器中的应用程序定义资源边界,导致应用程序资源利用不足而无法扩展.

后来: 为了解决该问题,引入了虚拟化技术, 虚拟化技术是指允许你在单个物理服务器的 CPU 上运行多个虚拟机,可以让多个应用程序在虚拟机之间进行隔离,具有一定的安全性, 每一个虚拟机就是一台完整的计算机, 在虚拟化硬件之上运行所有组件.

现在: 多数在物理服务器上面部署应用程序都是采kubectl用容器的方式,容器类似于虚拟机,它们都具有自己的文件系统、CPU、内存、进程空间等, 且由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。基于此特点被企业大范围使用.

为什么需要使用k8s容器?

若出现这样一个环境: 在生产环境中如果一个容器发生故障,则我们需要手动去启动另外一个容器,这样的操作是对我们的管理员来说是不太方便的, 若一个容器出现故障,另一个容器可以自动启动容器接管故障的容器,这样是最好的.

k8s就可以实现该效果,Kubernetes 提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。

k8s功能: 服务发现和负载均衡, 存储编排, 自动部署和回滚, 自动完成装箱计算, 自我修复, 密钥与配置管理

名词解释

Secret有三种类型:

k8s的组成

k8s是由组件,API,对象等组成.

包含所有相互关联组件的 Kubernetes 集群图如下:

组件

Kubernetes 控制面 的核心是 API 服务器。 API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。

对象

Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态.

具体来说,他们可以描述:

Kubernetes 架构

Kubernetes 架构由节点,控制面到节点通信, 控制器, 云控制器管理器组成.

master 流程图

节点

节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pods 所需的服务, 这些 Pods 由 控制面 负责管理.

节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。

节点状态

可以使用 kubectl 来查看节点状态和其他细节信息:

kubectl describe node <�节点名称>

一个节点包含以下信息:

控制面到节点通信

控制器

在 Kubernetes 中,控制器通过监控集群 的公共状态,并致力于将当前状态转变为期望的状态。

举个例子: 当前室内温度为20度, 我们通过调节遥控器,使其温度上升至24度, 这20度到24度的变化即为让其从当前状态接近期望状态。

控制器模式分为直接控制和通过API服务器来控制.

云控制器管理器

云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您链接聚合到云提供商的应用编程接口中, 并分离出相互作用的组件与您的集群交互的组件。

云控制器管理器中的控制器包括:

Kubernetes 安全性

云原生安全

云原生安全4个C: 云(Cloud)、集群(Cluster)、容器(Container)和代码(Code)

云原生安全模型的每一层都是基于下一个最外层,代码层受益于强大的基础安全层(云、集群、容器)。我们无法通过在代码层解决安全问题来为基础层中糟糕的安全标准提供保护。

基础设施安全

Kubetnetes 基础架构关注领域

建议

通过网络访问 API 服务(控制平面)

所有对 Kubernetes 控制平面的访问不允许在 Internet 上公开,同时应由网络访问控制列表控制,该列表包含管理集群所需的 IP 地址集。

通过网络访问 Node(节点)

节点应配置为 仅能 从控制平面上通过指定端口来接受(通过网络访问控制列表)连接,以及接受 NodePort 和 LoadBalancer 类型的 Kubernetes 服务连接。如果可能的话,这些节点不应完全暴露在公共互联网上。

Kubernetes 云访问提供商的 API

每个云提供商都需要向 Kubernetes 控制平面和节点授予不同的权限集。为集群提供云提供商访问权限时,最好遵循对需要管理的资源的最小特权原则。Kops 文档提供有关 IAM 策略和角色的信息。

访问 etcd

对 etcd(Kubernetes 的数据存储)的访问应仅限于控制平面。根据配置情况,你应该尝试通过 TLS 来使用 etcd。更多信息可以在 etcd 文档中找到。

etcd 加密

在所有可能的情况下,最好对所有驱动器进行静态数据加密,但是由于 etcd 拥有整个集群的状态(包括机密信息),因此其磁盘更应该进行静态数据加密。

集群组件安全

容器安全

代码安全

Kubernetes架构常见问题

Kubernetes ATTACK 矩阵

信息泄露

云账号AK泄露

API凭证(即阿里云AccessKey)是用户访问内部资源最重要的身份凭证。用户调用API时的通信加密和身份认证会使用API凭证.

API凭证是云上用户调用云服务API、访问云上资源的唯一身份凭证。

API凭证相当于登录密码,用于程序方式调用云服务API.

k8s configfile泄露

kubeconfig文件所在的位置:

$HOME//config

Kubeconfig文件包含有关Kubernetes集群的详细信息,包括它们的位置和凭据。

云厂商会给用户提供该文件,以便于用户可以通过kubectl对集群进行管理. 如果攻击者能够访问到此文件(如办公网员工机器入侵、泄露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。

Master节点SSH登录泄露

常见的容器集群管理方式是通过登录Master节点或运维跳板机,然后再通过kubectl命令工具来控制k8s。

云服务器提供了通过ssh登陆的形式进行登陆master节点.

若Master节点SSH连接地址泄露,攻击者可对ssh登陆进行爆破,从而登陆上ssh,控制集群.

容器组件未鉴权服务

Kubernetes架构下常见的开放服务指纹如下:

注:前六个重点关注: 一旦被控制可以直接获取相应容器、相应节点、集群权限的服务

了解各个组件被攻击时所造成的影响

组件分工图:

假如用户想在集群里面新建一个容器集合单元, 流程如下:

攻击apiserver

apiserver介绍:在Kubernetes中,对于未鉴权对apiserver, 能访问到 apiserver 一般情况下就能获取了集群的权限.

了解 kubelet:Kubernetes 节点的守护进程的深入解读 (了解昆虫的知识) 第1张

在攻击者眼中Kubernetes APIServer

默认情况下apiserver都有鉴权:

未鉴权配置如下:

对于这类的未鉴权的设置来说,访问到 apiserver 一般情况下就获取了集群的权限:

如何通过apiserver来进行渗透,可参考:攻击kubelet

每一个Node节点都有一个kubelet(每个节点上运行的代理)服务,kubelet监听了,,等端口。

端口,是kubelet与apiserver进行通信对主要端口, 通过该端口,kubelet可以知道当前应该处理的任务.该端口在最新版Kubernetes是有鉴权的, 但在开启了接受匿名请求的情况下,不带鉴权信息的请求也可以使用提供的能力, 在Kubernetes早期,很多挖矿木马基于该端口进行传播.

在配置文件中,若进行如下配置,则可能存在未授权访问漏洞.

/var/bin/kubulet/config/yaml

若端口存在未授权访问漏洞,我们可以直接访问/pods进行查看

根据在pods中获取的信息,我们可以在容器中执行命令

curl -Gks{namespace}/{podname}/{containername} \-d input=1 -d output=1 -d tty=1 \-d command=whoami

上述命令得到websocket地址,连接websocket得到命令结果:

使用wscat工具连接websocket

wscat -c “{websocket}” --no-check

即可得到我们执行命令的结果.

获取token

/var/run/secrets//serviceaccount

然后即可访问kube-api server,获取集群权限

curl -ks -H Authorization: Bearer \ ttps://master:6443/api/v1/namespaces/{namespace}/secrets

攻击kubelet总体步骤如下:

攻击dashboard

dashboard登陆链接如下:

界面如下:

dashboard是Kubernetes官方推出的控制Kubernetes的图形化界面.在Kubernetes配置不当导致dashboard未授权访问漏洞的情况下,通过dashboard我们可以控制整个集群。

默认情况下, dashboard是需要进行鉴权操作的,当用户开启了enable-skip-login时可以在登录界面点击Skip跳过登录进入dashboard.

通过skip登陆的dashboard默认是没有操作集群的权限,因为Kubernetes使用RBAC(Role-based access control)机制进行身份认证和权限管理,不同的serviceaccount拥有不同的集群权限。

但有些开发者为了方便或者在测试环境中会为Kubernetes-dashboard绑定cluster-admin这个ClusterRole(cluster-admin拥有管理集群的最高权限).

为Kubernetes-dashboard绑定cluster-admin 设置如下:

后通过skip登陆dashboard便有了管理集群的权限.

创建Pod控制node节点,该pod主要是将宿主机根目录挂载到容器tmp目录下。

新建一个Pod如下:

通过该容器的tmp目录管理node节点的文件

攻击etcd

Kubernetes默认使用了etcd v3来存储数据, 若能naetcd对内暴露2379端口,本地127.0.0.1可免认证访问. 其他地址要带—endpoint参数和cert进行认证。

未授权访问流程:

攻击docker remote api(Docker daemon公网暴露)

2375是docker远程操控的默认端口,通过这个端口可以直接对远程的docker 守护进程进行操作。Docker 守护进程默认监听2375端口且未鉴权.

当机器以方式启动daemon时,可以在外部机器对该机器的docker daemon进行直接操作:

docker daemon -H=0.0.0.0:2375

之后依次执行systemctl daemon-reload、systemctl restart docker

外部主机使用 即可操作暴露2375端口的主机.

因此当你有访问到目标Docker API 的网络能力或主机能力的时候,你就拥有了控制当前服务器的能力。我们可以利用Docker API在远程主机上创建一个特权容器,并且挂载主机根目录到容器.

检测目标是否存在docker api未授权访问漏洞的方式也很简单,访问路径是否含有ContainersRunning、DockerRootDir等关键字。

攻击kubectl proxy

二次开发所产生的问题

管理Kubernetes无论是使用 kubectl 或 Kubernetes dashboard 的UI功能,其实都是间接在和 APIServer 做交互.

如果有需求对k8s进行二次开发的话,大部分的开发功能请求了 APIServer 的 Rest API 从而使功能实现的。

例如:

K8S的广泛应用

关键组件与功能

K8S生态系统丰富,包括Pod、Service、Namespace等核心概念,以及Controller(如Deployment、StatefulSet)和扩展工具(如Ingress Controller、DNS和监控工具)。

实战部署与配置

实用工具与最佳实践

Kubernetes凭借其强大且灵活的框架,为企业级应用提供了可靠和高效的容器化解决方案。不断发展的社区和丰富的开源项目,如Grafana和Fluentd,确保了K8S的持续优化和扩展性。

kubernetes 的master节点挂了对整个集群有什么影响

架构都知道Master节点在整个集群中的位置,为了保证整个架构的高可用,提供了HA的架构,处于兴趣和对架构的进一步了解,我在自己的电脑实践以下.环境:CentOS 7.3,版本Client Version: {Major:1, Minor:5, GitVersion:v1.5.1, GitCommitd03cb057babef122b67c83fb11df, GitTreeState:clean, BuildDate:2016-12-14T00:57:05Z, GoVersion:go1.7.4, Compiler:gc, Platform:linux/amd64}Server Version: {Major:1, Minor:5, GitVersion:v1.5.1, GitCommitd03cb057babef122b67c83fb11df, GitTreeState:clean, BuildDate:2016-12-14T00:52:01Z, GoVersion:go1.7.4, Compiler:gc, Platform:linux/amd64}主机环境 /etc/hosts192.168.0.107k8s-master1192.168.0.108k8s-master2192.168.0.109k8s-master31.搭建ETCD的集群?禁止selinux以及防火墙setenforce 0systemctl stop firewalldsystemctl disable firewalld?安装软件包yum -y install ntppdate gcc git vim wget?配置定时更新*/5 * * * * /usr/sbin/ntpdate >/dev/null 2>&1?下载安装包cd /usr/srcwget-xvf/usr/local/bin?编写一个的脚本,并运行#!/bin/bash# Copyright 2014 The Authors.## Licensed under the Apache License, Version 2.0 (the License);# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an AS IS BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.## Create , , and start etcd _NAME=`hostname`ETCD_DATA_DIR=/var/lib/etcdETCD_CONF_DIR=/etc/etcdETCD_CLUSTER=k8s-master1=.107:2380,k8s-master2=.108:2380,k8s-master3=.109:2380ETCD_LISTEN_IP=`ip addr show enp0s3 |grep -w inet |awk -F {print $2} |awk -F / {print $1}`#useradd etcdmkdir -p $ETCD_DATA_DIR $ETCD_CONF_DIRchown -R $ETCD_DATA_DIRcat <<EOF >/etc/etcd/# [member]ETCD_NAME=${ETCD_NAME}ETCD_DATA_DIR=/var/lib/etcd/#ETCD_WAL_DIR=ETCD_SNAPSHOT_COUNT=ETCD_HEARTBEAT_INTERVAL=100ETCD_ELECTION_TIMEOUT=1000ETCD_LISTEN_PEER_URLS= http:// ${ETCD_LISTEN_IP}:2380ETCD_LISTEN_CLIENT_URLS= http:// ${ETCD_LISTEN_IP}:2379ETCD_MAX_SNAPSHOTS=5ETCD_MAX_WALS=5#ETCD_CORS=##[cluster]ETCD_INITIAL_ADVERTISE_PEER_URLS= http:// ${ETCD_LISTEN_IP}:2380# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. test=${ETCD_CLUSTER}ETCD_INITIAL_CLUSTER_STATE=newETCD_INITIAL_CLUSTER_TOKEN=etcd-clusterETCD_ADVERTISE_CLIENT_URLS= http:// ${ETCD_LISTEN_IP}:2379#ETCD_DISCOVERY=#ETCD_DISCOVERY_SRV=#ETCD_DISCOVERY_FALLBACK=proxy#ETCD_DISCOVERY_PROXY=#ETCD_STRICT_RECONFIG_CHECK=false#ETCD_AUTO_COMPACTION_RETENTION=0##[proxy]#ETCD_PROXY=off#ETCD_PROXY_FAILURE_WAIT=5000#ETCD_PROXY_REFRESH_INTERVAL=#ETCD_PROXY_DIAL_TIMEOUT=1000#ETCD_PROXY_WRITE_TIMEOUT=5000#ETCD_PROXY_READ_TIMEOUT=0##[security]#ETCD_CERT_FILE=#ETCD_KEY_FILE=#ETCD_CLIENT_CERT_AUTH=false#ETCD_TRUSTED_CA_FILE=#ETCD_AUTO_TLS=false#ETCD_PEER_CERT_FILE=#ETCD_PEER_KEY_FILE=#ETCD_PEER_CLIENT_CERT_AUTH=false#ETCD_PEER_TRUSTED_CA_FILE=#ETCD_PEER_AUTO_TLS=false##[logging]#ETCD_DEBUG=false# examples for -log-package-levels etcdserver=WARNING,security=DEBUG#ETCD_LOG_PACKAGE_LEVELS=EOFcat <<EOF >//usr/lib/systemd/system/[Unit]Description=Etcd ServerAfter===[Service]Type=notifyWorkingDirectory=/var/lib/etcd/EnvironmentFile=-/etc/etcd/=etcd# set GOMAXPROCS to number of processors#ExecStart=/bin/bash -c GOMAXPROCS=$(nproc) /usr/local/bin/etcd --name=\${ETCD_NAME}\ --data-dir=\${ETCD_DATA_DIR}\ --listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS}\ExecStart=/bin/bash -c GOMAXPROCS=$(nproc) /usr/local/bin/etcdRestart=on-failureLimitNOFILE=[Install]WantedBy=?运行如下命令systemctl daemon-reloadsystemctl enable etcdsystemctl restart etcdetcdctl cluster-health?发现如下错误:[root@k8s-master1 ~]# etcdctl cluster-healthcluster may be unhealthy: failed to list membersError:client: etcd cluster is unavailable or misconfigurederror #0: dial tcp 127.0.0.1:2379: getsockopt: connection refusederror #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused原因是etcdctl总是去找本地的地址,指定endpoint,输出如下:[root@k8s-master1 ~]# etcdctl -endpoints .107:2379,.108:2379,.109:2379cluster-healthmember 1578ba76eb3abe05 is healthy: got healthy result from .108:2379member beb7fd3596aa26eb is healthy: got healthy result from .109:2379member e6bdc10ee00 is healthy: got healthy result from .107:2379cluster is healthy?默认master和etcd部署在同一台设备,共三台相互冗余?通过HFS启动个http server,安装节点会从这里拉取镜像和rpm先下载hfs,因为我是在windows 7的主机环境,所以下载一个windows版本,启动以后,将下载的目录和文件都拖到hfs界面中,如图关掉windows防火墙.修改脚本,修改的地方如下HTTP_SERVER=192.168.0.103:8000...#master侧不需要修改成ip,保持原来的$(master_ip)就可以,但replicate侧需要修改,具体原因还需要查kube::copy_master_config(){local master_ip=$(etcdctl get ha_master)mkdir -p /etc/ -r [email protected]:/etc//* /etc//systemctl start kubelet}?Master节点curl -L .101:8000/ | bash -s master \--api-advertise-addresses=192.168.0.110 \--external-etcd-endpoints=.107:2379,.108:2379,.109:2379?192.168.0.101:8000 是我的http-server, 注意要将 里的HTTP-SERVER变量也改下?–api-advertise-addresses 是VIP地址?–external-etcd-endpoints 是你的etcd集群地址,这样kubeadm将不再生成 manifest文件

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

了解 kubelet:Kubernetes 节点的守护进程的深入解读 (了解昆虫的知识) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-17,14:53:42 你第14访问网站的时间为:24-05-17 14:53:43