3

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

 2 years ago
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 提供了多种安装方式,支持以下方式:

这里将在 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK