K8s核心资源对象-Pod(静态Pod)
K8s核心资源对象-Pod(静态Pod) 基于1.25 什么是静态PodStatic Pod在指定Node由kubelet守护进程之间管理,不需要kube-apiserver监管。 kubelete监视每个static Pod(失败之后重启) static Pod只允许在某一个节点上 节点上运行Pod ,API Server是可见的,但是不受到kube-apiserver控制 创建静态Pod有俩种模式:配置文件和HTTP 配置文件:定义标准的Pod,用JSON或者YAML格式存储在指定目录 使用kubelet的”staticPodPath:“ kubelet定期扫描目录,实现Pod 的CRUD 扫描忽略已点号开头的文件 静态Pod的创建流程有三种func: NewSourceFile NewSourceURL NewSourceApiserver 最终通过m.merger.Merge最终合并 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339b...
K8s核心资源对象-Pod(QoS与驱逐顺序)
K8s核心资源对象-Pod(QoS与驱逐顺序) 基于1.25 什么是QoSQos的三个选值: Guaranteed:最严格的最不可怜面临驱逐,保证它们不会退出,直到超过它们的限制或没有可以从节点抢占的低优先级Pod 要求每一个Pod容器都要有limits和requests limits和requests必须相等 Burstable:Pod基于一些请求的下限保证,不需要特定的限制 不指定,使用None,允许Pod可用时候灵活增加资源 当Node资源压力导致Pod被驱逐,只有在所有的BestEffort类型的Pod被驱逐之后,Burstable才会被驱逐 要求至少有一个Pod有CPU requests和limits BestEffort:如果节点面临资源压力,kubelete更愿意驱逐BestEffort的Pod 所有容器都没有limits和requests QoS的计算参与QoS:普通容器和Init容器,临时容器不参与。 流程如下: 把普通容器、Init容器追加到allContainers中 遍历Pod中所有参与计算的容器,获取requets,通过...
K8s核心资源对象-Pod(资源配额与cgroup)
K8s核心资源对象-Pod(资源配额与cgroup) 基于1.25 Pod的资源配额Pod主要通过requetsts和limits设置配额: requests.cpu=250m后,实际上是把cgroup的cpu.shares的值设置了(250/1000)*1024,默认值是1024 limits.cpu=500m,实际上把cgroup的cpu.cfs_quota_us的值设置为(500/1000)*100ms,而cpu.cfs_period_us始终是100ms limits.memory=128Mi,相当于cgroup的memory.limit_in_bytes设置为128 * 1024 * 1024,调度时,只会使用requests.memory=64Mi判断 如果值设置了limits,没指定requests,没有应用准入时机制,requests的值同样会设置limits 生成cgroup资源的流程如下: 初始化Pause容器和其他容器都用调用calculateLinux Resource Func...
Alertmanger-深入理解告警原理
Alertmanger-深入理解告警原理AlertManager架构图 Alert Provider:API收到来自Prometheus的告警,存储到Alert Provider 原理是内置了Map Dispatcher组件: 这是一个单独的goroutine,不断地通过订阅的方式从Alert Provider获取新的告警,并且根据YAML配置的Routing Tree将告警通过Label路由到不同的分组中,以实现告警信息的分组处理 Notification Pipeline组件:顾名思义,这是一个责任链模式的组件,它通过一系列逻辑(如抑制、静默、去重等)来优化告警质量。 在源码中,它是通过一个个实现Stage接口的具有不同功能的实例串联 起来得到的 Silence Provider组件:API层将来自Prometheus服务端的告警信息 存储到Silence Provider上,然后由这个组件实现去重逻辑处理。静默规 则用来关闭部分告警的通知 Notify Provider组件:它是Silence Provider组件的下游,会在本地记录日志,Peers的方式将日...
K8s核心资源对象-Pod(创建流程)
K8s核心资源对象-Pod(创建流程) 基于1.25 如何创建Pod容器通过kubelet 创建 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/kubelet/kuberuntime/kuberuntime_manager.go#L668 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361...
K8s核心资源对象-Pod(Container)
K8s核心资源对象-Pod(Container) 基于1.25 Container相关字段 Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/apis/core/types.go#L2167 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475// Container represents a single container that is expected to be run on the host.type Container struct { // Required: This must be a DNS_LABEL. Each container in a pod must // have ...
K8s核心资源对象-Pod(PodSpec)
K8s核心资源对象-Pod(PodSpec) 基于1.25 什么是PodPod是K8s最小可部署的单元。一个Pod可以有多个容器 每一个Pod,预置了一个Pause容器,其命名空间、IPC、网络和存储资源被Pod中其他容器共享 Ref:https://github.com/kubernetes/api/blob/2be23f6c5a7184af9846ff458a11751765ea2bde/core/v1/types.go#L3721 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261...
K8s核心资源对象- 概述(元数据- metav1.ObjectMeta)
K8s核心资源对象- 概述(元数据- metav1.ObjectMeta) 基于1.25 K8s资源对象K8s中主要按照:工作负载(Workload)、发现和负载均衡(Discovery & LB)、配置和存储(Config & Storage) 下面介绍一下metav1.ObjectMeta的属性 NameName是资源对象的入门属性,但是资源对象不一定是客户端传入的Name PodName Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/kubelet/config/common.go#L52 1234// Generate a pod name that is unique among nodes by appending the nodeName.func generatePodName(name string, nodeName types.NodeName) string { return ...
容器环境-GOMAXPROCS参数设置
容器环境-GOMAXPROCS参数设置 GOMAXPROCS通过设定 GOMAXPROCS,用户可以调整调度器中 Processor(简称P)的数量。由于每个系统线程,必须要绑定 P ,P 才能把G交给 M 执行。所以 P 的数量会很大程度上影响 Go Runtime 的并发表现。GOMAXPROCS 在版本 1.5后的默认值是机器的 CPU 核数 (runtime.NumCPU) 设置GOMAXPROCS1234567891011121314package mainimport ( "fmt" "runtime")func main() { n := runtime.NumCPU() // 获取机器的CPU核心数 fmt.Printf("NumCPU: %d\n", n) if n > 0 { runtime.GOMAXPROCS(n) // 设置GOMAXPROCS为CPU核心数 }} 容器内运行输出的是宿主机的CPU...
Go-Options模式
Go-Options模式Options模式Options模式可以让具有多个可选参数的函数或者方法更整洁和好扩展,当一个函数具有五六个甚至十个以上的可选参数时使用这种模式的优势会体现的很明显 问题当我们发送一个Http请求,可能需要携带很多参数。比如: 1func HttpRequest(method string, url string, body []byte, headers map[string]string, timeout time.Duration) 有的时候又可能有些参数是不需要的,所以可能变成了: 1HttpRequest('GET', 'https://www.baidu.com', nil, nil, 2 * time.Second) 解决办法一:把配置全转换为结构体对象1234567type HttpClientConfig struct { timeout time.Duration headers map[string]string body []byte}func HttpR...




