kubernetes二进宫系列——关于static pod的相关研究

目录

1、为什么忽然想到静态pod

2、何为静态pod

3、为什么需要静态pod

4、静态pod以什么形式部署

5、非kubeadm部署方式如何配置


1、为什么忽然想到静态pod

日常学习k8s都是采用二进制部署方式,统一规划集群核心组件配置文件目录为/opt/kubernetes/cfg/*,实际环境采用kubeadm部署时核心组件配置文件存放在/etc/kubernetes/manifests里面。

为什么这三个核心组件部署文件单独存放在这里?该目录是否只是随机自定义?我如何找到这个目录?于是static pod出现了。

 

2、何为静态pod

静态pod是kubelet直接启动的pod, k8s系统pod就是静态pod

动态pod是apiserver控制下启动的pod

在Kubernetes中有一个DaemonSet类型的POD,这种类型的POD可以在某个节点上长期运行,这种类型的POD就是静态POD。静态POD直接由某个节点上的kubelet程序进行管理,不需要api server介入,静态POD也不需要关联任何RC,完全是由kubelet程序来监控,当kubelet发现静态POD停止掉的时候,重新启动静态POD。

3、为什么需要静态pod

Node上需要的应当持续运行的长期设施,比如在环境部署时使用静态Pod实现一部分核心组件。结合实际就是kube-apiserver、kube-controller-manager、kube-scheduler之类,他们需要固定的部署在相应节点上还不能被驱逐,static pod不受健康检查影响。

那么为什么kubelet不以容器形式部署呢?由于kubelet在配置容器网络、管理容器数据卷时,都需要直接操作宿主机,而如果现在 kubelet 本身就运行在一个容器里,那么直接操作宿主机就会变得很麻烦。

4、静态pod以什么形式部署

kubelet启动参数“--config”时涉及

由此可见,static pod由kubelet创建更新删除操作,首先查看kubelet状态,找到配置文件

 

我们可以看到—config标签显示

启动参数配置在一个叫/var/lib/kubelet/config.yaml的文件中

 

静态Pod路径配置为/etc/kubernetes/manifests路径

 

由此可见,通过kubelet启动配置参数指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录,并根据目录中的yaml或json文件进行创建操作。

通常四个Master上运行的核心组件是通过此方式进行创建的。

5、非kubeadm部署方式如何配置

需要在kubelet启动参数配置文件中添加如下一行:

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true

修改配置之后需要重启kubelet

systemctl stop kubelet

systemctl daemon-reload

systemctl start kubelet

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用kubernetes-client java获取pod容器内存与CPU使用率,可以按照以下步骤进行操作。 首先,你需要在Java项目中添加kubernetes-client的依赖,例如在pom.xml文件中添加以下代码: ```xml <dependencies> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>9.0.0</version> </dependency> </dependencies> ``` 接下来,你可以使用以下代码获取pod相关信息: ```java import io.kubernetes.client.apis.CoreV1Api; import io.kubernetes.client.custom.Quantity; import io.kubernetes.client.models.V1Container; import io.kubernetes.client.models.V1ContainerStatus; import io.kubernetes.client.models.V1NamespaceList; import io.kubernetes.client.models.V1Pod; import io.kubernetes.client.models.V1PodList; import io.kubernetes.client.models.V1PodMetrics; import io.kubernetes.client.models.V1PodMetricsList; import io.kubernetes.client.util.Config; import java.util.Map; public class KubernetesClientExample { public static void main(String[] args) throws Exception { // 创建Kubernetes客户端 io.kubernetes.client.Configuration config = Config.defaultClientConfig(); io.kubernetes.client.apis.CoreV1Api api = new CoreV1Api(); // 获取pod列表 V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null); for (V1Pod pod : podList.getItems()) { // 获取pod所属的命名空间和名称 String namespace = pod.getMetadata().getNamespace(); String name = pod.getMetadata().getName(); // 获取pod的容器列表和相关状态信息 for (V1Container container : pod.getSpec().getContainers()) { String containerName = container.getName(); V1ContainerStatus containerStatus = pod.getStatus().getContainerStatuses().stream() .filter(status -> status.getName().equals(containerName)) .findFirst().orElse(null); if (containerStatus != null) { // 获取容器的CPU和内存使用率 Map<String, Quantity> usage = containerStatus.getUsage(); Quantity cpuUsage = usage.get("cpu"); Quantity memoryUsage = usage.get("memory"); System.out.println("Namespace: " + namespace + ", Pod: " + name + ", Container: " + containerName + ", CPU Usage: " + cpuUsage + ", Memory Usage: " + memoryUsage); } } } } } ``` 上述代码中,我们首先创建了Kubernetes的客户端,然后通过CoreV1Api实例来获取pod列表。对于每个pod,我们遍历其容器列表,并获取容器的名称以及相关状态信息。在状态信息中,我们可以找到容器的CPU和内存使用率,以及其他相关指标。 需要注意的是,这里获取的是当前时刻的使用率数据,如果你想要定时获取容器的使用率信息,可以使用定时任务等方法来实现。 这是一个简单的示例,你可以根据实际需求和项目结构进行相应的扩展和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情绪零碎碎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值