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的配置选项如extraPortMappings和node-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
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集群上部署了一个私有可访问的服务。