kind 搭建 k8s 集群

kind (Kubernetes IN Docker) 是一个用于在本地使用 Docker 容器快速搭建 Kubernetes 集群的工具。它主要用于测试和开发环境,允许用户在本地机器上轻松创建和管理多节点的 Kubernetes 集群,而无需复杂的安装过程。 kind 使用 Docker 容器作为 Kubernetes 节点,每个节点都是一个独立的容器,这使得集群的创建和销毁变得非常快速和高效。 kind 支持多种 Kubernetes 版本,用户可以根据需要选择不同的版本进行测试。此外, kind 还支持自定义集群配置,例如节点数量、网络设置等,满足不同的测试需求。总体而言,kind 是一个轻量级且易于使用的工具,非常适合开发者和测试人员在本地环境中快速搭建和管理 Kubernetes 集群。

安装 kind

  1. 首先需要确定要安装的 k8s 版本 (比如 1.34.0)

  2. 准备公网环境的 ubuntu 22.04 或 24.04 系统

  3. 安装 kubectl

  4. 安装 kind

  5. 安装 docker

# 安装 kubectl 1.34.0 版本
curl -LO https://dl.k8s.io/release/v1.34.0/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# 安装 kind
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.30.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/

# 安装 docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

创建 k8s 集群

kind 支持的 k8s 版本请参考镜像仓库:dockerhub kindest/node

# 首先更新下 kind
# 在 kind 版本低的时候,可能会遇到一些问题,比如 kind load docker-image 镜像不成功等等。。。
GO111MODULE="on" go install sigs.k8s.io/kind@latest

# 创建集群
# 增加了端口映射,可以通过宿主机的 80 和 443 端口访问集群内的服务,配合 ingress 使用
cat << EOF | kind create cluster --image=kindest/node:v1.34.0 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true
  podSubnet: "10.10.0.0/16"
  serviceSubnet: "10.11.0.0/16"
nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    - containerPort: 443
      hostPort: 443
      protocol: TCP
  - role: worker
  - role: worker
# containerdConfigPatches:
# - |-
#   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.ll2019.cn"]
#     endpoint = ["https://registry.ll2019.cn"]
EOF

# 安装 helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

cilium 网络插件安装

# 网络插件安装
# 如果使用了 disableDefaultCNI: true,需要手动安装网络插件,例如 cilium
# https://docs.cilium.io/en/stable/installation/kind/
helm repo add cilium https://helm.cilium.io/
helm repo update

docker pull quay.io/cilium/cilium:v1.18.3
kind load docker-image quay.io/cilium/cilium:v1.18.3

helm install cilium cilium/cilium --version 1.18.3 \
   --namespace kube-system \
   --set image.pullPolicy=IfNotPresent \
   --set ipam.mode=kubernetes \
   --set debug.verbose=""

# 部署一个 nginx 访问看看
kubectl create deployment nginx \
  --image=nginx:alpine \
  --replicas=3

kubectl expose deployment nginx \
  --port=80 \
  --target-port=80 \
  --type=NodePort

calico 网络插件安装
连接地址:https://docs.tigera.io/calico/latest/getting-started/kubernetes/kind

# 本地 kind 通过 crd 方式安装 calico 网络插件有问题,这里直接通过 manifest 安装
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.31.3/manifests/calico.yaml

kind + cloud-provider-kind

kind + cloud-provider-kind 可以解决 docker 网络和 k8s 集群网络不通的问题,适合在本地开发环境使用。
但是 cloud-provider-kind 映射了端口之后,在宿主机需要通过 docker ps 查看具体的端口映射关系,访问的时候需要使用宿主机的 IP 地址和映射的端口号访问,而不是直接使用 localhost 或 svc 的 EXTERNAL-IP 地址。

# 安装 cloud-provider-kind
brew install cloud-provider-kind

# 创建集群
kind create cluster --image=kindest/node:v1.34.0

# 启动 cloud-provider-kind
# 
sudo cloud-provider-kind -enable-lb-port-mapping

# 
kubectl label node kind-control-plane node.kubernetes.io/exclude-from-external-load-balancers-

# 部署 nginx
kubectl create deployment nginx \
  --image=nginx:alpine

# 配置 nginx 的 service,使用 LoadBalancer 类型
kubectl expose deployment nginx \
  --port=80 \
  --target-port=80 \
  --type=LoadBalancer

# 获取 nginx 的外部 IP 地址
kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP        37m
nginx        LoadBalancer   10.96.205.145   192.168.228.5   80:32752/TCP   12m

# 获取映射关系
docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                                                                                        NAMES
ffec5abae723   envoyproxy/envoy:v1.33.2   "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:32772->80/tcp, [::]:32772->80/tcp, 0.0.0.0:32773->10000/tcp, [::]:32773->10000/tcp   kindccm-b5e08e4d95dc
63ea2cf7763f   kindest/node:v1.34.0       "/usr/local/bin/entr…"   38 minutes ago   Up 38 minutes                                                                                                kind-worker
76dfef118527   kindest/node:v1.34.0       "/usr/local/bin/entr…"   38 minutes ago   Up 38 minutes                                                                                                kind-worker2
04c1cd866548   kindest/node:v1.34.0       "/usr/local/bin/entr…"   38 minutes ago   Up 38 minutes   127.0.0.1:63379->6443/tcp                                                                    kind-control-plane

# 访问 nginx
curl http://127.0.0.1:32772