使用 Docker 快速搭建单机版的 Kubernetes 集群

随着容器化、微服务、服务网格、服务编排、DevOps 等云原生技术的流行，我们也要跟上时代的步伐，那么我们需要怎么上车呢？此时就需要一个易于在本地运行且 Kubernetes 的工具，可在你的笔记本电脑上的虚拟机内轻松创建单机版 Kubernetes 集群，便于我们使用 Kubernetes 进行日常开发与学习。那么接下让我们轻松地搭建一个更贴近真实的 K8s 环境。

工具推荐

对于本地实验，还可以使用各种 Kubernetes 实现以运行 Kubernetes 群集，如

Kind (https://kind.sigs.k8s.io/)

Minikube (https://minikube.sigs.k8s.io/docs/)

MicroK8s (https://microk8s.io/)

在线体验 K8s (https://labs.play-with-k8s.com/)

Dockerized (https://github.com/y0ngb1n/dockerized) 推荐我的个人项目，欢迎 Star

使用上面任一工具的目标都能快速运行一个本地学习的 Kubernetes 群集，其中我个人最喜欢的是 Kind。

搭建 K8s 集群

下面分别尝试 Kind 与 Minikube 创建单机版 Kubernetes 集群。

先安装 kubectl

无论使用哪个工具，都需要先正确安装 kubectl Kubernetes 命令行工具，否则安装完 Kind、Minikube 等环境后无法执行 kubectl 命令。

安装文档：https://kubernetes.io/zh/docs/tasks/tools/#kubectl

使用 Kind 创建 K8s 集群

kind is a tool for running local Kubernetes clusters using Docker container “nodes”.

安装 kind

Kind 提供了多种安装方式，支持以下方式：

On macOS via Homebrew

On macOS via MacPorts

On Windows via Chocolatey

Installing From Release Binaries

Installing From Source

这里将在 Linux 环境下以 Installing From Release Binaries 方式进行安装：

Copy
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
# mv ./kind /some-dir-in-your-PATH/kind

创建 K8s 集群

Copy
kind create cluster
# kind delete cluster

检验安装环境

Copy
🐋️ ~ kind get clusters
kind

使用 Minikube 创建 K8s 集群

安装 minikube

选择不同环境下的安装方式，参考 https://minikube.sigs.k8s.io/docs/start/

Copy
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

国内网络环境，使用如下命令将自动使用阿里云服务来支持 minikube 的环境配置，参考 https://developer.aliyun.com/article/221687

Copy
minikube start --image-mirror-country='cn'
# minikube delete

检验安装环境

Copy
🐋️ ~ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

启动 K8s 控制台，参考 https://minikube.sigs.k8s.io/docs/handbook/dashboard/

Copy
minikube dashboard
# or
minikube dashboard --url

查看 minikube 支持的扩展列表，参考 https://minikube.sigs.k8s.io/docs/handbook/deploying/

Copy
minikube addons list

检验 K8s 集群

Copy
🐋️ ~ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"}

# 查看当前指向的 k8s 环境，kind/minikube 安装时会自动修改 kubectl 配置
🐋️ ~ kubectl config current-context
kind-kind

# 如本地有多个 k8s 环境，可手动切换
🐋️ ~ kubectl config use-context minikube
Switched to context "minikube".

# 检查服务器节点
🐋️ ~ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 36m v1.22.3

🐋️ ~ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 15m v1.22.3 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.4.0-42-generic docker://20.10.8

# 查看 k8s 集群信息
🐋️ ~ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

K8s 初体验

快速尝鲜

Copy
# 启动单实例 nginx
🐋️ ~ kubectl create deployment nginx-depl --image=nginx

# 查看运行的实例
🐋️ ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-depl-5c8bf76b5b-zw8ms 1/1 Running 0 70s

# 转发一个本地 8080 端口到 Pod 80 端口
🐋️ ~ kubectl port-forward nginx-depl-5c8bf76b5b-zw8ms 8080:80

# 本地访问
🐋️ ~ curl 127.0.0.1:8080

# 清除实例
🐋️ ~ kubectl delete deployment nginx-depl

小试牛刀

nginx-pod.yml

Copy
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx

nginx-svc.yml

Copy
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31080
selector:
app: nginx
type: NodePort

执行命令：

Copy
# 一键发布，启动实例
🐋️ ~ kubectl apply -f .

# 调试 Pod
🐋️ ~ kubectl describe pod nginx
🐋️ ~ kubectl port-forward nginx 8080:80

# 调试 Service
🐋️ ~ kubectl describe svc nginx-svc
🐋️ ~ kubectl port-forward service/nginx-svc 8080:80

# 清除实例
🐋️ ~ kubectl delete -f .

注意事项

需要先正确安装 kubectl

通过 Port-Forward 可本机访问 Pod，仅限本地调试环境，如 curl 127.0.0.1:8080

通过 Service 反向代理时，需要使用 K8s 集群的 IP 进行访问，使用 kubectl get nodes -o wide 查看 K8s 集群的 IP

Service 是 K8s 提供反向代理的机制，负责反向路由 + 负载均衡

NodePort 是 Service 的一种类型，可将 Service 暴露给外网

NodePort 范围 30000~32767

Label 是 K8s 的种打标签机制

Selector 是 K8s 中的路由选择定位机制

使用 Kind 或 Minikube 部署的 K8s 集群，node 基于容器运行而不是宿主机，使用 Service 反向代理时，只在 node 节点容器中 kube-proxy 生效，使用 docker exec -it kind-control-plane bash 验证这一点，而不是直接映射在宿主机上

K8s 故障排查指南

参考链接