kubebuilder 简介

自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubernetes 高级玩家的必备技能,本文将介绍 CRD 和 Controller 的概念,并对 CRD 编写框架 Kubebuilder 进行深入分析,通过本文可以真正理解并能快速开发 CRD。

  • 在实际工作中,对kubernetes的资源执行各种个性化配置和控制是很常见的需求,例如自定义镜像的pod如何控制副本数、主从关系,以及各种自定义资源的控制等;
  • 对于上述需求,很适合使用Operator 模式来解决,这里有官方对Operator的介绍:https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/ ,Operator模式的执行流程如下图所示:
  • kubectl获取node节点容器 kubectl describe node详解_kubernetes

  • 为了简化Operator开发,我们可以选用一些已有的开源工具,kubebuilder就是其中之一,《kubebuilder实战》系列就是对此工具由浅入深的实践;

开发环境搭建

开发架构

开发环境一共由两台电脑组成的架构:

kubectl获取node节点容器 kubectl describe node详解_开发环境_02

软件依赖
  • kubernetes集群环境;
  • kubebuilder电脑(CENTOS7);
  • kubebuilder版本:2.3.1
  • go版本:1.15.6
  • docker版本:19.03.13
配置部署
  1. kubectl安装和配置,这样可以在kubebuilder电脑上操作kubernetes环境;
    自行安装部署即可,参照本次的开发设计,此次开发为了便于项目的部署和实施,k8s 和 kubebuilder 的开发环境为同一台虚拟机即可。
  2. 安装golang;
# 安装必要应用
yum install unzip tree wget gcc gcc-c++ kernel-devel -y
# 脚本安装golang并设置好环境变量:
chmod a+x ./install-go.sh \
&& ./install-go.sh

其中 install-go.sh 脚本如下:

#!/bin/bash

# 下载 go 
wget -P /tmp https://golang.google.cn/dl/go1.15.6.linux-amd64.tar.gz 
tar -C /usr/local -xzf /tmp/go1.15.6.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile

# 配置 GOPATH & GOROOT
echo "export GOROOT=/usr/local/go" >> /etc/profile
mkdir -p /home/gowork
echo "export GOPATH=/home/gowork" >> /etc/profile
source /etc/profile
go env
go version
echo $GOPATH
echo $GOROOT
  1. 安装docker;
    环境默认存在,因为开发环境为 k8s 默认就会存在 docker,所以无需安装,默认使用即可;

设置镜像加速,执行以下命令完成镜像加速的设置并使其生效:

tee /etc/docker/daemon.json <<-EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
# 重启加载 docker
systemctl daemon-reload
systemctl restart docker
  1. 安装kustomize;
# 配置 Go 代理
export GO111MODULE=on
export GOPROXY=https://goproxy.io/
# 安装 kustomize 模块
mkdir -p $GOPATH/bin
cd $GOPATH/bin
GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3
  1. 安装kubebuilder;
# 以下脚本通过go命令确定当前系统和CPU架构,再去服务器下载对应的kubebuilder文件,然后设置环境变量:
os=$(go env GOOS)
arch=$(go env GOARCH)
curl -L https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C /tmp/
mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
# 确认安装成功:
kubebuilder version

kubectl获取node节点容器 kubectl describe node详解_云原生_03

说明:如果因为无法下载网络资源导致的部署失败,请自觉想办法;