基本资源故障,包括模拟Pod失效,网络失效,DNS失效,HTTP通信延迟,CPU或内存使用高负荷,文件读写失效,时间跳跃异常,应用内存分配异常等。 平台故障,包括模拟AWS或GCP节点重启。 实验工作流 实验工作流,包括编排顺序或并行执行的故障注入实验,查看实验状态和结果,暂停实验,支持用YAML或Web UI定义和管理实验。 可视化操作 可视化操作,包括可以在Web UI上点击鼠标,定义实验的范围、故障注入类型和调度规则,最后能展示实验结果。 安全控制 安全控制,包括使用K8S原生提供的基于角色的访问控制功能,来管理故障注入的使用权限。还可以通过设置命名空间注解,来指定允许进行混沌实验的命名空间,进一步保障对混沌实验的控制。 使用K8S原生提供的基于角色的访问控制功能,来管理故障注入的使用权限。 劣势 只能在K8S集群上使用。否则,就只能使用针对节点进行故障注入实验的附带工具chaosd。 临时执行的实验会无限期地运行。
[root@k8s-master01 ~]# vim pod-resources.yaml # 再次启动pod [root@k8s-master01 ~]# kubectl create -f pod-resources.yaml pod/pod-resources created # 查看Pod状态,发现Pod启动失败 [root@k8s-master01 ~]# kubectl get pod pod-resources ip,观察pod的变化 [root@k8s-master01 ~]# ifconfig ens33:1 192.168.90.14 netmask 255.255.255.0 up [root@k8s-master01 pod "pod-nodename" deleted [root@k8s-master01 ~]# vim pod-nodename.yaml [root@k8s-master01 ~]# kubectl 的pod在同一Node上 [root@k8s-master01 ~]# vim pod-podaffinity-required.yaml # 然后重新创建pod,查看效果 [root@k8s-master01
基本资源故障,包括模拟Pod失效,网络失效,DNS失效,HTTP通信延迟,CPU或内存使用高负荷,文件读写失效,时间跳跃异常,应用内存分配异常等。 平台故障,包括模拟AWS或GCP节点重启。 实验工作流 实验工作流,包括编排顺序或并行执行的故障注入实验,查看实验状态和结果,暂停实验,支持用YAML或Web UI定义和管理实验。 可视化操作 可视化操作,包括可以在Web UI上点击鼠标,定义实验的范围、故障注入类型和调度规则,最后能展示实验结果。 安全控制 安全控制,包括使用K8S原生提供的基于角色的访问控制功能,来管理故障注入的使用权限。还可以通过设置命名空间注解,来指定允许进行混沌实验的命名空间,进一步保障对混沌实验的控制。 使用K8S原生提供的基于角色的访问控制功能,来管理故障注入的使用权限。 劣势 只能在K8S集群上使用。否则,就只能使用针对节点进行故障注入实验的附带工具chaosd。 临时执行的实验会无限期地运行。
# 什么是pod? Pod是一组共享了某些资源的容器。 而pod是k8s的原子调度,pod中的容器可以指定分配到同一个节点,统一按照资源调度。 nginx:laster 再使用kubectl apply来创建pod [root@k8s-worker1 zwf]# kubectl apply -f pod.yaml -n zwf pod/nginx-pod 0 2m51s 10.222.126.60 k8s-worker2 <none> <none> 我们可以使用curl访问到pod中的nginx的服务了 Image: nginx:alpine Image ID: docker-pullable://nginx@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d
上篇文章我们在解析K8S Container时,提到Pod的整个生命周期都是围绕“容器”这个核心进行运转,毕竟,Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,只有弄清楚其底层原理以及实现细节 基于其设计理念,K8S Pod始终在Nodes(节点)上运行。节点是Kubernetes中的工作机,根据集群的不同,它可以是虚拟机也可以是物理机。每个节点由主节点管理。 接下来,我们简单了解下Pod在Node下的运行信息,具体如下图所示: 基于上图,我们可以看到,所有的Pod均运行在Node(节点)上,只有借助节点,才能使得K8S对其进行相关资源调度,从而达到资源配置 接下来,我们再看一下K8S Pod的基本实现原理,再解析原理之前,我们首先了解下Pod的生命周期,只有通过理解Pod 创建、重启和删除的原理,我们才能最终就能够系统地掌握Pod的生命周期与核心原理。 在这里我们先看一下K8S Pod生命周期流程图,具体如下所示: 基于上述流程图,我们可以看出:K8S Pod 被创建之后,首先会进入健康检查状态,当 Kubernetes 确定当前 Pod
Pod管理 增删改查 资源限制 调度约束 重启策略 健康检查 问题定位 以nginx为例 # cat pod.yaml apiVersion: v1 kind: Pod metadata: name create -f pod.yaml pod/nginx-pod created 查看 # kubectl get pods NAME 查看更详细的信息 # kubectl describe pod nginx-pod Name: nginx-pod Namespace: kubernetes-plugin memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" k8s 的restartPolicy来操作 readinessProbe: 如果检查失败,k8s会把pod从service endpoints中剔除 Probe支持三种检查方法: httpGet: 发送HTTP
创建Deployment,SVC 1.创建Deployment 注:它们Pod标签都有app: nginx,service服务发现根据这个标签选择,version是为后面定义版本设置的 kubectl protocol: HTTPS tls: credentialName: all-test.com-credential mode: SIMPLE 根据域名进行路由分发 1.根据Pod ingressgatewayIP) test1.test.com (ingressgatewayIP) test2.test.com 分别访问这两个域名流量对应转到不同版本的Pod
○ ② 为k8s-node1节点设置一个污点:tag=dhy:PreferNoSchedule,然后创建Pod1(Pod1可以)。 ○ ③ 修改k8s-node1节点的污点为:tag=dhy:NoSchedule,然后创建Pod2(Pod1可以正常运行,Pod2失败)。 ○ ④ 修改k8s-node1节点的污点为:tag=dhy:NoExecute,然后创建Pod3(Pod1、Pod2、Pod3失败)。 ● 为k8s-node1设置污点(PreferNoSchedule): kubectl taint node k8s-node1 tag=dhy:PreferNoSchedule 查看Pod: kubectl k8s-node1 tag:PreferNoSchedule- kubectl taint node k8s-node1 tag=dhy:NoSchedule ---- 创建Pod2: kubectl
删除 Evicted 状态的pod [root@hadoop03 kubernetes]# kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod pod "glusterfs-2p28b" deleted [root@hadoop03 kubernetes]# kubectl describe pod glusterfs-cpft7 controller-revision-hash=74d67c47f7 glusterfs-node=daemonset pod-template-generation =1 Annotations: <none> Status: Failed Reason: Evicted Message: Pod The node
Kubernetes Scheduler K8S调度器,负责监听新创建、尚未分配到计算节点的Pod;K8S调度器最重要的职责就是为每一个Pod找到最适合其运行的计算节点。 kube-scheduler kube-scheduler是K8S集群默认的调度器,如果你愿意,也可以自己写一个调度组件来替代kube-scheduler,在实际应用中,kube-scheduler也有许多不尽如人意的地方 99%A8%E8%B0%83%E5%BA%A6.png? Pod间亲和性策略,是为了让Pod之间更好系统,哪些Pod运行在同一节点会更好,哪些Pod一定要分开,避免享互影响。 raw=true] K8S集群内的资源隔离 [85-%E8%B5%84%E6%BA%90%E9%9A%94%E7%A6%BB.png?
宽限期限超时(terminationGracePeriodSeconds=30) 定义Pod:postStart回调后 输出“postStart”到k8s.txt,preStop回调后 输出“preStop ”到k8s.txt apiVersion: v1 kind: Pod metadata: name: pod-nignx-simple-lifecycle spec: containers: preStop: exec: command: ["/bin/sh","-c","echo preStop >> /k8s.txt;sleep 3600;"] ports: - containerPort: 80 为Pod加上启动、就绪、存活探针 定义 存活探针:k8s通过存活探针来确定什么时候要重启容器。 就绪探针:k8s通过就绪探针来判断是否要给流量 启动探针:k8s通过启动探针来了解应用容器何时启动,如果配置了这类探针,那么在这个探针成功之前就不会触发存活和就绪探针,防止程序被频繁kill 存活探针:
示例 apiVersion: v1 kind: Pod metadata: name: counter spec: containers: - name: count image: 查看pod的时间 kubectl exec pod/counter date 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100334.html原文链接:
k8s配置文件一般使用yaml格式进行编写,所以后续的范例都是这样的。 Pod的介绍 基本介绍 在 Kubernetes 中,Pod(容器组)是最小的可调度和可部署的单元。 Pod 具有以下特点: 调度单元:Pod 是 Kubernetes 中最小的调度单元,调度器将一个 Pod 分配给一个可用的节点来运行。 当 Pod 被删除时,它内部的所有容器也会被终止。 Pod 有以下几种常见的使用方式: 单容器 Pod:一个 Pod 中只包含一个容器,用于运行一个独立的应用程序服务。 无状态 Pod:Pod 中的容器不需要保持任何状态,所有数据都来自外部存储(如数据库)或者共享数据卷。 有状态 Pod:Pod 中的容器需要保持一些状态,例如使用本地存储或者共享存储卷存储数据。 这个命令会在你的 Kubernetes 集群中创建一个名为two-containers-pod的 Pod,该 Pod 内运行两个容器。
前两天,我们是开发获取node相关的信息的模块,今天我们就来看看如何使用go开发获取k8s集群中pod相关的信息。 示例代码可以借助AI生成或者自己查资料编写,这里先给出go调用k8s集群的pod接口的代码: package main import ( "context" "fmt" "os" "path/filepath " "time" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir : %s\n", pod.Name, pod.Namespace, pod.Status.Phase) } time.Sleep(10 * time.Second) //添加一个 sleep,防止程序立即退出 } 运行结果如下,可以看到这里有pod的名字、命名空间以及运行状态: 我们知道K8s集群大部分操作都可以通过kubectl 命令行接口或类似 kubeadm 这类命令行工具来执行, 这些工具在背后也是调用
pod 在k8s中,最小单元就是pod了,程序运行部署在容器中,而容器必须存在于pod中 pod可以认为是容器的封装,一个pod可以存放一个或者多个容器: root@master:/home/tioncico RESTARTS AGE go-deployment-86f769995d-frw28 1/1 Running 0 38s nginx-7cbb8cd5d8 AGE default Active 18d //默认的命名空间,没有声明的都会在默认 kube-flannel Active 18d //k8s flannel插件 kube-node-lease Active 18d //集群节点心跳维护 kube-public Active 18d //k8s公共资源你 ,可以被所有人访问 kube-system Active 18d //k8s系统创建的资源 kubernetes-dashboard Active 18d //k8s
k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器。 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等。本文将会更进一步的介绍pod。 基础 为什么需要pod? pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口。 为什么k8s要设计出Pod这个概念并作为最小调度单元呢? Pod通信 k8s为每个pod都分配了唯一的IP地址,称之为pod IP,一个pod中的多个容器共享Pod IP地址,属于同一个pod的多个应用之间相互访问时仅通过localhost就可以通信。 k8s底层支持集群内任意两个pod之间的TCP/IP直接通信,因此,在k8s中,一个pod中的容器可以与另外主机上的pod里的容器直接通信。
Litmus 最初是 OpenEBS(K8S下存储系统) 的测试工具,后来发展成为知名的 Kubernetes 原生混沌工程开源平台。 创建者 MayaData 一句话介绍 LitmusChaos 是一个在故障创建与编排方面更胜一筹的K8S混沌工程开源平台,如提供故障注入实验库 ChaosHub,使团队能够以受控方式,引入故障注入实验来识别基础设施中的弱点和潜在停机隐患 通用实验,包括pod-delete、pod-dns-error、container-kill、pod-cpu-hog、pod-network-corruption、pod-memory-hog、pod-network-latency 可使用 Prometheus 数据源中的交错事件和指标实时监控故障注入实验的影响。 K8S多租户 Kubernetes 命名空间可用作 Kubernetes 上个人开发人员的完全托管环境。 适用平台 K8S 适用场景 对于开发人员:在应用程序开发过程中运行故障注入实验,作为单元测试或集成测试的扩展。
Litmus 最初是 OpenEBS(K8S下存储系统) 的测试工具,后来发展成为知名的 Kubernetes 原生混沌工程开源平台。 图片创建者MayaData一句话介绍LitmusChaos 是一个在故障创建与编排方面更胜一筹的K8S混沌工程开源平台,如提供故障注入实验库 ChaosHub,使团队能够以受控方式,引入故障注入实验来识别基础设施中的弱点和潜在停机隐患 通用实验,包括pod-delete、pod-dns-error、container-kill、pod-cpu-hog、pod-network-corruption、pod-memory-hog、pod-network-latency 可使用 Prometheus 数据源中的交错事件和指标实时监控故障注入实验的影响。K8S多租户Kubernetes 命名空间可用作 Kubernetes 上个人开发人员的完全托管环境。 适用平台K8S适用场景对于开发人员:在应用程序开发过程中运行故障注入实验,作为单元测试或集成测试的扩展。
根据 Pid 获取 K8s Pod 名称 脚本工具 $ vim pod_name_info.sh #! () { CID=`cat /proc/${pid}/cgroup | head -1 | awk -F '/' '{print $5}'` CID=$(echo ${CID:0:8}) docker 通过 Pid 获取 Pod 名称 上面脚本是根据 Pid 来获取 Pod 名称,但有时想通过 Pod 名称来获取 Pid,这又怎么获取了,接着看下文。 根据 Pod 名称获取 Pid 脚本工具 $ vim pod_pid_info.sh #! /pod_pid_info.sh Pod名称 下面展示输出结果 ? 通过 Pod名称 获取 Pid
首先给node节点添加标签: kubectl label node k8s-node1 nodeevn=pro kubectl label node k8s-node2 nodeenv=test 创建pod-nodeselector.yaml 为k8s-node1节点设置一个污点:tag=xudaxian:PreferNoSchedule,然后创建Pod1(Pod1可以)。 修改k8s-node1节点的污点为:tag=xudaxian:NoSchedule,然后创建Pod2(Pod1可以正常运行,Pod2失败)。 修改k8s-node1节点的污点为:tag=xudaxian:NoExecute,然后创建Pod3(Pod1、Pod2、Pod3失败)。 为k8s-node1设置污点(PreferNoSchedule): kubectl taint node k8s-node1 tag=xudaxian:PreferNoSchedule 创建Pod1: