使用Kind在Mac上快速搭建多节点K8S环境

这篇文章是在以下文章的基础上扩展的内容。如果您在阅读本文之前先读一下那篇文章,会有更深入的理解。
关于在Mac上使用Docker和vctl容器运行kind,作者是@plumchang。

写作动机

我一直想学习K8S,但一直在拖延。但是以前有一次我突然下定决心买了专业书来学习。然而,当时搭建多节点K8S环境的难度相当大,导致我遇到了挫折。但是,我得知环境搭建现在比以前容易多了,于是在新年过后向@plumchang请教并进行了验证。不过,由于多节点环境(例如: 主节点 x 1,工作节点 x 3)会消耗太多内存,导致验证非常困难。因此,我准备提供一个内存充足的环境来进行验证。

検証環境

    • macOS 11.4 Big Sur (MacBook Air 2018 DRAM 16GB)1

Docker Desktop Version 3.4.0
Docker Compose Version 1.29.2
Go 1.16.4
VMWare Fusion 12.1.2
kind v0.11.1
Homebrew 3.1.12
kind v0.9.0(vctlコンテナ用)

建立环境

在本次验证中的环境中,Docker Desktop、Docker Compose、Go语言和VMWare Fusion已经设置完成。因此,请在这些应用程序安装完成后进行以下步骤。

在Docker中安装Kubernetes。

首先,我们需要安装kind。可以使用Go语言的包管理器go get命令来进行安装。

go get sigs.k8s.io/kind

2021年12月5日更新:现在可以使用Homebrew进行安装了。

我已确认在macOS 12.0.1 Monterey中可以通过以下方法进行安装。

brew install kind
    参考

已安装了 kind v0.11.1。

安装kubectl

以下是操作K8S的命令。您可以通过Homebrew轻松进行安装。

brew install kubectl

安装完成后,请在.bashrc文件中追加以下内容。

source <(kubectl completion bash)

重新加载并启用.bashrc文件。

source .bashrc

以上で、环境已经设置完成。现在,我们将开始构建多集群K8S环境。

    • 参考

 

    参考(Linux/WSL2@Win向けの情報)

搭建多集群K8S环境。

我們將建立一個由1個Master節點和3個Worker節點組成的K8S環境。我們將嘗試使用Docker容器來搭建,還有使用vctl容器(VMWare Fusion)來搭建,共有兩種方法。

如果使用Docker容器来构建的话

首先,我们将使用常规的Docker容器进行环境搭建。

创建config.yml文件

我們將創建一個名為config.yml的文件,該文件中記錄了用於構建多節點環境的配置,可以參考官方文檔。

2022年11月20日追加:对外部访问的响应

在K8s上部署的服务有时需要从外部访问,但默认情况下是无法访问的。因此,我们需要在config.yml文件中添加配置,并将服务类型设置为NodePort,以便从外部访问该服务。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30950
    hostPort: 9898
- role: worker
- role: worker
- role: worker

在设置服务时开放端口时,无论容器内部的端口号如何,都需要始终将其与30950关联起来。当从外部访问时,例如从运行K8s的机器上进行访问时,可以通过http://localhost:9898进行访问。

spec:
  type: NodePort
  ports:
  - name: http
    nodePort: 30950
    port: 5678

请参照下面的中文陈述:

 

执行kind命令,K8S将启动多节点。

kind create cluster --name k8s --config=config.yml
执行结果
$ kind create cluster –name k8s –config=config.yml
正在创建集群 “k8s” …
✓ 确保节点镜像 (kindest/node:v1.21.1) ?
✓ 准备节点 ? ? ? ?
✓ 写入配置文件 ?
✓ 启动控制平面 ?️
✓ 安装CNI ?
✓ 安装StorageClass ?
✓ 加入工作节点 ?
将kubectl上下文设置为 “kind-k8s”
现在您可以使用以下命令操作您的集群:kubectl cluster-info –context kind-k8s

有任何问题、错误或功能请求吗?请告诉我们!https://kind.sigs.k8s.io/#community 🙂

确认节点

当使用kubectl命令进行确认时,我们可以看到多节点环境已经启动。

$ kubectl get nodes
NAME                STATUS   ROLES                  AGE     VERSION
k8s-control-plane   Ready    control-plane,master   3m19s   v1.21.1
k8s-worker          Ready    <none>                 2m49s   v1.21.1
k8s-worker2         Ready    <none>                 2m49s   v1.21.1
k8s-worker3         Ready    <none>                 2m49s   v1.21.1

部署的操作验证

为了确认操作,我将尝试部署 nginx。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

按以下顺序依次执行以下命令。

kubectl apply -f deployment.yml
kubectl create service nodeport nginx --tcp=8080:80
kubectl port-forward --address localhost svc/nginx 8080:8080
以下是命令行执行的结果:运行结果:
$ kubectl apply -f deployment.yml
成功创建了deployment.apps/nginx-deployment

$ kubectl get pods
名称 就绪状态 状态 重启次数 年龄
nginx-deployment-66b6c48dd5-fnj9z 1/1 运行中 0 48秒
nginx-deployment-66b6c48dd5-kssdc 1/1 运行中 0 48秒
nginx-deployment-66b6c48dd5-x6kcn 1/1 运行中 0 48秒

$ kubectl create service nodeport nginx –tcp=8080:80
成功创建了service/nginx

$ kubectl port-forward –address localhost svc/nginx 8080:8080
将127.0.0.1:8080转发到80
将[::1]:8080转发到80
处理8080端口的连接

    • 参考

 

    参考2

在一个新窗口中打开终端,并执行以下命令。

curl http://localhost:8080
执行结果
$ curl http://localhost:8080

 

欢迎来到nginx!

如果您看到这个页面,说明nginx web服务器已经成功安装并正常运行。还需要进一步配置。

在线文档和支持,请参考
nginx.org
商业支持可以在
nginx.com找到。

感谢您使用nginx。

 

整理清理

执行以下命令。

kubectl delete services nginx
kubectl delete -f deployment.yml
$ kubectl delete services nginx
service "nginx" deleted
$ kubectl delete -f deployment.yml
deployment.apps "nginx-deployment" deleted

如果需要销毁环境的情况下

执行以下命令。

kind delete cluster --name k8s
执行结果
$ kind delete cluster –name k8s
正在删除集群 “k8s” …

尝试进行Shell化

根据我的理解,使用kind进行环境搭建更像是一种临时性环境,可以根据需要进行创建和销毁,类似试用环境的使用方式。(仅为作者主观观点)本次是为了学习而进行环境搭建,所以我决定在需要的时候启动,并准备了启动脚本和停止脚本,以便在完成后能够进行销毁。

#!/bin/bash

kind create cluster --name k8s --config=config.yml
#!/bin/bash

kind delete cluster --name k8s

授予权限的操作请执行以下命令。

chmod +x build_env.sh
chmod +x delete_env.sh

如果使用vctl容器进行构建的话

以下的行程假設在安裝了VMWare Fusion的環境下執行。VMWare Fusion Player可免費使用。本次驗證是在Mac上進行,所以使用了Fusion,但是如果您使用Linux/Windows,似乎也可以使用VMWare的Workstation Pro或Workstation Player進行相同的構建。(參考)

最初的设置

新建一个终端,按照以下顺序执行命令。仅首次执行时,将进行与kubectl和kind的配合处理。
vctl环境将在终端关闭时销毁所建立的环境。

vctl system start
执行结果
$ vctl系统开始
正在下载3个文件…
正在下载[kind-darwin-amd64 99.44% kubectl 84.97% crx.vmdk 46.15%]
kind-darwin-amd64 100.00% 下载完成
正在下载[kubectl 99.88% crx.vmdk 60.89%]
kubectl 100.00% 下载完成
正在下载[crx.vmdk 99.42%]
crx.vmdk 100.00% 下载完成
成功下载3个文件。
正在准备存储…
容器存储已成功准备在/Users/yuhkiyano/.vctl/storage下
正在启动容器运行时…
容器运行时已启动。
vctl kind
执行结果
$ vctl kind
现在可以使用基于vctl的KIND了。KIND将使用vctl容器作为“节点”来运行本地Kubernetes集群。
* 在当前终端中,所有Docker命令都已别名为vctl。在当前窗口执行的Docker命令将通过vctl执行。如果您需要使用常规的Docker命令,请使用单独的终端窗口。

可以看出kind的版本不同。已安装了适用于vctl的kind。

$ kind version
kind v0.9.0 go1.15.2 darwin/amd64

完成到这一步后,先重新启动电脑。如果按照现在的方式执行,不知何故会出现错误,无法构建多节点环境(无法保留错误信息的存档……)。

多节点环境的启动

在计算机重新启动后执行以下命令。

kind create cluster --name k8s --config=config.yml
执行结果
作者在shell中执行。
$ kind create cluster –name k8s –config=config.yml
正在创建集群”k8s”…
✓ 确保节点镜像 (kindest/node:v1.19.1) ?
✓ 准备节点 ? ? ? ?
✓ 写入配置 ?
✓ 启动控制平面 ?️
✓ 安装CNI插件 ?
✓ 安装存储类别 ?
✓ 加入工作节点 ?
设置kubectl上下文为”kind-k8s”
现在您可以使用以下命令操作集群:kubectl cluster-info –context kind-k8s

感谢使用kind! ?

我们可以构建一个多节点环境如下所示。

$ kubectl get nodes
NAME                STATUS   ROLES    AGE     VERSION
k8s-control-plane   Ready    master   2m48s   v1.19.1
k8s-worker          Ready    <none>   86s     v1.19.1
k8s-worker2         Ready    <none>   86s     v1.19.1
k8s-worker3         Ready    <none>   85s     v1.19.1

完成后,桌面被一群虚拟机占据。

image.png

进行部署的操作验证

我进行了与Docker容器类似的部署操作验证。由于操作完全相同,因此将省略详细说明。

事后处理

按照以下顺序执行以下命令。

kubectl delete service nginx
kubectl delete -f deployment.yml 
kind delete cluster --name k8s
vctl system stop
执行结果
$ kubectl删除服务nginx
服务”nginx”已被删除
$ kubectl删除-f deployment.yml
应用程序部署”nginx-deployment”已被删除
$ kind删除集群–名称k8s
正在删除集群”k8s”…
$ vctl系统停止
终止容器运行时…
容器运行时已停止。
分离存储…
容器存储已分离。

总结

我尝试使用kind来搭建多节点的Kubernetes环境,并使用Docker容器和vctl容器。尽管这两者最终生成的环境配置相同,但是由于vctl容器是基于虚拟机的,所以其运行速度比使用Docker容器的环境慢得多。此外,它还消耗更多的内存等资源。如果想要方便地使用,除非有非常强烈的理由(比如不喜欢Docker),否则我认为使用Docker容器会更明智。

我未来的目标

    • K8S完全マスター

 

    • GPUサーバーにK8SをKVMで構築して、GPUも使えるWorkerノードを持つ環境を構築

@plumchangさんも巻き込んでK8S資格 x 3に挑戦

补充事项

当使用kubectl get nodes命令获取节点信息时,发现仅worker节点的ROLES显示为,这种状态让人感到不舒服。

$ kubectl get nodes
NAME                STATUS   ROLES                  AGE     VERSION
k8s-control-plane   Ready    control-plane,master   5h31m   v1.21.1
k8s-worker          Ready    <none>                 5h31m   v1.21.1
k8s-worker2         Ready    <none>                 5h31m   v1.21.1
k8s-worker3         Ready    <none>                 5h31m   v1.21.1

通过以下命令来解决。

kubectl label nodes k8s-worker kubernetes.io/role=worker
执行结果
$ kubectl标记节点k8s-worker kubernetes.io/role=worker
节点/k8s-worker已标记
$ kubectl标记节点k8s-worker2 kubernetes.io/role=worker
节点/k8s-worker2已标记
$ kubectl标记节点k8s-worker3 kubernetes.io/role=worker
节点/k8s-worker3已标记

在以下这样的情况下,worker节点的角色变为了worker。

$ kubectl get nodes
NAME                STATUS   ROLES                  AGE     VERSION
k8s-control-plane   Ready    control-plane,master   5h38m   v1.21.1
k8s-worker          Ready    worker                 5h38m   v1.21.1
k8s-worker2         Ready    worker                 5h38m   v1.21.1
k8s-worker3         Ready    worker                 5h38m   v1.21.1

参考资料

    • Dockerとvctlコンテナでkind @ Mac

 

    • vctl コマンドを使用したコンテナの管理と Kubernetes クラスタの実行

 

    • VMware Workstation 16 Proでvctl kindを試してみた

 

    • kind公式

 

    • kubectlのインストールおよびセットアップ

 

    How to add roles to nodes in Kubernetes?
8GB的DRAM在构建本次多节点环境中似乎运行情况严峻。
广告
将在 10 秒后关闭
bannerAds