K8s的五种代码生成器
K8s的五种代码生成器概述 代码生成器 说明 Conversion-gen 自动生成convert函数的代码是生成器,用于资源对象的版本转换函数 deepcopy-gen 自动生成deepcopy的函数代码生成器,用于资源对象的深复制函数 defaulter-gen 自动生成defaulter的函数代码生成器,用于资源对象的默认值函数 prerelese- lifecycle-gen 自动生成api-status.csv文件的工具 openapi-gen 自动生成openapi定义文件的代码生成器 除了上述之外,其实还支持很多,比如client-gen、lister-gen、informer-gen Conversion-gen自动生成convert函数的代码是生成器,用于资源对象的版本转换函数 常规引入tag1+k8s:conversion-gen=<peer-pkg> 生成规则https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/code-ge...
K8s-Service的负载均衡机制
K8s-Service的负载均衡机制Service对象通过关联转发到PodI实现负载均衡,每个Node的kube-proxy负责实现。 kube-proxy的代理模式通过启动参数–proxy-mode设 置 userspace模式(x)用户空间模式,由kube-proxy完成的代理模式,效率低,不再推荐 iptables模式kube-proxy通过设置Linux Kernel的iptables规则, 实现从Service到后端Endpoint列表的负载分发规则,效率很高。但是, 如果某个后端Endpoint在转发时不可用,此次客户端请求就会得到失败 的响应,相对于userspace模式来说更不可靠。 此时应该通过为Pod设置 readinessprobe(服务可用性健康检查)来保证只有达到ready状态的 Endpoint才会被设置为Service的后端Endpoint。 ipvs模式在Kubernetes 1.11版本中达到Stable阶段,kubeproxy通过设置Linux Kernel的netlink接口设置IPVS规则,转发效率和支 持的吞吐率都是最高的。ipvs模式要...
K8s-Pod的扩容
K8s-Pod的扩容背景在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也 可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的 场景。此时可以利用Deployment/RC的Scale机制来完成这些工作。 手动扩容 通过kubectl scale deployment $nginx-deploymenr --replicas 5 本质上是通过修改replicas 实现的 自动扩容HPAPod的HPA 从K8s1.1版本,添加了HPA(Horizontal Pod Autoscaler),其基于Master的的kube-controller-manager服务启动 参数–horizontal-pod-autoscaler-sync-period定义的探测周期(默认值为 15s),周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的 扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整。 工作原理HPA控制器给予Metrics Server的API指标,基于扩容规则实现进行计算,得到Pod副本数量。 然后HPA—>给副本控制器发起s...
K8s-Service端点切片和服务拓扑
K8s-Service端点切片和服务拓扑背景Service背后指向了一组Endpoint列表,当集群规范增大时,kube-proxy负载迅速上升,同时Service对Endpoint的CRUD操作成本是上升。 所以在K8s 1.16引入了端点切片(Endpoint Slices)机制,包括一个新的EndpointSlice资源对象和新的EndpointSlice控制器。 在K8s 1.17进入beta阶段,其原理是对Endpoint进行分片管理,实现降低Master和Node之间的网络传输数据量和提供整体性能。 默认:EndpointSlice控制器创建Endpoint为100,需要修改需要设置kube-controller-manager –max- endpoint-per-slice设置,但是最大上限不能超过1000 什么是EndpointSlice12345678910111213141516171819202122232425262728293031323334353637383940414243#地址类型 包括 IPV4 IPV6 FQDNaddressType: I...
Homebrew共存arm和X86(Mac)
Homebrew共存arm和X86背景部分包支持arm,部分支持x86,主要是x86和arm的包的位置不一样 arm安装12345678# 切换到/opt目录cd /opt # 创建homebrew目录sudo mkdir homebrew# 修改目录所属用户sudo chown -R $(whoami) /opt/homebrew # 安装Arm版Homebrewcurl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew x86 安装1arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 区分二个版本的brew12345678# x86export PATH="/usr/local/bin:$PATH"alias abrew='arch -x86...
解读Kubeadm源码
解读Kubeadm源码kubeadm init过程官网教程:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/ 1. Node环境检查(pre-fight-check) https://github.com/kubernetes/kubernetes/blob/b43b95aa5741e55b433e785be1df9558b3841091/cmd/kubeadm/app/preflight/checks.go#L896 生成的checks列表的对象,都实现了check接口,通过调用Check()进行 通过与prefight前检查独立存在 检查mainfestDir目录,K8s默认组件使用static pod NumCPUCheck检查CPU 最低2C,可以通过--ignore-prefight-errors=NumCPU进行忽略 MemCheck检查检查,最低2G 进行kubectl、kubelet的版本匹配检查 检查FirewaldCheck检查防火墙 端口检查 …… 同...
K8s-编译Kubemark
编译Kubemark背景Kubemark是k8s虚拟化节点的工具,用于测试。 目前找不到现成可用Kubamark镜像,所以自行编译。 安装12345# gcc 环境准备yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim yum -y install glibc-static.x86_64 yum -y install binutils Go环境准备: LInuxGo部署过程 源码构建: 123456789101112131415161718# 需要安装gityum install -y git # 拉取k8s代码 git clone https://github.com/kubernetes/kube...
K8s-通过URL访问模式
K8s-通过URL访问模式背景大多情况下,一般操作K8s资源都会使用SDK模式,比如client-go 但是其实还支持原生的URL访问模式 几种模式kubectl123456# 启动代理程序kubectl proxy --port=8080 &# 查看 http 模式curl http://localhost:8080/api/ '{"versions": ["v1"]}' curl(https) 创建管理员 1234567891011121314151617181920cat << EOF > CreateServiceAccountRoleBinding.yamlapiVersion: v1kind: ServiceAccountmetadata: name: admin-user namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmet...
K8s批量获取大量数据资源解决方案
K8s批量获取大量数据资源解决方案背景当使用kubelet已经无法获取到资源的级别,比如万级别 可以先直接采用client-go,去获取,这会更快,因为当我们使用kubelet get nodes|wc -l计算的时候,要先打印到出来再遍历 :star:最后最大数据可以采用NewSharedInformerFactory来获取,使用informer,former 提供了基于事件通知的只读缓存机制,可以注册资源变化的回调函数,并可以极大减少 API 的调用。 官方exampleURL 代码实例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192package mainimport ( "flag" "fmt" "k8s.io/apimach...
深入理解GO的GC
深入理解GO的GCGov1.3之前的标记清除法(mark and sweep) 进行STW暂停 把所有的程序可达对象标记 清除所有进行没有被标记的对象 去除暂停,进行程序,并且重复过程 缺点: 出现了SWT(stop the world)过程,程序会有卡顿(重要问题) 标记需要扫描整个heap 清除数据会产生heap碎片 Gov1.5的三色标记法 程序创建,把所有的对象标记为白色 遍历Root Set(不是递归的,直走一步)得到灰色节点 遍历灰色节点,白色标记为灰色,并且刚才的灰色变成黑色 重复以上步骤,直到灰色没有对象 收集所有的垃圾(标记为白色) 三色标记没有SWT会出现的问题: 出现对象丢失(下面是出现的条件): 一个白色对象被黑色对象引用 灰色对象与它之间的可达关系的白色对象被破坏(此时灰色对象与白色对象变成不可达) 强弱三色不变式破坏对象丢失的俩个同时成立 强三色不变式强制性不允许黑色对象引用白色对象(破坏条件1) 弱三色不变式黑色对象可以引用白色对象,白色对象存在其他灰色对象对它的引用,或者可达它的链路上游存在灰色对象(破坏条件2) Gov1....