使用 Docker 快速搭建单机版的 Kubernetes 集群
source link: https://segmentfault.com/a/1190000041141726
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
随着容器化、微服务、服务网格、服务编排、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 提供了多种安装方式,支持以下方式:
- On macOS via Homebrew
- On macOS via MacPorts
- On Windows via Chocolatey
- Installing From Release Binaries
- Installing From Source
这里将在 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 故障排查指南
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK