1. 概述

在使用Kubernetes时,我们缺乏一个帮助本地开发的工具——一个可以在Docker容器作为节点的情况下运行本地Kubernetes集群的工具。

在这篇教程中,我们将探索使用kind进行Kubernetes学习。kind主要用作Kubernetes的测试工具,但也可以用于本地开发和CI。

2. 配置

作为先决条件,我们应该确保系统中安装了Docker。在操作系统(和macOS的处理器)上安装Docker的一种简单方法是使用Docker Desktop

2.1. 安装Kubernetes命令行

首先,让我们安装Kubernetes命令行kubectl。在macOS上,我们可以使用Homebrew进行安装:

$ brew install kubectl

我们可以通过命令验证安装是否成功:

$ kubectl version --client

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", 
GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", 
BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}

同样,我们可以在Windows上使用curl下载:

curl -LO https://dl.k8s.io/v1.21.0/bin/windows/amd64/kubectl.exe.sha256

然后,我们应该将kubectl命令的二进制位置添加到我们的PATH变量中。

2.2. 安装kind

接下来,我们将在macOS上使用Homebrew安装kind:

$ brew install kind

为了验证安装是否成功,我们可以尝试以下命令:

$ kind version
kind v0.11.1 go1.15.6 darwin/amd64

但是,如果运行kind version命令不起作用,请务必将其位置添加到PATH变量中。

对于Windows操作系统,我们可以使用curl下载kind:

curl -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.11.1/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\kind\kind.exe

3. Kubernetes集群

现在,我们已经准备好使用kind来为Kubernetes准备本地开发环境。

3.1. 创建集群

首先,让我们使用默认配置创建本地Kubernetes集群:

$ kind create cluster

默认情况下,将创建名为kind的集群。然而,我们可以使用*-name*参数提供集群名称:

$ kind create cluster --name baeldung-kind
Creating cluster "baeldung-kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-baeldung-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-baeldung-kind
Thanks for using kind! 😊

此外,我们还可以使用YAML配置文件来配置集群。例如,让我们在baeldungConfig.yaml文件中编写一个简单的配置:

kind: Cluster
apiVersion: kind.x-k8s.io/v1
name: baeldung-kind

然后,让我们使用配置文件创建集群:

$ kind create cluster --config baeldungConfig.yaml

另外,我们也可以在创建集群时提供特定版本的Kubernetes镜像:

$ kind create cluster --image kindest/node:v1.20.7

3.2. 获取集群

让我们通过使用get命令检查创建的集群:

$ kind get clusters
baeldung-kind

同时,我们还可以确认相应的docker容器:

$ docker ps
CONTAINER ID  IMAGE                 COMMAND                 CREATED    STATUS        PORTS                      NAMES
612a98989e99  kindest/node:v1.21.1  "/usr/local/bin/entr…"  1 min ago  Up 2 minutes  127.0.0.1:59489->6443/tcp  baeldung-kind-control-plane

或者,我们可以通过kubectl确认节点:

$ kubectl get nodes
NAME                          STATUS   ROLES                  AGE   VERSION
baeldung-kind-control-plane   Ready    control-plane,master   41s   v1.21.1

3.3. 集群详情

一旦集群准备就绪,我们可以通过kubectl上的cluster-info命令检查详细信息:

$ kubectl cluster-info --context kind-baeldung-kind
Kubernetes master is running at https://127.0.0.1:59489
CoreDNS is running at https://127.0.0.1:59489/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

另外,我们还可以使用dump参数与cluster-info命令结合来提取有关集群的详细信息:

$ kubectl cluster-info dump --context kind-baeldung-kind

3.4. 删除集群

类似于get命令,我们可以使用delete命令删除特定集群:

$ kind delete cluster --name baeldung-kind

4. 入口控制器

4.1. 配置

我们需要一个ingress控制器以在本地环境和Kubernetes集群之间建立连接。

因此,我们可以使用kind的配置选项如extraPortMappingsnode-labels

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: baeldung-kind
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP

在这里,我们更新了baeldungConfig.yaml文件以设置ingress控制器的配置,将容器端口映射到主机端口。我们还通过定义ingress-ready=true使节点可以访问ingress。

然后,我们必须使用修改后的配置重新创建集群:

kind create cluster --config baeldungConfig.yaml

4.2. 部署

然后,我们将部署Kubernetes支持的ingress NGINX控制器,作为反向代理和负载均衡器:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

此外,我们还可以使用AWSGCE负载均衡器控制器。

5. 在本地部署服务

最后,我们已经准备好部署服务。对于本教程,我们可以使用一个简单的http-echo网络服务器,它作为一个Docker镜像可用

5.1. 配置

所以,让我们创建一个配置文件,定义服务并使用ingress将其本地托管:

kind: Pod
apiVersion: v1
metadata:
  name: baeldung-app
  labels:
    app: baeldung-app
spec:
  containers:
  - name: baeldung-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=Hello World! This is a Baeldung Kubernetes with kind App"
---
kind: Service
apiVersion: v1
metadata:
  name: baeldung-service
spec:
  selector:
    app: baeldung-app
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: baeldung-ingress
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: "/baeldung"
        backend:
          service:
            name: baeldung-service
            port:
              number: 5678
---

在这里,我们创建了一个名为baeldung-app的pod,带有text参数以及名为baeldung-service的服务。

然后,我们通过5678端口和*/baeldung* URI设置了ingress网络到baeldung-service

5.2. 部署

现在,我们已经准备好所有配置,并且我们的集群与ingress NGINX控制器集成,让我们部署服务:

$ kubectl apply -f baeldung-service.yaml

我们可以通过kubectl检查服务的状态:

$ kubectl get services
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
baeldung-service   ClusterIP   10.96.172.116   <none>        5678/TCP   5m38s
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP    7m5s

就是这样!我们的服务已部署并应该在localhost/baeldung处可用:

$ curl localhost/baeldung
Hello World! This is a Baeldung Kubernetes with kind App

注意:如果遇到与validate.nginx.ingress.kubernetes.io webhook相关的错误,我们应该删除ValidationWebhookConfiguration

$ kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

然后,再次部署服务。

6. 总结

在本文中,我们探索了使用kind进行Kubernetes。

首先,我们执行了包括安装Kubernetes命令行kubectl和kind的设置。然后,我们通过一些kind特性来创建/更新本地Kubernetes集群。

最后,我们集成了入口控制器并在Kubernetes集群上部署了一个私有可访问的服务。