找回密码
 立即注册
首页 业界区 安全 K3D|高效创建轻量级 k8s 集群 (run in dokcer) ...

K3D|高效创建轻量级 k8s 集群 (run in dokcer)

韶侪 2025-6-1 19:29:25
1.png

什么是 K3S

官网:https://k3s.io/
指南:https://rancher.com/docs/k3s/latest/en/
中文版指南:https://docs.rancher.cn/docs/k3s/_index/
K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化,易于安装,全部在不到 100MB 的二进制文件中;非常适合

  • Edge
  • IoT
  • CI
  • Development (用的就是这个)
  • ARM
  • Embedding K8s
  • Situations where a PhD in K8s clusterology is infeasible
可以理解为是 K8SLite 版,单词比 K8S 一半还少,所以叫 K3S
什么是 K3D

官网:https://k3d.io/v5.3.0/
指南:https://k3d.io/v5.3.0/usage/configfile/
k3d 是一个轻量级的包装器,用于在 docker 中运行 k3s(Rancher Lab 的最小 Kubernetes 发行版)。
k3d 使得在 docker 中创建单节点和多节点 k3s 集群变得非常容易,例如在 Kubernetes 上进行本地开发。
对于我们研发人员,我们不希望花太多精力和时间去搭建和维护 K8S,那么我们使用 K3D 就能通过类似 docker 的方式来快速的构建 K3S 集群,所以两者加起来就相当于一个 K8S 了
目标

学习使用 k3d 创建比本地集群,并部署一个可访问的服务 nodeport/ingress ,并理清楚访问链路
下载工具

brew install k3d
1. 创建集群

根据下载的版本,需要用到两个 ghcr 仓库的镜像,使用代理提前下载好
  1. docker pull ghcr.nju.edu.cn/k3d-io/k3d-tools:5.6.3
  2. docker tag ghcr.nju.edu.cn/k3d-io/k3d-tools:5.6.3 ghcr.io/k3d-io/k3d-tools:5.6.3
  3. docker pull ghcr.nju.edu.cn/k3d-io/k3d-proxy:5.6.3
  4. docker tag ghcr.nju.edu.cn/k3d-io/k3d-proxy:5.6.3 ghcr.io/k3d-io/k3d-proxy:5.6.3
复制代码
代码仓库:https://github.com/Panlq/xopensource/tree/main/k3d-demo
1. 使用 k3d 创建单节点集群架构

2.png

mirrors 配置详情>...
其他配置->非常详细的说明
  1. apiVersion: k3d.io/v1alpha5
  2. kind: Simple
  3. metadata:
  4.   name: dev-cluster
  5. servers: 1
  6. agents: 2
  7. kubeAPI:
  8.   hostPort: "6449"
  9. ports:
  10.   - port: 8085:80
  11.     nodeFilters:
  12.       - loadbalancer
  13.   - port: 8087:30080
  14.     nodeFilters:
  15.       - loadbalancer
  16.   - port: 8443:443
  17.     nodeFilters:
  18.       - loadbalancer
  19. registries:
  20.   config: |
  21.     mirrors:
  22.       docker.io:
  23.         endpoint:
  24.           - https://docker.m.daocloud.io
  25.       quay.io:
  26.         endpoint:
  27.           - https://quay.m.daocloud.io
  28.       gcr.io:
  29.         endpoint:
  30.           - https://gcr.m.daocloud.io
  31.       k8s.gcr.io:
  32.         endpoint:
  33.           - https://k8s-gcr.m.daocloud.io
  34.       ghcr.io:
  35.         endpoint:
  36.           - https://ghcr.m.daocloud.io
  37.       registry.k8s.io:
  38.         endpoint:
  39.           - https://k8s.m.daocloud.io
  40.     configs:
  41.       docker.nju.edu.cn:
  42.         auth:
复制代码
执行如下命令
k3d cluster create --config ./cluster-example.yaml
  1. k3d cluster list
  2. NAME               SERVERS   AGENTS   LOADBALANCER
  3. dev-cluster        1/1       2/2      true
复制代码
创建一个 server 节点,2 个 agents 节点 的集群,且集群的 30080 端口映射宿主机的 8087 端口,80 映射宿主机的 8085 (即 docker expose 的端口看 docker 容器可以看出来)
  1. k3d node list
  2. NAME                            ROLE           CLUSTER            STATUS
  3. k3d-dev-cluster-agent-0         agent          dev-cluster        running
  4. k3d-dev-cluster-agent-1         agent          dev-cluster        running
  5. k3d-dev-cluster-server-0        server         dev-cluster        running
  6. k3d-dev-cluster-serverlb        loadbalancer   dev-cluster        running
  7. k3d-dev-cluster-tools                          dev-cluster        running
复制代码
对应 docker 的 5 个容器
3.png

所以,宿主机,k3d, k3s ,docker 的关系如下
4.png

2. 创建可访问的服务

nodeport 服务

简单的 nginx 服务
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   labels:
  5.     app: web
  6.   name: web
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: web
  12.   strategy: {}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: web
  17.     spec:
  18.       containers:
  19.         - image: nginx
  20.           name: nginx
  21.           ports:
  22.             - containerPort: 80
  23.           resources:
  24.             limits:
  25.               cpu: 100m
  26.               memory: 256Mi
  27.             requests:
  28.               cpu: 80m
  29.               memory: 128Mi
复制代码
对应的 nodeport svc
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   labels:
  5.     app: web-service
  6.   name: app-service-nodeport
  7. spec:
  8.   ports:
  9.     - name:
  10.       nodePort: 30080
  11.       port: 80
  12.       protocol: TCP
  13.       targetPort: 80
  14.   selector:
  15.     app: web
  16.   type: NodePort
复制代码
kubectl apply -f deploy-nginx.yaml && kubectl apply -f nginx-svc-nodeport.yaml
  1. k get pods,svc              ⎈ k3d-dev-cluster
  2. NAME                         READY   STATUS    RESTARTS   AGE
  3. pod/web-574cd456fb-wbk5x     1/1     Running   0          74m
  4. NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
  5. service/app-service-a          ClusterIP   10.43.154.184   <none>        80/TCP         73m
复制代码
本地访问 localhost:8087
  1. curl localhost:8087
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome to nginx!</title>
  6. </head>
  7. <body>
  8. <h1>Welcome to nginx!</h1>
  9. <p>If you see this page, the nginx web server is successfully installed and
  10. working. Further configuration is required.</p>
  11. <p>For online documentation and support please refer to
  12. nginx.org.<br/>
  13. Commercial support is available at
  14. nginx.com.</p>
  15. <p><em>Thank you for using nginx.</em></p>
  16. </body>
  17. </html>
复制代码
5.png

ingress

6.png

使用当前目录下的文件的资源文件,创建工作负载
  1. ./ingress
  2. ├── cluster-example.yaml
  3. ├── deploy-a.yaml
  4. ├── deploy-b.yaml
  5. ├── nginx-ing-a.yaml
  6. ├── nginx-ing-b.yaml
  7. ├── nginx-svc-a.yaml
  8. └── nginx-svc-b.yaml
复制代码
  1. k get pods,svc,ing          ⎈ k3d-dev-cluster
  2. NAME                         READY   STATUS    RESTARTS   AGE
  3. pod/web-574cd456fb-wbk5x     1/1     Running   0          92m
  4. pod/web-a-6bbd7486b-rfsk5    1/1     Running   0          91m
  5. pod/web-b-544fc48b65-r4sgt   1/1     Running   0          91m
  6. NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
  7. service/kubernetes             ClusterIP   10.43.0.1       <none>        443/TCP        121m
  8. service/app-service-a          ClusterIP   10.43.154.184   <none>        80/TCP         91m
  9. service/app-service-b          ClusterIP   10.43.103.135   <none>        80/TCP         91m
  10. service/app-service-nodeport   NodePort    10.43.233.136   <none>        80:30080/TCP   58m
  11. NAME                                        CLASS     HOSTS                   ADDRESS                            PORTS   AGE
  12. ingress.networking.k8s.io/app-ingress-a     traefik   localhost               172.23.0.3,172.23.0.4,172.23.0.5   80      91m
  13. ingress.networking.k8s.io/nginx-ingress-b   traefik   localhost.k3d.ingress   172.23.0.3,172.23.0.4,172.23.0.5   80      91m
复制代码
因为用的是同一个镜像,我们需要进入 a 和 b 的 pod 中更改 nginx 默认的 html 内容来区分
  1. k exec -it -n default web-b-544fc48b65-r4sgt /bin/bash
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. root@web-b-544fc48b65-r4sgt:/# cd /usr/share/nginx/html/
  4. root@web-b-544fc48b65-r4sgt:/usr/share/nginx/html# ls
  5. 50x.html  index.html
  6. root@web-b-544fc48b65-r4sgt:/usr/share/nginx/html# echo 'hello from app b' >> index.html
复制代码
本地只配置 host, 访问服务
127.0.0.1 localhost
127.0.0.1 localhost.k3d.ingress
7.png

访问链路

sequenceDiagram    autonumber    participant User    participant Browser    participant K3DCluster    participant IngressController    participant BackendService    participant BackendPod    User->>Browser: 输入 localhost.k3d.ingress:9001    Browser->>Browser: 进行DNS解析    alt 本地hosts文件有配置        Browser->>Browser: 域名解析为127.0.0.1        Browser->>K3DCluster: 发送HTTP请求到127.0.0.1:9001        K3DCluster->>IngressController: 端口映射,请求到达        IngressController->>IngressController: 检查请求的Host头部和URL路径        alt 找到匹配的Ingress规则            IngressController->>BackendService: 确定对应的后端服务            BackendService->>BackendService: 通过服务发现找到后端Pod            BackendService->>BackendPod: 将请求转发到目标端口            BackendPod->>BackendPod: 处理请求并生成响应            BackendPod->>BackendService: 返回响应            BackendService->>IngressController: 返回响应            IngressController->>Browser: 返回响应            Browser->>Browser: 渲染并显示响应内容        else 未找到匹配的Ingress规则            IngressController->>Browser: 返回404等错误响应        end    else 本地hosts文件无配置        Browser->>Browser: DNS解析失败,请求终止    end参考


  • K3S + K3D = K8S a new perfect match for dev and test - Sokube
  • K3S+K3D=K8S 开发利器快速入门
  • K3D + Nginx Ingress 控制器 - Tech Learning
  • Kubernetes 学习(K3d)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册