巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !


完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernetes 来运行我们的应用,但是并不要求达到生产级别的集群,本文我们将探讨几种本地轻松配置 Kubernetes 集群的方法。

本地 Kubernetes 集群

我们先来回顾几种适合在我们自己的电脑上运行 Kubernetes 集群的方案。

Minikube

Minikube 是 Kubernetes 项目文档中建议使用的一种解决方案,它用一个单节点集群部署一个虚拟机,我们需要付出虚拟化的代价,主机的最低要求 2CPU、2G内存、20G 存储空间。这是一种简单有效的学习 kubectl 命令的方法,但是单节点会有一些的不方便的地方,但 Minikube 团队最近引入了多节点作为实验性功能,来帮助解决这个问题。

Kind

Kind 是 Kubernetes SIG 的另一种用于本地部署集群的方法。他的核心实现是让整个集群运行在 Docker 容器中。因此,它比 Minikube 更容易设置和更快启动。它支持单个节点或多 master 以及多工作节点。Kind 是为一致性测试和用于 CI 管道而创建的,提供了一些不错的功能,比如可以直接在集群内部加载 Docker 镜像,而不需要推送到外部镜像仓库。

k3s / k3d

K3s 是一个轻量级的集群,为了实现这种极简主义,做了一些取舍。

  • 集群的默认存储是使用 SQLite 而不是 Etcd

  • 所有的控制平面组件都封装在一个单一的二进制中

  • 控制外部依赖的数量

K3d 是一个允许我们在 Docker 容器内运行 k3s 的工具,就像 Kind 一样。

应该选哪个?

我个人的需求是:

  • 集群要快速启动和停止

  • 不同的集群可以并排运行

  • 集群必须使用最少的系统资源

对我来说,最适合的是 k3d,因为它很容易配置,它在 Docker 中运行,消耗的资源很少,而且开箱即用功能齐全。现在让我们来看看如何使用 k3d 建立一个集群。

使用 k3d 启动集群

首先先获取 k3d,通过 https://github.com/rancher/k3d#get 获取安装方式。

创建新的 k3d 集群

直接运行下面的命令即可创建一个新的集群:

$ k3d cluster create devcluster \  
--api-port 127.0.0.1:6443 \  
-p 80:80@loadbalancer \  
-p 443:443@loadbalancer \  
--k3s-server-arg "--no-deploy=traefik"  
INFO[0000] Created network 'k3d-devcluster'               
INFO[0000] Created volume 'k3d-devcluster-images'         
INFO[0001] Creating node 'k3d-devcluster-server-0'        
INFO[0016] Pulling image 'docker.io/rancher/k3s:v1.18.9-k3s1'   
INFO[0040] Creating LoadBalancer 'k3d-devcluster-serverlb'   
INFO[0056] Pulling image 'docker.io/rancher/k3d-proxy:v3.1.3'   
INFO[0064] (Optional) Trying to get IP of the docker host and inject it into the cluster as 'host.k3d.internal' for easy access   
INFO[0066] Successfully added host record to /etc/hosts in 2/2 nodes and to the CoreDNS ConfigMap   
INFO[0066] Cluster 'devcluster' created successfully!     
INFO[0066] You can now use it like this:                  
kubectl cluster-info  

上面的创建集群命令有几个需要注意的地方:

  • 我们将本地主机的80和443端口映射到 k3s 虚拟负载均衡器上,这可以让我们能够直接从本地主机上访问到 ingress 资源。

  • 群集的部署没有使用默认的 Traefik Ingress 控制器。

为什么要禁用 Traefik?因为我们可能想使用另一个 Ingress 控制器,或者因为 k3s 默认是与 Traefik 1 绑定在一起的,后面我们会安装Traefik 2 版本。

获取凭证

运行下面的命令获取你的凭证,将其保存在文件中并导出到你的环境中:

$ mkdir -p $HOME/k3d  
$ k3d kubeconfig get devcluster > $HOME/k3d/kubeconfig  
$ export KUBECONFIG=$HOME/k3d/kubeconfig  

通过运行一个简单的 Kubectl 命令来测试你是否可以访问集群。

$ kubectl cluster-info  
Kubernetes master is running at [https://127.0.0.1:6443](https://127.0.0.1:6443/)  
CoreDNS is running at [https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy](https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy)  
Metrics-server is running at [https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy](https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy)  
  
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.  

安装 Traefik 2

我们可以直接使用 Helm 来快速安装 Traefik 2:

$ helm repo add traefik https://containous.github.io/traefik-helm-chart  
"traefik" has been added to your repositories  
$ helm repo list  
NAME    URL                                              
traefik https://containous.github.io/traefik-helm-chart  
$ helm install traefik traefik/traefik  
NAME: traefik  
LAST DEPLOYED: Sun Oct 18 01:18:16 2020  
NAMESPACE: default  
STATUS: deployed  
REVISION: 1  
TEST SUITE: None  

部署完成后检查 Traefik 是否正常工作,我们可以通过 port-forward  dashboard 来验证:

$ kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) --address 0.0.0.0 9000:9000  

然后在浏览器中访问 http://localhost:9000/dashboard/,正常可以访问到 traefik 的 dashboard 页面。


部署应用

接下来部署一个简单的应用程序来验证我们的 Ingress Controller 是否正确配置了,这里我们使用 whoami 应用程序:

$ kubectl create deploy whoami --image containous/whoami  
deployment.apps/whoami created  
$ kubectl expose deploy whoami --port 80  
service/whoami exposed  

然后我们定义一个 Ingress 规则来使用我们新的 Traefik,Traefik 既能读取自己的 CRD IngressRoute,也能读取传统的 Ingress 资源。

apiVersion: networking.k8s.io/v1beta1  
kind: Ingress  
metadata:  
  name: whoami  
  annotations:  
    traefik.ingress.kubernetes.io/router.entrypoints: web,websecure  
    traefik.ingress.kubernetes.io/router.tls: "true"  
spec:  
  rules:  
  - http:  
      paths:  
      - path: /  
        backend:  
          serviceName: whoami  
          servicePort: 80  

在这个例子中,我们在 HTTP 和 HTTPs 两个入口点上暴露了 whoami 服务,每一个 URL 都会被发送到该服务上,我们可以在 Traefik Dashboard 上看到新的路由器。

要测试这个应用我们可以直接在浏览器中访问:https://localhost/  即可,这是因为上面我们安装 Traefik 的时候自动创建了一个 LoadBalancer 的 Service 服务。

$ kubectl get svc  
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE  
kubernetes   ClusterIP      10.43.0.1     <none>        443/TCP                      13m  
traefik      LoadBalancer   10.43.32.29   172.19.0.2    80:31005/TCP,443:31507/TCP   7m25s  
whoami       ClusterIP      10.43.98.9    <none>        80/TCP                       4m5s  

总结

从上面示例可以看出创建一个开发级别的集群是非常简单的,而且还有更多的功能可以挖掘,包括 k3s 的 Helm charts 自动部署或者使用 Golang API 来管理啊 Kind 的集群,快使用用一个功能齐全的 Kubernetes 集群取代你的老式 Docker-compose 吧。

原文链接:https://codeburst.io/creating-a-local-development-kubernetes-cluster-with-k3s-and-traefik-proxy-7a5033cb1c2d

本文转载自:「k8s技术圈」,原文:https://tinyurl.com/yyqa9dq3,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。


你可能还喜欢

点击下方图片即可阅读

两款超好用的 Kubernetes 实时日志查看工具

点击上方图片,打开小程序,加入「玩转 Linux」圈子

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值