基于OpenVPN建立局域网
基于OpenVPN建立局域网搭建Server安装依赖// curl 下载centos7依赖// curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum updateyum install epel-release
官方一键安装wget https://raw.githubusercontent.com/Angristan/openvpn-install/master/openvpn-install.shsudo chmod +x openvpn-install.shsudo ./openvpn-install.shsystemctl start openvpn@serversystemctl status openvpn@servervim /etc/openvpn/server.conf // 监听网卡tcpdump -i tun0
选择绑定公网IP
选择协议UDP/TCP,记得打开对应端口
选择密码模式
查看 .ovpn文件
Clie ...
K8s-kube-apiserver(启动流程)
K8s-kube-apiserver(启动流程)
基于1.25
APIServer启动流程:
Schema资源注册
Cobra命令桉树解析
创建API Server通用配置
创建API EXtensionsServer
创建KubeAPIServer
创建AggregatorServer
GenericAPIServer初始化
准备和启动HTTPS服务
Scheme资源注册使用Scheme所有资源注册到APIServer中
Scheme资源注册不算使用显式代码触发,通过init注册。
初始化Scheme资源注册表
Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/pkg/api/legacyscheme/scheme.go#L24
var ( // Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already reg ...
K8s-kube-apiserver(Overview)
K8s-kube-apiserver(Overview)
基于1.25
什么是Kube-apiserverkube-apiserver是K8s控制面的组件之一
主要提供集群管理的RESTAPI接口,包括认证授权、数据校验、配置变更
只有kube-apiserver才能直接操作etcd集群中的数据
Pod创建的关键流程:
用户通过客户端向kube-apiserver发起Pod请求
kube-apiserver验证请求的有效性,并将其持久化保存到etcd集群
kube- schedule基于Watch机制感知到新Pod创建的事件
kube- schedule执行调度算法
kube-apiserver验证Bind请求,将结果持久化道etcd集群
kubelet基于Watch机制感知到Pod完成绑定事件
kubelet对应节点的容器运行时交互,启动容器,并向kube-apiserver上报Pod的运行状态
kube-apiserver将Pod的最新状态持久化到etcd集群
用户通过客户端向kube-apiserver发起Pod查询请求
网络通信框架kube-apiserver基于H ...
K8s-etcd核心存储实现
K8s-etcd核心存储实现
基于1.25
什么是Etcdetcd是K8s默认的数据持久化端存储,主要用于保存集群配置和状态
etcd是分布式键值存储集群
基于Raft协议提供可靠强一致性数据存取服务
架构设计REST Storage
genericregistory.Storegenericregistory.Store封装了资源对象的CRUD操作,并且支持资源版本ResourceVersion的冲突检查
在存储资源对象前执行Beofre Func,存储资源对象后执行(After Func),以及处理DryRun
storage.Interface底层通用存储接口,定义了资源的操作方法,Create|Delete|Watch|Get|Count|GETList|GuranteedUpdate|Versioner
cachestorage.Cacher为了减轻etcd读取压力和提供了Cache,可以通过设置kube-apiserver的–watch-cache启动或者关闭Cacher,默认开启
Underlying Storage后端存储,默认K8s使用etcd3,使用etc ...
K8s-kubectl(变更对比策略和拓展命令)
K8s-kubectl(变更对比策略和拓展命令)
基于1.25
什么是变更对比策略
kuebctl apply 通过JSON/YAML,标准输入输出获取K8s集群进行配置更新
Kubectl edit 实时编辑K8s资源对象
kubectl patch 提供更新资源对象
kubectl diff 本地文件和实时资源对比
所以存在了不同的对比策略场景:
变更对比逻辑在哪进行(服务端还是客户端)
针对什么资源对象可以进行变更对象
使用说明变更对比算法
服务端应用和客户端应用服务端应用通过声明式的方法,kuebctl 发送完整的对象描述去创建和更新对象。
kubectl提供了俩个命令参数实现支持服务端:
server-side:服务端应用的开关,当设置为true时,开启并使用服务端应用
force-conflicts:冲突解决策略,当设置为true;会强制应用变更
kubectl apply 和kubectl diff 都支持启用服务端应用
kubectl patch 值提供服务端应用的变更方式
客户端应用与服务端不同,客户端在处理变更和冲突逻辑之后,把处 ...
K8s-kubectl(缓存机制)
K8s-kubectl(缓存机制)
基于1.25
kubectl的关键步骤是构造操作/查询资源的请求
kubectl为了减小kube-apiserver的压力,使用Client-go中的CacheDisoveryClient提供的本地磁盘能力。
缓存数据结构kubectl使用servergroups.json文件缓存从kube-apiserver获取所有的资源信息
缓存文件存在$KUBECACHEDIR/disocvery中
没有设置环境变量KUBECACHEDIR,默认位置$HOME/.kube/cache
[root@hcss-ecs-5425 ~]# tree $HOME/.kube/cache /root/.kube/cache├── discovery│ └── 113.45.181.99_6443│ ├── admissionregistration.k8s.io│ │ ├── v1│ │ │ └── serverresources.json│ │ └── v1 ...
K8s-kubectl(执行流程)
K8s-kubectl(执行流程)
基于1.25
什么是kubectlkubectl是kube-apiserver的客户端,通过向kube-apiserver发送HTTP请求,实现对K8s集群的控制
初始化命令对象kubectl使用NewCmdXX 进行初始化,主要有俩类对象:
cobra.Command:提供命令对象
XXXoptions:Options命令参数对象
补全命令参数支持补全成命令执行的相关工具类,形成完整的Options,主要工具包含三种
Genericclioptions.Recorder:用于记录资源对象发生变化的原因,对于由kubectl触发的变更,genericclioptions.Recoder会将完整的命令记录到资源对象的kubernetes.io/change-cause注解中
resource.QueryParamVerifier:用于检查资源对象是否支持DryRun和资源对象娇艳
options.ToPrinter/options.PrintObj:打印相关函数,用于获取命令执行结果之后,执行结果打印到终端
校验命令参数
...
K8s-client-go(常用工具类:事件管理机制+Leader选举机制)
K8s-client-go(常用工具类:事件管理机制+Leader选举机制)
基于1.25
事件管理机制Event是一种对象资源,展示集群中发生的事件,包含调度器的操作、Pod为什么被驱逐
存储在kube-apiserver的Pod中,有强制保留策略,在最后一次事件发生之后,删除一个小时之前的事件
Ref:https://github.com/kubernetes/api/blob/f7b7ea4f0fcc6cb8c8dd42eb46a94c7e163d1b9d/core/v1/types.go#L5776
type Event struct { // metav1.TypeMeta 嵌入类型,包含 APIVersion 和 Kind 字段,用于标识对象的 API 版本和类型 metav1.TypeMeta `json:",inline"` // 标准对象元数据,包含对象的名称、命名空间、标签等信息 metav1.ObjectMeta `json:"metadata" pro ...
K8s-client-go(Informer机制)
K8s-client-go(Informer机制)
基于1.25
什么是InformerInformer实现了组件之间使用HTTP通信,但是不依赖任何中间件的情况下,实现了保证消息的实时性、可靠性、顺序性等
使用示例package mainimport ( "flag" "fmt" "path/filepath" "time" v1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" "k8s.io/clien ...
K8s-client-go
K8s-client-go什么是Client-goClient-go是K8s提供的调用K8s对西那个的客户端,实现了访问kube-apiserver,对K8s集群中的资源对象管理
Link:https://github.com/kubernetes/client-go
客户端client-go支持Client Set、DynamicClient、Discovery Client、RESTClient四种
RESTClient是最基础的客户端,对HTTP请求进行了封装
ClientSet对在RESTClient基础上,封装了Resource和Version的管理方法
ClientSet只能处理K8s内置资源
通过client-gen代码生成器生成
DynamicClient:DynamicClient可以处理所有的资源,包括CRD
DiscoveryClient:用于发现kube-apisever所支持的Group、Versions、Resources
kuebconfig配置管理kubeconfig就是管理访问kube-apiserver的配置信息,支持管理访问多个kube ...