1.(2)从源码到dashboard-单节点部署k8s1.26-部署etcd并使用etcdctl命令操作etcd
2.Kubernetes(k8s)-v1.22.3版本证书有效期修改
3.我在暴躁同事小张的源码帮助(胁迫)下学会了Go的交叉编译和条件编译
4.为什么k8s管理员要懂eBPF
5.基于gitlab+k8s实现CI/CD
6.kubelet 远程调试方法
(2)从源码到dashboard-单节点部署k8s1.26-部署etcd并使用etcdctl命令操作etcd
在上一章中,我们已经准备好了8个二进制文件,编译存储在/opt/kubernetes/bin目录下。源码接下来,编译我们将进行etcd的源码单节点部署,并利用etcdctl命令对etcd数据库进行操作。编译收获区域指标源码请确保在实际操作中,源码将.0.4.替换为你自己的编译机器IP地址。步骤一:编译证书工具cfssl
为了支持k8s的源码i-0.8.7-0.x_。### 查看证书有效期
通过两种方法检查证书有效期:
1. 第一种方法:显示当前证书有效期。编译
2. 第二种方法:同样显示当前证书有效期。源码
请注意,编译如果证书已更新,源码则显示的编译日期将不同。但与第一种方法的源码结果一致,通常为一年。
### 修改证书有效期步骤
#### 准备环境
1. 访问Go语言中文网下载最新版本的Go环境。
2. 在Linux系统中配置环境变量。
3. 验证Go环境已正确安装。
#### 下载Kubernetes源码
1. 查看当前系统版本以下载与之匹配的Kubernetes v1..3源码。
2. 确保能访问外网以从GitHub下载源码。
3. 下载源码并解压。
#### 修改源代码文件
1. 修改两个关键文件:`constants.go` 和 `cert.go`。
2. 通过`vim`查找`CertificateValidity`字段。
3. 修改`cert.go`文件中的相关代码。
4. 编译修改后的源代码文件。
5. 生成新的Kubeadm二进制文件。
6. 备份旧的Kubeadm文件,确保三台master节点均备份。springboot源码搭建
7. 替换新文件。
#### 更新证书
1. 执行证书更新命令。
2. 观察结果,了解需要重启哪些服务以使更新生效。
3. 重启这台master服务器。
4. 查看新证书,除CA外,所有证书有效期更新为年,未修改`cert.go`文件。
5. 同样步骤更新其他两台master节点,将更新过的Kubeadm文件通过scp传输,并根据上述步骤生成新的证书文件。记得在更新后重启服务或服务器。
我在暴躁同事小张的帮助(胁迫)下学会了Go的交叉编译和条件编译
在追求跨平台Go开发的旅途中,我遇到了一次特别的挑战,这次,我得感谢一位同事——小张,尽管他的参与似乎更多是出于一种“胁迫”。这个故事围绕着Go的交叉编译与条件编译展开,让我深刻体验了在不同操作系统环境下进行代码适配的复杂性。
交叉编译是将程序在一台机器上编译成能在另一台机器上运行的可执行文件的过程。例如,我使用的是Mac系统,而小张则运行着Windows系统。我使用的Mac系统内核是darwin,而小张的系统内核则是windows。这一差异导致了我在Mac上编译的代码在小张的Windows系统上无法正常编译。
在《Go服务迁到K8s后老抽风重启?minigo源码分析 记一次完整的线上问题解决过程》这篇文章中,我尝试通过使用syscall.Dup2函数将标准错误重定向到日志文件,以解决服务重启的问题。然而,我天真地使用了一个`runtime.GOOS == "windows"`的判断来实现这一功能,以为可以实现针对不同操作系统环境的代码逻辑选择,但事实证明,Go的运行方式不允许这样的动态选择。在Windows系统下,由于缺少syscall.Dup2函数,项目编译失败。
这一经历让我深刻意识到,动态语言的思维在Go这样的静态编译语言中是行不通的。我曾写过《如何避免用动态语言的思维写Go代码》,然而,这次的失败无疑是对自己思维的有力一击。最终,我不得不用实际行动来解决这个问题,即查看Go官方标准库如何实现跨平台兼容。
关于条件编译,Go并不支持宏,而是通过构建标签和代码文件的命名约定来实现。构建标签允许开发者在代码中指定某些代码片段只在特定的平台上编译。文件名后缀同样可以实现条件编译,通过在文件名中添加特定的后缀来指示编译器在哪些平台上编译该文件。
在实际应用中,我首先创建了两个源码文件,分别针对Windows系统和非Windows系统,以解决之前遇到的要房源码问题。接着,我利用构建标签来指定文件只在特定平台下编译,从而避免了在不支持的平台上编译错误的问题。执行交叉编译时,只需在命令中指定目标平台的OS和ARCH参数,Go编译器便能够生成适用于指定平台的可执行文件。
通过这次经历,我不仅学会了如何利用Go的条件编译功能实现跨平台开发,更重要的是,我学会了如何面对挑战,通过学习和实践来克服技术难题。对于其他面临相似问题的开发者,我的建议是:深入研究Go的编译系统,灵活运用构建标签和文件名后缀来实现条件编译,以适应多平台开发的需要。
为什么k8s管理员要懂eBPF
eBPF的引入为容器和Kubernetes集群的观测性带来了革命性的变化。它允许程序直接在Linux内核空间中运行,提供了高效、安全且功能强大的方式来控制、过滤和监控流量。eBPF的崛起并非偶然,而是与Docker和Kubernetes的发展紧密相关。本文旨在深入探讨eBPF的来龙去脉,以及为什么它在Kubernetes可观测性中变得如此重要。
eBPF,全称为"extended Berkeley Packet Filter",是对老式伯克利包过滤器BPF的扩展。BPF最初于年引入,rosserial源码解读用于为Linux内核提供可编程、高效的虚拟机,以控制和过滤流量。然而,随着容器技术的兴起,特别是Docker的普及,BPF的原始架构变得越来越局限。eBPF于年引入,通过提供在Linux内核空间中运行的工具,极大地扩展了BPF的原始架构。这使得eBPF在容器和Kubernetes环境中变得尤为重要。
在内核空间中运行程序意味着代码能以更高的效率执行,并且能访问底层内核资源,否则从用户空间访问这些资源会非常复杂且昂贵。此外,eBPF允许你观察用户空间中运行的任何程序,这为容器世界提供了一种无价的技术能力。使用eBPF,你可以在磁盘I/O等事件上运行小程序,这些事件在内核的安全虚拟机中运行。
在使用内核模块之前,eBPF提供了更简单、更高效、更安全的解决方案。内核模块的部署复杂,存在依赖关系,并且可能不安全。与之相比,eBPF允许自定义程序在独立的内核级虚拟机中运行,无需处理内核模块依赖,接触内核源代码,甚至无需拥有root权限。这使得eBPF成为一种灵活且易于部署的解决方案。
一旦部署了eBPF程序,你就可以监视你附加的任何代码流,无论是在内核空间、用户空间还是两者都有。eBPF映射或预定义的文件描述符允许你访问程序的输入和输出,从而实现对网络流量的细粒度可见性。在云原生世界中,eBPF为可观测性解锁了无限可能性。
为了部署eBPF程序,你需要完成以下步骤:编写和编译代码(通常使用限制性C语言),然后将字节码传递给内核检验器以确保程序的可靠性。加载并验证后,程序就可以执行,监视数据包的进入或发送,然后映射到主机上运行的进程或容器。这提供了对网络流量的深入洞察。
eBPF的生态系统正在快速发展,包括工具链、编译器和与eBPF程序交互的项目,如Python、Golang和Rust。这些工具简化了eBPF的使用,降低了开发门槛,使得即使是缺乏动力的开发者也能轻松编写和加载eBPF程序。
尽管eBPF带来了许多优势,但也有其局限性。编写符合内核检验器的eBPF程序可能具有挑战性,且风险在于程序在不同内核版本之间可能不一致。eBPF程序在堆栈空间上受到限制,需要高效地编写代码。此外,不同Linux发行版之间的内核版本和自定义可能导致eBPF程序的可移植性问题。
展望未来,eBPF的生态系统正变得更加成熟和组织化,得到了来自大型科技公司的支持。随着eBPF基金会等组织的推动,可以预见eBPF将在Kubernetes可观测性中发挥关键作用。因此,Kubernetes管理员和开发人员应开始学习使用eBPF,以充分利用其在监控和理解容器内部事件方面的潜力。
基于gitlab+k8s实现CI/CD
项目简介:采用Container、Gitlab、Gitlab Runner(k8s)、SonarQube、Harbor、Jmeter、Maven、Java构建CI/CD管道,实现自动化编译打包、单元测试、源码扫描、上传制品、Docker容器部署与自动化测试,显著提升开发效率、软件质量和安全性。
CI/CD流程:从代码提交开始,自动启动流水线进行编译、测试、代码质量检查、容器化部署,减少手动操作,加速迭代与部署。
镜像构建:在container环境下,使用nerdctl+buildkitd方案构建镜像,具体步骤参考相关文档。
Runner镜像:构建gitlab-runner-agent镜像,实现镜像构建和k8s资源操作,dockerfile内容需详细配置。
部署与优化:部署gitlab-runner,根据实际情况优化runner配置,确保高效运行。
流水线构建:构建maven、sonar-scanner、jmeter镜像,实现自动化构建。
模板库更新:补充gitlab项目中的模板库内容,提高代码复用性。
仓库地址:项目代码可访问gitee.com/cuiliang/...或github.com/cuiliang...
权限配置:在gitlab项目中设置权限,确保安全可控。
密钥配置:新建SONAR_QUBE_TOEKN、HARBOR_PASSWORD等变量,用于流水线任务,保护敏感信息。
邮件配置:设置邮件通知,及时获取任务执行情况。
流水线配置:在根目录创建.gitlab-ci.yml文件,定义流水线步骤,实现自动化流程。
结果验证:查看pod信息,验证部署效果,与以往相比,全程使用k8s runner,效率提升。
更多信息与关注:公众号《崔亮的博客》持续更新,更多运维开发文章欢迎访问cuiliangblog.cn。
kubelet 远程调试方法
Kubelet远程调试方法详解
Kubelet作为Kubernetes的核心组件,可以通过系统服务管理和编译工具进行远程调试。首先,理解kubelet的启动命令至关重要。在v1..4的K8s集群中,kubelet作为systemd服务,其配置文件位于</etc/systemd/system/kubelet.service.d/-kubeadm.conf>。通过执行ps -ef | grep /usr/bin/kubelet,可以查看完整的启动命令。 若需修改kubelet命令,可以先停止服务,然后使用相应参数重新启动,或者修改systemd配置后重启服务。编译kubelet时,推荐使用Kubernetes makefile源码中的编译指令,调整GOLDFLAGS和GOGCFLAGS以保留调试信息。编译完成后,kubelet二进制文件会位于_output/bin/kubelet。 对于Go语言的调试,Delve是一个高效工具,尤其适合调试标准工具链构建的Go程序。可以通过安装命令轻松获取,并使用它来调试kubelet。例如,使用dlv命令行进行调试步骤包括设置地址和端口,以及在GoLand IDE中配置并启动kubelet进行调试。 除了Kubelet,其他容器软件如runc和docker-cli也可通过修改编译命令进行调试。例如,runc和dockerd的编译过程中,需要在scripts/build/binary或hack/make/.binary文件中相应位置调整编译参数。 获取更多详细教程和实践步骤,可以参考ssst0n3.github.io/post/...。通过以上步骤,你可以有效地对kubelet和其他容器软件进行远程调试,提升开发效率。