K8s-三大核心数据结构
K8s-三大核心数据结构构成
Group:资源组,在K8s API Server称之为APIGroup
Version:资源版本,在K8s API Server称为APIVersion
Resource:资源,在K8s API Server称为APIResource
Kind:资源种类,描述K8s种类,与Resource统一级别
K8s支持多Group,每个Group支持多Version,每个Version支持多Resource,部分资源还有自己的子资源(Sub Resource),比如Deployment的status
一般的,具体表示///,比如Deployment就是apps/v1/deploymets/status
不常见的deletecollection资源在支持delete的情况下,如果支持删除多个字眼,比如删除命名空间所有的Pod,那就算啥给予deletecollection
# 查看所有kubectl api -resources --sort-by name -o wide
资源组Group资源组把不通 ...
K8s-Service的服务发现机制
K8s-Service的服务发现机制服务发现机制主要是K8s集群如何获取后端服务的访问地址。
K8s主要提供了俩种模式,环境变量方式和DNS方式
环境变量apiVersion: v1kind: Servicemetadata: name: kubiaspec: selector: app: kubia-service ports: - protocol: TCP port: 8080 targetPort: 8080
这个对应的Pod就会出现以下环境变量:
KUBIA_SERVICE_HOST=10.10.122.234KUBIA_SERVICEPORT=8080KUBIA_PORT=tcp://10.10.122.234:8080KUBIA_PORT_8080_TCP=tcp://10.10.122.234:8080KUBIA_PORT_8080_TCP_PRORO=tcpKUBIA_PORT_8080_TCP_PORT=8080KUBIA_PORT_8080_TCP_ADDR=10.10.122.234
所以通过curl http://$& ...
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模式要求Li ...
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函数的代码是生成器,用于资源对象的版本转换函数
常规引入tag+k8s:conversion-gen=<peer-pkg>
生成规则https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/code-genera ...
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—>给副本控制器发起scal ...
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
什么是EndpointSlice#地址类型 包括 IPV4 IPV6 FQDNaddressType: IPv4apiVersion: discovery.k8s.io/v1# endpoint列表endpoints:- addresses: - 10.10.10 ...
Homebrew共存arm和X86(Mac)
Homebrew共存arm和X86背景部分包支持arm,部分支持x86,主要是x86和arm的包的位置不一样
arm安装# 切换到/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 安装arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
区分二个版本的brew# x86export PATH="/usr/local/bin:$PATH"alias abrew='arch -x86_64 /usr/local/bin/b ...
解读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镜像,所以自行编译。
安装# 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部署过程
源码构建:
# 需要安装gityum install -y git # 拉取k8s代码 git clone https://github.com/kubernetes/kubernetes.git# 查看所有分支git branch -a# 强制 ...
K8s-通过URL访问模式
K8s-通过URL访问模式背景大多情况下,一般操作K8s资源都会使用SDK模式,比如client-go
但是其实还支持原生的URL访问模式
几种模式kubectl# 启动代理程序kubectl proxy --port=8080 &# 查看 http 模式curl http://localhost:8080/api/ '{"versions": ["v1"]}'
curl(https)
创建管理员
cat << EOF > CreateServiceAccountRoleBinding.yamlapiVersion: v1kind: ServiceAccountmetadata: name: admin-user namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: admin-userroleRef: apiGro ...