Kubernetes

高级调度

March 22, 2020
Kubernetes
Scheduling, Taint, Toleration

使用 taint 和 toleration 阻止节点调度到特定节点 # taint 和 toleration # taint,是在不修改已有 Pod 的前提下,通过在节点上添加污点信息,拒绝 Pod 的部署。 只有当一个 Pod 容忍某个节点的 taint 时,才能被调度到此节点上。 显示节点 taint 信息 kubectl describe node master.k8s ... Name: master.k8s Role: Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/hostname=master.k8s Annotations: node.alpha.kubernetes.io/ttl=0 Taints: node-role.kubernetes.io/master:NoSchedule ... 主节点上包含一个污点,污点包含一个 key 和 value,以及一个 effect,格式为=:。 上面的污点信息表示,key 为 node-role.kubernetes.io/master,value 是空,effect 是 NoSchedule。 显示 Pod tolerations kubectl describe Pod kube-proxy-as92 -n kube-system ... Tolerations: node-role.kubernetes.io/master:=NoSchedule node.alpha.kubernetes.io/notReady=:Exists:NoExecute node.alpha.kubernetes.io/unreachable=:Exists:NoExecute ... 第一个 toleration 匹配了主节点的 taint,表示允许这个 Pod 调度到主节点上。 ...

Eviction Manager 工作机制

February 26, 2020
Kubernetes
Kubelet, Eviction Manager

概述 # 在可用计算资源较少时,kubelet 为保证节点稳定性,会主动地结束一个或多个 pod 以回收短缺地资源, 这在处理内存和磁盘这种不可压缩资源时,驱逐 pod 回收资源的策略,显得尤为重要。 下面来具体研究下 Kubelet Eviction Policy 的工作机制。 kubelet 预先监控本节点的资源使用,防止资源被耗尽,保证节点稳定性。 kubelet 会预先 Fail N(>=1) 个 Pod,以回收出现紧缺的资源。 kubelet 在 Fail 一个 pod 时,kill 掉 pod 内所有 container,并设置 pod.status.phase = Failed。 kubelet 按照事先设定好的 Eviction Threshold 来触发驱逐动作,实现资源回收。 驱逐信号 # 在源码 pkg/kubelet/eviction/api/types.go 中定义了以下及几种 Eviction Signals: Eviction Signal Description memory.available := node.status.capacity[memory] - node.stats.memory.workingSet nodefs.available := node.stats.fs.available nodefs.inodesFree := node.stats.fs.inodesFree imagefs.available := node.stats.runtime.imagefs.available imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree allocatableMemory.available := pod. ...

深入了解 Service

January 24, 2020
Kubernetes

基本概念 # Service 定义详解 # Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service, 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service 通过标签来选取服务后端, 一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行。 这些匹配标签的 Pod IP 和端口列表组成 endpoints, 由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。 apiVersion: v1 kind: Service metadata: name: string namespace: string labels: - name: string annotations: - name: string spec: selector: [] # ClusterIP、NodePort、LoadBalancer type: string # type=ClusterIP, 有自动分配的能力;type=LoadBalancer,需指定 clusterIP: string # 是否支持 session,默认为空,可选值 ClutserIP,同一个 client 的 request,都发送到同一个后端 Pod sessionAffinity: string ports: - name: string # tcp、udp,默认 tcp protocol: string port: int targetPort: int nodePort: int # spec. ...

CRD 入门和使用

October 14, 2019
Kubernetes
CRD

自定义资源是 Kubernetes API 的扩展,本文将讨什么时候应该向 Kubernetes 集群添加自定义资源以及何时使用独立服务。它描述了添加自定义资源的两种方法以及如何在它们之间进行选择。

...