安装kind
下载 https://github.com/kubernetes-sigs/kind/releases/download/0.17.0/kind-linux-amd64
执行以下命令:
mv kind-linux-amd64 /usr/local/bin/kind
chmod 777 /usr/local/bin/kind
之前需要先在本地主机安装好docker
yum -y install yum-utils device-mapper-persistent-datalvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
docker run hello-world
安装kubectl
kubectl是Kubernetes的命令行工具,可以让我们通过命令访问、操作、管理Kubernetes集群。brew安装方法如下
# 安装 kubectl
curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl
mv kubectl /usr/local/bin/kubectl
安装完毕后,查看kubectl版本信息,确认安装成功
# 查看kubectl版本信息
kubectl version --client
如下所示,kubectl安装成功
使用kind创建kubernetes集群
下面的命令将会创建一个带有默认选项的集群:
kind create cluster
输出内容如下所示:
如果我们想要通过kind
创建多个集群怎么办呢?其实kind
也考虑到了这种场景,通过在创建集群命令对的后面增加 name
参数指定集群的标识名就可以了。
kind create cluster --name multi-node
输出内容如下:
$ kind create cluster --name multi-node
Creating cluster "multi-node" ...
✓ Ensuring node image (kindest/node:v1.24.0)
✓ Preparing nodes
✓ Writing configuration
✓ Starting control-plane ️
✓ Installing CNI
✓ Installing StorageClass
✓ Joining worker nodes
Set kubectl context to "kind-multi-node"
You can now use your cluster with:
kubectl cluster-info --context kind-multi-node
Thanks for using kind!
默认命令创建的集群名称是
kind
, 如果不指定标识没名称而使用默认命令再次创建,你将得到一个
ERROR
错误提示,大意是集群创建失败,原因名称为kind
的集群已经存在了。输出如下:
$ kind create cluster
ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"
搭建单节点集群
一切准备就绪后,我们就可以通过Kind直接使用命令搭建一个K8s集群。此时其是一个单节点的K8s集群
# 创建一个名为 my-k8s-cluster-1 的K8s集群
kind create cluster --name my-k8s-cluster-1
这里补充说明下,在第一次通过Kind创建集群过程中。如果Docker本地没有node镜像会先需要拉取镜像,进而导致该命令执行阻塞时间较长。故此时我们先中止该命令执行,并通过上图红框确定当前使用node镜像信息为kindest/node:v1.24.0。然后利用docker pull命令先拉取该镜像到本地后,再利用Kind创建K8s集群
# 拉取 kindest/node:v1.24.0 的Docker镜像
docker pull kindest/node:v1.24.0
创建多节点的集群
就像你看到的一样,使用不带额外配置的创建集群命令创建出来的集群默认情况只是单节点的集群。如果我们使用如下的配置是可以创建出多节点集群的(你也可以增加不止一个控制面板来模拟高可用):
# three node (two wokers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
为了使配置生效,需要增加
--config
参数指定配置文件所在路径和名称:
kind create cluster --name multi-node --config=multi-node.yaml
如果现在检查集群中节点的数量,你将会看到如下内容:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
multi-node-control-plane Ready control-plane 73m v1.24.0
multi-node-worker Ready <none> 72m v1.24.0
multi-node-worker2 Ready <none> 72m v1.24.0
检测集群环境
现在你已经知道如何创建单节点和多节点的集群了,是时候测试我们的应用是如何工作的了。例如,如果我们想要使用Docker Hub仓库的镜像测试一个应用该如何做呢?
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-nginx
name: web-nginx
spec:
replicas: 3
selector:
matchLabels:
app: web-nginx
template:
metadata:
labels:
app: web-nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-nginx
spec:
selector:
app: web-nginx
type: NodePort
ports:
- port: 80
nodePort: 30080
我们需要创建一个带有额外参数的集群,目的是暴露我们可以在集群外部访问应用的端口,配置参数如下:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30070
以上配置是将主机端口
30070
映射到集群内容的
30080
端口,当我们访问
http://localhost:30070
时集群的控制面板会将请求转发到集群内容端口为 30080 的容器处理。
通过执行如下命令使端口映射生效:
kind create cluster --config=config-with-port-mapping.yaml
现在就可以使用
docker ps
命令查看容器暴露的端口和对应的映射关系了
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfbc954b72cb kindest/node:v1.24.0 "/usr/local/bin/entr..." About an hour ago Up About an hour multi-node-worker
8dc51065e428 kindest/node:v1.24.0 "/usr/local/bin/entr..." About an hour ago Up About an hour multi-node-worker2
36e801dafef8 kindest/node:v1.24.0 "/usr/local/bin/entr..." About an hour ago Up About an hour 127.0.0.1:62517->6443/tcp, 0.0.0.0:30070->30080/tcp multi-node-control-plane
执行如下命令启动应用:
kubectl create -f nginx.yaml
现在你就可以通过
http://localhost:30070
访问你本地集群的服务了
部署K8s仪表盘Dashboard
根据下面的配置暴露31000端口,使用kind先创建一个集群
kind create cluster --name my-k8s-cluster-1 --config=config-with-port-mapping.yaml
Kubernetes还提供了一个基于Web的可视化管理页面------Dashboard。通过下述链接下载部署Dashboard的配置文件,并重命名为dashboard.yaml
# 部署 Dashboard 配置文件
https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
然后编写一个名为service-account-secret.yaml的配置文件,用于创建服务账户、绑定角色实现授权。与此同时,由于K8s 1.24版本开始,创建服务账户时,不再自动生成包含Token的Secret对象。故我们也需要在该配置文件一并创建该服务账户的Secret。完整配置文件如下所示
# 在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
修改下 kubernetes-dashboard.yaml文件 暴露31000端口
确定一下确实暴露31000端口
准备好上述两个配置文件后,依次通过kubectl apply命令应用。命令如下所示
# 部署 Dashboard
kubectl apply -f kubernetes-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解码
# 该方式下 Token 为原文
kubectl describe secret admin-user-secret -n kubernetes-dashboard
# 该方式下 Token 使用了Base64编码
kubectl get secret admin-user-secret -n kubernetes-dashboard -o yaml
命令结果如下所示
现在,我们在本地启动浏览器 访问
fhttps://192.168.59.143:31000/
至此,我们就可利用浏览器打开K8s Dashboard的页面地址了
打开后,选择Token认证方式,并填写我们刚刚获得的Token即可登录进入
键盘 输入 thisisunsafe
DashBoard可视化效果如下所示
命令
Kind基本命令
「查看集群列表」
kind get clusters
「删除指定集群」
--name选项用于指定欲删除集群的名称
# 删除名为 my-k8s-cluster-2 的集群
kind delete cluster --name my-k8s-cluster-2
「删除所有集群」
--all用于指示删除所有集群
# 删除所有集群
kind delete clusters ---all
kubectl基本命令
「查看当前上下文」
kubectl用于操作、管理K8s集群。故当存在多个集群的时候,我们需要确定当前操作的是哪个集群。即所谓的Context上下文。具体地,通过下列命令实现
# 查看 当前上下文信息
kubectl config current-context
「查看上下文列表」
通过下述命令,可以查看全部的上下文列表
# 查看上下文列表、当前上下文信息
kubectl config get-contexts
效果如下所示。其中 CURRENT 列中标记为*星号的行,即为当前上下文。即正在操作的K8s集群;而NAME则表示上下文的名称
「切换上下文」
如果期望操作其他的集群。则只需将上下文切换到该集群的上下文即可
# 切换当前上下文
kubectl config use-context [上下文的名称]
效果如下所示
「重命名上下文名称」
同时还可以对上下文的名称进行重命名
# 将指定的上下文 修改为 新名称
kubectl config rename-context [上下文的原名称] [上下文的新名称]
效果如下所示