piwriw_blog
Piwriw Blog
基于Gin的个人博客系统
一个后端使用了Gin、数据库ORM使用Sqlx,前端使用了Vue2.X的个人博客系统
探索本项目的文档 »
本篇README.md面向开发者
目录
项目概述
页面演示
用户端
管理端
快速启动
文件目录说明
作者
鸣谢
项目概述Piwriw_blog是一个博客系统,前端基于Vue2构建了用户端和管理员系统,后端基于Gin和Sqlx构建。
页面演示用户端
首页
详情
管理端
文章编辑
文章列表
评论管理
分类列表
用户列表
个人设置
快速启动
克隆项目到本地git clone git@github.com:Piwriw/piwriw_blog.git
下载后端依赖(前提:你已经开启了go modules 并且设置了国内镜像代理)cd piwriw_blog go mod tidy
下载前端依赖
...
基于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 ...