使用k3d启动k3s集群

完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernetes 来运行我们的应用,但是并不要求达到生产级别的集群,K3d 是一个允许我们在 Docker 容器内运行 k3s 的工具。

安装k3d

1
2
3
curl -Lo k3d http://rancher-mirror.cnrancher.com/k3d/v4.2.0/k3d-linux-amd64
chmod +x k3d
sudo mv k3d /usr/local/bin/

启动集群

使用k3d启动k3s集群

1
2
3
4
5
6
k3d cluster create mycluster \
--api-port 127.0.0.1:6443 \
-p 80:80@loadbalancer \
-p 443:443@loadbalancer \
-i rancher/k3s:v1.18.6-k3s1 \
--k3s-server-arg "--no-deploy=traefik"

image-20210215135153873

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

  • 使用指定版本镜像,因为默认安装最新版,使用起来可能有未知问题。

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

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

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

因为需要配置docker.io镜像加速

创建registries.yaml文件

1
2
3
4
5
6
mirrors:
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://docker.mirrors.ustc.edu.cn"
- "https://registry-1.docker.io"

启动k3s集群

1
2
3
4
5
6
7
k3d cluster create mycluster \
--api-port 127.0.0.1:6443 \
-p 80:80@loadbalancer \
-p 443:443@loadbalancer \
-i rancher/k3s:v1.18.6-k3s1 \
--volume "${HOME}/registries.yaml:/etc/rancher/k3s/registries.yaml" \
--k3s-server-arg "--no-deploy=traefik"

获取凭证

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

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

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

1
kubectl cluster-info

image-20210215135051936

安装Traefik2

我们可以直接使用 Helm 来快速安装 Traefik 2
helm安装本文不再赘述

1
2
3
4
# Add Traefik's chart repository to Helm
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik

安装到指定命名空间

1
2
3
4
# Install in a Dedicated Namespace
kubectl create ns traefik-v2
# Install in the namespace "traefik-v2"
helm install --namespace=traefik-v2 traefik traefik/traefik

image-20210215134943663

大概需要2-3分钟
出于安全考虑,默认情况下HelmChart不公开Traefik Dashboard。
等待traefik pod running后通过端口转发检查traefik是否正常工作。

image-20210215134851106

1
2
3
kubectl port-forward --address=0.0.0.0 $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000
# namespaces traefik-v2
kubectl port-forward --address=0.0.0.0 -n traefik-v2 $(kubectl get pods -n traefik-v2 --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000

通过master节点IP:9000/dashboard/访问traefik仪表盘

image-20210215134811253

部署应用

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

我将demo的yml文件放在github

在这个例子中,暴露了两个服务,每一个 URL 会被发送到对应服务上,我们可以在 Traefik Dashboard 上看到新的路由器。

image-20210215161431702

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

demo1

demo2