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

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

工具推荐

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

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

搭建 K8s 集群

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

先安装 kubectl

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

使用 Kind 创建 K8s 集群

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

安装 kind

Kind 提供了多种安装方式,支持以下方式:

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

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 集群

kind create cluster
# kind delete cluster

检验安装环境

🐋️ ~ kind get clusters
kind

使用 Minikube 创建 K8s 集群

安装 minikube

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

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

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

检验安装环境

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

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

minikube dashboard
# or
minikube dashboard --url

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

minikube addons list

检验 K8s 集群

🐋️ ~ 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 初体验

快速尝鲜

# 启动单实例 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

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

nginx-svc.yml

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

执行命令:

# 一键发布,启动实例
🐋️ ~ 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 故障排查指南

a-visual-guide-on-troubleshooting-kubernetes-deployments

参考链接

感谢您的阅读,本文由 杨斌的博客 版权所有。如若转载,请注明出处:杨斌的博客(https://y0ngb1n.github.io/a/running-local-Kubernetes-clusters-using-docker.html
使用 ELK 集中管理 Spring Boot 应用日志
Kubernetes 入门到实践:搭建 K3s 集群初体验