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