【云原生】基于Kind的Kubernetes环境部署

安装Kind

Kind(Kubernetes In Docker)是一个使用Docker构建、部署Kubernetes集群的工具。支持Linux、macOS以及Windows操作系统。非常适合用来在本地搭建Kubernetes集群的开发、测试环境。前面提到Kind是基于Docker的,故使用Kind还需要安装Docker,这里关于Docker安装不再赘述。这里在Mac环境下,我们直接利用brew工具安装Kind

bash 复制代码
# 安装 Kind
brew install kind

安装完毕后,查看Kind版本信息,确认安装成功

bash 复制代码
# 查看Kind版本信息
kind version

如下所示,kind安装成功

安装kubectl

kubectl是Kubernetes的命令行工具,可以让我们通过命令访问、操作、管理Kubernetes集群。brew安装方法如下

bash 复制代码
# 安装 kubectl
brew install kubectl

安装完毕后,查看kubectl版本信息,确认安装成功

bash 复制代码
# 查看kubectl版本信息
kubectl version --client

搭建K8s集群

搭建单节点集群

一切准备就绪后,我们就可以通过Kind直接使用命令搭建一个K8s集群。此时其是一个单节点的K8s集群

lua 复制代码
# 创建一个名为 my-k8s-cluster-1 的K8s集群
kind create cluster --name my-k8s-cluster-1

如下所示,通过Docker也不难看出,K8s集群搭建成功

这里补充说明下,在第一次通过Kind创建集群过程中。如果Docker本地没有node镜像会先需要拉取镜像,进而导致该命令执行阻塞时间较长。故此时我们先中止该命令执行,并通过上图红框确定当前使用node镜像信息为kindest/node:v1.24.0。然后利用docker pull命令先拉取该镜像到本地后,再利用创建Kind创建K8s集群

搭建多节点集群

如果期望通过Kind搭建多节点集群,可以通过配置文件实现。下面是创建一个包含2个控制平面节点、3个工作节点的K8s集群的配置文件。同时为了便于通过宿主机访问节点,还可以对部分端口进行映射

yaml 复制代码
# Kind 创建K8s集群 配置文件

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4

# 该集群包含2个控制平面节点、3个工作节点
nodes:
- role: control-plane
  # 设置端口映射, 便于通过宿主机访问节点
  extraPortMappings:
  - containerPort: 80
    hostPort: 8880
    listenAddress: "127.0.0.1"
  - containerPort: 443
    hostPort: 8443
    listenAddress: "127.0.0.1"
- role: control-plane
  # 设置端口映射, 便于通过宿主机访问节点
  extraPortMappings:
  - containerPort: 80
    hostPort: 9980
    listenAddress: "127.0.0.1"
  - containerPort: 443
    hostPort: 9443
    listenAddress: "127.0.0.1"
- role: worker
- role: worker
- role: worker

然后通过--config选项指定配置文件即可,具体创建集群的命令如下所示

perl 复制代码
# 使用my-k8s-cluster-3.yaml配置文件,创建一个名为 my-k8s-cluster-3 的K8s集群
kind create cluster --name my-k8s-cluster-3 --config my-k8s-cluster-3.yaml

效果如下所示,集群创建成功

上图我们发现工作节点的ROLES列显示为,只需给名为 node-role.kubernetes.io/worker 的标签打上相应的标签值即可

ini 复制代码
# 对指定节点添加名为node-role.kubernetes.io/worker的标签信息 
kubectl label node <节点名称> node-role.kubernetes.io/worker=<标签值>

# 对名为my-k8s-cluster-3-worker3的节点添加名为node-role.kubernetes.io/worker、值为worker的标签信息 
kubectl label node my-k8s-cluster-3-worker3 node-role.kubernetes.io/worker=worker

效果如下所示

「Note」 :这里多节点集群使用了2个控制平面节点,实际测试、开发的集群中最好只使用1个控制平面节点!!否则当Docker重启后,对于存在多个控制平面节点的集群而言,在0.14.0版本的Kind下有极大概率导致集群无法访问、使用,只能通过删除原异常集群、重建集群解决

部署K8s仪表盘Dashboard

Kubernetes还提供了一个基于Web的可视化管理页面------Dashboard。通过下述链接下载部署Dashboard的配置文件,并重命名为dashboard.yaml

raw.githubusercontent.com/kubernetes/...

然后编写一个名为service-account-secret.yaml的配置文件,用于创建服务账户、绑定角色实现授权。与此同时,由于K8s 1.24版本开始,创建服务账户时,不再自动生成包含Token的Secret对象。故我们也需要在该配置文件一并创建该服务账户的Secret。完整配置文件如下所示

yaml 复制代码
# 在kubernetes-dashboard命名空间下创建名为 admin-user 的服务账户
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---

# 将服务账户admin-user绑定到内置的ClusterRole集群角色cluster-admin上, 实现授权
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

---

# 对名为admin-user的服务账户手动创建Secret
apiVersion: v1
kind: Secret
metadata:
  name: admin-user-secret
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token

准备好上述两个配置文件后,依次通过kubectl apply命令应用。命令如下所示

bash 复制代码
# 部署 Dashboard
kubectl apply -f dashboard.yaml

# 创建服务账户并授权、创建Secret
kubectl apply -f service-account-secret.yaml

我们通过service-account-secret.yaml配置文件,给kubernetes-dashboard命名空间下名为admin-user的服务账户手动创建了一个名为admin-user-secret的Secret。现在我们就可以通过该Secret获取相应的Token了。具体地,可以通过kubectl describe、kubectl get两种方式获取。但需要注意的是,前者显示是Token的原文,而后者则是对Token进行了Base64编码。此处我们需要拿到**「Token的原文,故推荐前者」**。无需进行Base64解码

现在,我们在本地启动K8s Proxy,命令如下所示

bash 复制代码
# 前台启动K8s代理, 占用终端窗口
kubectl proxy

至此,我们就可利用浏览器打开K8s Dashboard的页面地址了

bash 复制代码
# K8s Dashboard 页面地址
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

打开后,选择Token认证方式,并填写我们刚刚获得的Token即可登录进入

DashBoard可视化效果如下所示

相关推荐
ningqw4 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友4 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh4 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫5 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong5 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉6 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment6 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术7 小时前
在我眼里,这就是天才般的算法!
后端·面试
绝无仅有7 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
后端·面试·github
程序视点7 小时前
Escrcpy 3.0投屏控制软件使用教程:无线/有线连接+虚拟显示功能详解
前端·后端