利用 nektos/act debug github action locally
我们都知道利用 Github Action 可以用来进行构建CI的流水线,通过构建对应的jobs来实现我们的期望效果,对于目前来说很多时候构建之后的效果目前只能在远端repo才能够看到最终的执行结果,那么我们是否有机会能够在本地构建,然后来类似DEBUG看到最后期望呢?这里我将介绍如何利用nektos/act这一利器来本地执行 Github Action。
概览根据官方仓库的概览描述告诉了我们对于本地构建的急切缘由!
及时的结果反馈。 通过本地构建我们无需通过 commit/push 的事件来触发远端repo的action。我们完全可以在本地进行模拟Github Actions所达到的效果,从而得到一个及时的结果信息反馈。
我们完全可以通过流式线形式的构建来替换 Makefile 文件
实际操作这里假设你已经具备基本的Github Action配置能力,且具备初步的使用能力,此篇章主要是对 act 的配置及使用。安装完可以通过 act -h 进行简单的查看验证。
安装本人使用的是 macos,可以通过 brew install act 进行安装,其他 os 发行版可以参考官方仓库中 ...
手撕client-go:如何编写CRD client
需求背景分析基于 k8s 的二次开发过程中,有些场景我们会定制化的去开发自己的 CRD + Controller,即 Operator来实现基于k8s的云原生化的部署与自动化运维功能,暂且称之为底层的基座能力。
如果我们想基于底层能力,并想要将其封装为控制台来供上层业务调用的话,我们需要有机会能够去控制与使用这样的接口能力,基于对Client-go的使用,也许有胖友会想到dynamic client的使用,但是作为设计与开发人员,我们应该清醒的认识到对于序列化与反序列化过程,扔一堆map是多么的头疼(除非恰巧业务开发人员与Operator设计设计者是同一人>..<)。
我们能不能有机会像使用k8s 中的原生资源如Deployments、Service等一样方便的去使用呢?
必备概念与技能在进行具体分析前,建议胖友先去了解下Kubernetes API 概念,同时具备查阅Kubernetes API的能力。
为了方便举例,我在本地k8s集群注册了emqx-operator 中的 CRD自定义资源,将其视为与 k8s 原生资源同等地位。
12emqxbrokers.apps.e ...
手撕kube-proxy iptables实例
继 iptables 入门出坑之后,加深个人理解无非是实战,此篇我们来通过示例来加深个人理解。
环境准备本人是 mbp,由于 Docker Desktop For Mac 实在太黑盒了,打算用 minikube 来进行 k8s 实验环境的部署。
对于需要的 minikube, kubectl 这种基本依赖可执行文件具体就不写步骤了。最终执行如下命令拉起 k8s 集群:
1234567891011121314151617181920212223242526272829minikube start --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --kubernetes-version=v1.21.0😄 Darwin 11.6 上的 minikube v1.21.0❗ Kubernetes 1.21.0 has a known performance issue on cluster sta ...
iptables 入门出坑
本文整理自iptables长文详解,值得收藏细读整理此篇博文的初衷还是因为目前很多 k8s 的内部的 service 路由规则还是通过 iptables 来实现的,否则最终还是只停留在使用层面,能够让我们对某个服务夯住又多了个排查利器。
Linux 的网络控制模块在内核中,叫做netfilter。而iptables是位于用户空间的一个命令行工具,它作用在OIS7层网络模型中的第四层[物理层,数据链路层,网络层,传输层,会话层,表示层,应用层],用来和内核的netfilter交互,配置netfilter进而实现对网络的控制、流量的转发。
主要功能:
流量转发:DNAT 实现 IP 地址和端口的映射
负载均衡:statistic 模块为每个后端设置权重
会话保持:recent 模块设置会话保持时间
基本两要素表和链路,5表5链路。
5张表分别是:raw,filter,nat,mangle,security5条链路分别是:prerouting,input,forward,output,postrouting
通过 iptables -t ${table} -nL ...
kubernetes源码分析系列之源码分析系列之Statefulset Controller
对于分析 Controller 源码选用 StatefulSet Controller 来,其它控制器源码分析一个套路,可以做参考。
StatefulSet 简介此篇文章默认你已经具备了熟练使用 Statefulset 的基础知识,所以常规介绍及使用 Demo 的描述不在阐述,具体可参考 StatefulSet 基础
StatefulSet Controller 启动分析kube-manager-controller 入口调用链分析对于 Kubernetes 的源码组织结构不做过多介绍,希望你有一定的了解。
对于 k8s 是如何启动 kube-controller-manager,可以通过文档kube-controller-manager 查找到对应如下内容:
1234--controllers strings 默认值:[*]要启用的控制器列表。\* 表示启用所有默认启用的控制器; foo 启用名为 foo 的控制器; -foo 表示禁用名为 foo 的控制器。控制器的全集:attachdetach、bootstrapsigner、cloud-node-lifecycle ...
Kubernetes之编写Controller
翻译自Writing Controllers
Writing ControllerKubernetes Controller 是个“常驻调谐进程”。它除了会“监视”对象的期望状态外,也会“监视”对象的运行状态。会通过发送“指令”尝试着将对象的运行状态更加趋近于期望状态。
如下是个简单的 loop 循环:
12345for { desired := getDesiredState() current := getCurrentState() makeChanges(desired, current)}
Guidelines当我们写 Controller 的时候,有如下知道方针来帮助我们实现我们想要的结果和表现。
一次之操作一个元素。 如果你使用 workqueue.Interface,你将能够将一个具体的Resource入队,然后稍后将它们 pop 到 worker gofuncs,此处需要保证的是同一时间不能有多个 gofuncs 处理同一个元素。
Controllers 会引发多个 Resource 之前的关联关系(例如 Y 发生改变了 我需要检查 ...
PersistentVolumnes 单Pod 访问模式
翻译自Introducing Single Pod Access Mode for PersistentVolumes
访问模式及重要意义当使用持久化储存时,对于存储有多种模式进行访问使用。
例如,存储系统中的网络文件可以同时被多个用户进行读写数据。在另一种场景下,也许每个用户允许进行读而不具备写的权限。对于高敏数据,可能只允许一个用户用户进行读写操作而不是所有的用户。
在 Kubernetes 的世界中,access mode就是我们定义持久化存储如何使用的方式。这些访问方式作为 PVs 和 PVCs 中 spec 描述的一部分内容。
12345678910kind: PersistentVolumeClaimapiVersion: v1metadata: name: shared-cachespec: accessModes: - ReadWriteMany # Allow many pods to access shared-cache simultaneously. resources: requests: storage: 1Gi
在 v1.22 ...
深入理解k8s网络原理之-Service原理
收集整理,转载自深入理解kubernetes(k8s)网络原理之二-service原理
在深入理解k8s网路原理之-POD连接主机中主要介绍了POD与主机及POD访问外网的原理。
Linux网络基础知识netfilternetfileter子系统5个关键扩展点:
PREROUTING,数据包刚到达时会经过这个点,通常用来完成DNAT的功能。
INPUT,数据包要进入本机的传输层时会经过这个点,通常用来完成防火墙入站检测。
FORWARD,数据包要通过本机转发时会经过这个点,通常用来完成防火墙转发过滤。
OUTPUT,从本机的数据包要出去的时候会经过这个点,通常用来做DNAT和防火墙出站检测。
POSTROUTING,数据包离开本机前会经过这个点,通常用来做SNAT。
1、 主机的应用程序接收外部的数据包会经过的点: PREROUTING -> INPUT
2、 主机的应用程序发送数据包到外部经过的点: OUTPUT -> POSTROUTING
3、 主机的POD发送的数据包去外部或者去主机的另外一个POD: PREROUTING -> FORWARD -&g ...
深入理解k8s网路原理之-POD连接主机
转载自深入理解kubernetes(k8s)网络原理之一-pod连接主机
关于Linux网络的知识向外发送一个数据包,执行步骤:1、查找该数据包的目的地的路由信息,如果是直连,则在邻居表中查找该目的地的Mac地址2、如果非直连路由,则在邻居表中查找下一跳的Mac地址3、如果找不到对应的路由,则报"network is unreachable"4、如果在邻居表中没有查到相应的MAC地址信息,则向外发送ARP请求询问5、发送出去的数据帧,源MAC地址为发送网卡的MAC地址,目标MAC则是下一跳的MAC,只要不经过NAT,那么源目的IP全程不会变化,而MAC地址则每一跳都会变化
收到数据帧,执行步骤1、如果数据帧目标MAC地址不是收包网卡的MAC,也不是ARP广播地址,且网卡未开启混杂模式,则拒绝收包2、如果数据帧目标MAC为ff:ff:ff:ff:ff:ff,则进入ARP请求处理流程3、如果数据帧目标MAC地址是收包网卡的MAC,且是IP包则: 1、目标IP地址在本机,则上送到上一层协议继续处理 2、目标IP地址不在本机,则看net.ipv4.ip_fo ...
Istio初体验之后续补充
继docker desktop之Istio初体验中完成集群内部基础组件部署之后,我们有了大概的认知。其中关于如何将服务对外暴露并没有明细说明太多,此篇补充下如何对外开放应用服务。
对外开放应用程序此时我们查看如下:
1234567891011~/Documents/Opts/k8s/addons/istio-1.8.1/v1.8.1 kubectl get pods ✔ 18:28:42NAME READY STATUS RESTARTS AGEdetails-v1-79c697d759-smfhp 2/2 Running 0 5m56sproductpage-v1-65576bb7bf-k6797 2/2 Running 0 5m54sratings-v1-7d99676f7f-xjr74 2/2 Running ...