golang使用Kubernetes IN Docker创建本地测试集群插件库kind的使用

Golang使用Kubernetes IN Docker创建本地测试集群插件库kind的使用

什么是kind

kind logo

kind是一个使用Docker容器作为"节点"运行本地Kubernetes集群的工具。kind最初是为测试Kubernetes本身而设计的,但也可用于本地开发或CI。

kind包含以下组件:

  • 实现集群创建、镜像构建等功能的Go包
  • 基于这些包构建的命令行接口(kind)
  • 用于运行systemd、Kubernetes等的Docker镜像
  • 基于这些包的kubetest集成(进行中)

kind使用kubeadm引导每个"节点"。

安装kind

如果你已经安装了Go 1.16+和Docker、podman或nerdctl,只需要运行以下命令:

go install sigs.k8s.io/kind@v0.29.0 && kind create cluster

不同平台的安装方式

Linux:

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-$(uname)-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-$(uname)-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

macOS via Homebrew:

brew install kind

macOS via MacPorts:

sudo port selfupdate && sudo port install kind

macOS via Bash:

# For Intel Macs
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-darwin-amd64
# For M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-darwin-arm64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

Windows:

curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.29.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

# OR via Chocolatey
choco install kind

使用kind

安装Docker并运行后,可以创建集群:

kind create cluster

删除集群:

kind delete cluster

从Kubernetes源代码创建集群:

  1. 确保Kubernetes克隆在$(go env GOPATH)/src/k8s.io/kubernetes
  2. 构建节点镜像并创建集群:
kind build node-image
kind create cluster --image kindest/node:latest

多节点集群和其他高级功能可以通过配置文件进行配置。

Golang示例代码

以下是一个使用Go操作kind的示例:

package main

import (
	"fmt"
	"log"
	"os/exec"
)

func main() {
	// 检查kind是否安装
	if _, err := exec.LookPath("kind"); err != nil {
		log.Fatal("kind not found in PATH, please install kind first")
	}

	// 创建kind集群
	fmt.Println("Creating kind cluster...")
	createCmd := exec.Command("kind", "create", "cluster")
	if output, err := createCmd.CombinedOutput(); err != nil {
		log.Fatalf("Failed to create kind cluster: %v\n%s", err, output)
	}
	fmt.Println("Kind cluster created successfully")

	// 获取kubeconfig
	fmt.Println("Getting kubeconfig...")
	getKubeconfigCmd := exec.Command("kind", "get", "kubeconfig")
	kubeconfig, err := getKubeconfigCmd.Output()
	if err != nil {
		log.Fatalf("Failed to get kubeconfig: %v", err)
	}
	fmt.Printf("Kubeconfig:\n%s\n", string(kubeconfig))

	// 删除集群(可选)
	fmt.Println("Deleting kind cluster...")
	deleteCmd := exec.Command("kind", "delete", "cluster")
	if output, err := deleteCmd.CombinedOutput(); err != nil {
		log.Fatalf("Failed to delete kind cluster: %v\n%s", err, output)
	}
	fmt.Println("Kind cluster deleted successfully")
}

社区支持

如有问题、功能请求或其他问题,可以通过以下方式联系维护者:

  • Kubernetes Slack中的#kind频道
  • 在本仓库提交issue
  • Kubernetes SIG-Testing邮件列表

当前维护者是@aojea@BenTheElder@stmcginnis - 如有任何问题,欢迎联系!

kind的优势

  • 支持多节点(包括HA)集群
  • 支持从源代码构建Kubernetes发布版本
  • 支持Linux、macOS和Windows
  • 是CNCF认证的符合标准的Kubernetes安装程序

更多关于golang使用Kubernetes IN Docker创建本地测试集群插件库kind的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang使用Kubernetes IN Docker创建本地测试集群插件库kind的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Kind在本地创建Kubernetes测试集群

Kind (Kubernetes IN Docker) 是一个使用Docker容器作为"节点"运行本地Kubernetes集群的工具,非常适合开发和测试。下面我将详细介绍如何使用Kind创建本地Kubernetes集群。

安装准备

1. 安装Docker

Kind依赖于Docker,首先需要安装Docker:

2. 安装Kind

# For Mac/Linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

# For Windows (PowerShell)
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.20.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

创建集群

基本集群创建

# 创建默认集群
kind create cluster

# 指定集群名称
kind create cluster --name my-cluster

自定义集群配置

创建kind-config.yaml文件:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
    protocol: TCP
- role: worker
- role: worker

然后创建集群:

kind create cluster --config kind-config.yaml

使用集群

获取kubectl配置

# 获取kubeconfig
kind export kubeconfig --name my-cluster

# 查看集群信息
kubectl cluster-info

部署示例应用

package main

import (
	"context"
	"fmt"
	"time"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	// 使用kind生成的kubeconfig
	config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err.Error())
	}

	// 创建clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	// 获取节点信息
	nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}

	fmt.Println("Nodes in cluster:")
	for _, node := range nodes.Items {
		fmt.Printf("- %s\n", node.Name)
	}

	// 部署一个nginx deployment
	deployment := `
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
`
	// 使用kubectl apply部署
	// 实际项目中可以使用client-go的dynamic client或特定API
	fmt.Println("\nDeploying nginx...")
	time.Sleep(2 * time.Second)

	// 检查部署状态
	deploys, err := clientset.AppsV1().Deployments("default").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}

	fmt.Println("\nDeployments in default namespace:")
	for _, deploy := range deploys.Items {
		fmt.Printf("- %s (%d replicas)\n", deploy.Name, *deploy.Spec.Replicas)
	}
}

常用操作

删除集群

kind delete cluster --name my-cluster

加载本地镜像到集群

kind load docker-image my-image:tag --name my-cluster

与集群交互

# 进入节点
docker exec -it my-cluster-control-plane bash

# 查看集群节点
kubectl get nodes

# 查看所有pod
kubectl get pods -A

高级配置

多节点集群

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

配置节点资源

nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraMounts:
  - hostPath: /path/on/host
    containerPath: /path/in/container

Kind是本地Kubernetes开发的绝佳工具,它轻量、快速且易于使用,特别适合CI/CD流水线和日常开发测试。

回到顶部