ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

k0s 部署 Traefik Ingress Controller 与 MetalLB 完整实战指南

k0s 部署 Traefik Ingress Controller 与 MetalLB 完整实战指南 云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载本文是一份基于 k0s 的端到端实战指南通过 k0s 配置文件的extensions.helm扩展机制在集群引导阶段自动安装 Traefik Ingress Controller 与 MetalLB 负载均衡器随后配置 TraefikHTTP→HTTPS 自动跳转、自定义 entrypoint、为 MetalLB 划定 L2 IP 地址池、验证 LoadBalancer 分配的外部 IP并最终部署 Traefik Dashboard 与 whoami 示例应用完成 Ingress 路由验证。读完本文你将掌握如何在 k0s 上以零摩擦方式搭建一套可对外提供服务的入口层并理解其背后的 Helm 扩展实现原理。架构总览为什么用 Traefik MetalLBk0s 本身不内置 Ingress Controller也不内置 LoadBalancer 实现。要对外暴露集群内服务通常需要补齐两层能力Ingress ControllerTraefik负责根据 Ingress / IngressRoute 规则将 HTTP(S) 流量路由到集群内的各个 ServiceLoadBalancerMetalLB为Service类型为LoadBalancer的资源分配一个可从局域网访问的外部 IPEXTERNAL-IP。Traefik 以LoadBalancer类型的 Service 形态对外提供服务而该 Service 的外部 IP 正是由 MetalLB 从配置的 IP 池中分配的。两者协同后你就可以通过一个固定 IP 访问集群内所有经 Ingress 暴露的应用例如curl http://192.168.0.5/whoami。k0s 项目也提供了 NGINX Ingress Controller 的等价教程 作为替代方案参考。k0s 提供的 Helm Charts 扩展能力 是整个方案的关键k0s 内置 Helm 扩展管理器允许在集群引导bootstrap阶段通过k0s.yaml中的spec.extensions.helm小节声明 Helm 仓库与 Chartk0s 会自动完成 Chart 的安装与持续协调。这正是本文部署 Traefik 与 MetalLB 所采用的方式。在 k0s.yaml 中声明 Traefik 与 MetalLB 扩展完整配置示例编辑 k0s 集群配置文件k0s.yaml在spec.extensions.helm下添加两个 Helm 仓库traefik、metallb和两个 ChartapiVersion: k0s.k0sproject.io/v1beta1 kind: ClusterConfig metadata: name: k0s spec: extensions: helm: repositories: - name: traefik url: https://traefik.github.io/charts - name: metallb url: https://metallb.github.io/metallb charts: - name: traefik chartname: traefik/traefik version: 39.0.1 namespace: traefik-system - name: metallb chart: metallb/metallb version: 0.15.3 namespace: metallb-system保存后重启 k0s 控制器controller使配置生效k0s 会按声明自动部署这两个 Chart。关键配置字段说明下表整理了extensions.helm下各字段的含义与默认值依据仓库 extensions.go 中的类型定义整理位置字段默认值说明extensions.helmconcurrencyLevel5Chart 并发处理级别见DefaultExtensions()实现extensions.helm.repositories[]name必填仓库名称Chart 中chartname的仓库前缀需与之对应extensions.helm.repositories[]url必填仓库 URL仅支持提供有效index.yaml的经典 Helm 仓库extensions.helm.repositories[]insecuretrue是否跳过对仓库的 TLS 证书校验extensions.helm.repositories[]caFile/certFile/keyfile-HTTPS 校验与 mTLS 客户端认证所需证书文件extensions.helm.repositories[]username/password-仓库 Basic HTTP 认证凭据extensions.helm.charts[]name必填Release 名称1-53 个字符须符合 DNS 命名规范extensions.helm.charts[]chartname必填形如仓库名/chart名或指向本地.tgz文件路径extensions.helm.charts[]version-要安装的 Chart 版本extensions.helm.charts[]namespace必填Chart 安装的目标命名空间TargetNSextensions.helm.charts[]values-以 YAML 字符串形式提供的自定义 Chart valuesextensions.helm.charts[]timeout10m等待安装完成的超时时间如20m、300msextensions.helm.charts[]forceUpgradetrue设为false时升级禁用--forceextensions.helm.charts[]order0应用清单的排序值相同则按字母序几点需要注意版本字符串必须加引号Chartversion建议写成39.0.1这样的字符串形式避免 YAML 解析歧义仓库命名与 Chart 前缀对应chartname: traefik/traefik中的仓库前缀traefik必须能在repositories中找到同名仓库。从实现看k0s 通过 extractRepositoryIdentifier 从chartname中提取仓库标识传统仓库取第一个/前的名称OCI 仓库取主机名再从仓库缓存中查找对应配置配置变更需要重启控制器extensions.helm属于集群级配置修改k0s.yaml后需重启 k0s 控制器才会生效。如需免重启的声明式方案可改用 Chart 自定义资源helm.k0sproject.io/v1beta1的ChartCRD需创建在kube-system命名空间。底层原理k0s 如何把扩展声明变成 Helm Release从源码结构看k0s 的扩展管理由 extensions_controller.go 中的ExtensionsController组件承担Reconcile()从ClusterConfig.Spec.Extensions.Helm读取 Helm 配置并保存为最新值reconcileConfig()在持有领导权leader election时对 Helm stack 进行协调首次失败会按抖动重试约 7 秒起步之后 1 分钟量级reconcileStack()将每个 Chart 渲染成Chart自定义资源清单并通过applier.ApplyStack应用到集群。渲染模板见该文件中的chartCrdTemplate它会为每个 Chart 生成名为k0s-addon-chart-name的Chart资源并附带helm.k0sproject.io/uninstall-helm-releasefinalizer控制器运行时controller-runtime中的ChartReconciler监听这些Chart资源调用 pkg/helm/helm.go 中的InstallChart/UpgradeChart完成实际安装与升级。Helm 安装行为与文档描述一致InstallChart设置了CreateNamespacetrue、WaitForJobstrue、WaitStrategyStatusWatcherStrategy升级时设置RollbackOnFailuretrue与ForceReplace受forceUpgrade控制。Chart资源的 spec 定义在 chart_types.go其YamlValues()方法会把values字符串解析为 map 后交给 Helm。网络规划建议MetalLB 需要一个专属的 IP 地址池。最佳实践是选用一段在你的局域网内可路由、且不在 DHCP 分配池范围内的小段地址任何合法 IP 段在单机环境通常也能工作。这样分配出的 LoadBalancer / Ingress 外部 IP 才能从局域网内任意位置访问。IP 池不能复用 Kubernetes 节点 IP 或其他服务已控制的 IP。通过 values 定制 TraefikTraefik Chart 的定制通过extensions.helm.charts条目下的values字段完成YAML 字符串。下面给出两个高频场景。场景一自动 HTTP → HTTPS 跳转spec: extensions: helm: repositories: ... charts: - name: traefik chartname: traefik/traefik version: 39.0.1 namespace: traefik-system values: | ports: web: http: redirections: entryPoint: to: websecure scheme: https permanent: true - name: metallb ...上述配置让 Traefik 在web80入口点收到请求时将其永久重定向到websecure443入口点并使用https协议。场景二新增自定义 entrypointTraefik 的 entrypoint 是流量进入的端口入口可服务于 HTTP(S) 的IngressRoute或 TCP/UDP 的IngressRouteTCP/IngressRouteUDP。下面为 SSH 流量新增一个 TCP entrypointspec: extensions: helm: repositories: ... charts: - name: traefik chartname: traefik/traefik version: 39.0.1 namespace: traefik-system values: | ports: ssh: # entrypoint 名称 port: 2222 # 容器内端口 expose: default: true exposedPort: 22 # LoadBalancer 对外暴露的端口 protocol: TCP # 协议 - name: metallb ...字段含义ssh是 entrypoint 名称port是容器内监听端口exposedPort是负载均衡器对外暴露、供外部访问的端口此处为 22protocol指定 TCP 或 UDP。创建后即可在IngressRouteTCP/IngressRouteUDPCRD 中通过该 entrypoint 路由流量。更详尽的 entrypoint 参数可查阅 Traefik 官方文档在 k0s 侧values会被原样传给 Helm因此 Chart 支持的所有 values 均可在此声明。为 MetalLB 创建 IP 地址池ConfigMap / CRMetalLB 需要知道可分配的 IP 范围。创建包含 IP 段的 YAML 文件并应用--- apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - ip-address-range-start-ip-address-range-stop - ip-address/cidr # example for a range - 192.168.0.1-192.168.0.5 # example for a single address with cidr - 192.168.0.5/32 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-systemkubectl apply -f metallb-l2-pool.yamlIPAddressPool声明可用地址段L2Advertisement声明以 L2二层 ARP模式对外宣告这些地址。IP 池必须完全专用于 MetalLB不能与节点 IP 或其他服务控制的 IP 重叠。关于 MetalLB 安装与配置的更多细节可参考仓库中的 MetalLB 负载均衡器教程其中还涉及 kube-proxy 使用 IPVS 模式时需开启strictARP: true等前置条件以及节点间需放行 7946 端口TCP/UDP等要求。验证 LoadBalancer 与外部 IP启动集群后运行kubectl get all查看 Traefik 与 MetalLB 的部署情况确认存在带EXTERNAL-IP的 LoadBalancer Servicekubectl get all预期输出示例NAME READY STATUS RESTARTS AGE pod/metallb-1607085578-controller-864c9757f6-bpx6r 1/1 Running 0 81s pod/metallb-1607085578-speaker-245c2 1/1 Running 0 60s pod/traefik-1607085579-77bbc57699-b2f2t 1/1 Running 0 81s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 none 443/TCP 96s service/traefik-1607085579 LoadBalancer 10.105.119.102 192.168.0.5 80:32153/TCP,443:30791/TCP 84s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/metallb-1607085578-speaker 1 1 1 1 1 kubernetes.io/oslinux 87s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/metallb-1607085578-controller 1/1 1 1 87s deployment.apps/traefik-1607085579 1/1 1 1 84s NAME DESIRED CURRENT READY AGE replicaset.apps/metallb-1607085578-controller-864c9757f6 1 1 1 81s replicaset.apps/traefik-1607085579-77bbc57699 1 1 1 81s记下service/traefik-xxx的EXTERNAL-IP本例为192.168.0.5它就是后续访问 Ingress 代理的统一入口NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/traefik-1607085579 LoadBalancer 10.105.119.102 192.168.0.5 80:32153/TCP,443:30791/TCP 84s此时直接访问该 IP 返回 404 属正常现象因为还没有配置任何 Ingress 资源curl http://192.168.0.5404 page not found部署并访问 Traefik Dashboard有了可用且可路由的 LoadBalancer IP就可以在局域网内任意位置访问 Traefik Dashboard。1. 创建 IngressRouteapiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard namespace: traefik-system spec: entryPoints: - web - websecure routes: - match: PathPrefix(/dashboard) || PathPrefix(/api) kind: Rule services: - name: apiinternal kind: TraefikServiceapiinternal是 Traefik 内置的 API 服务配合/dashboard与/api路径前缀即可暴露 Dashboard 界面与后端 API。2. 应用并访问kubectl apply -f traefik-dashboard.yaml预期输出ingressroute.traefik.io/v1alpha1/traefik-dashboard created此时在浏览器访问http://192.168.0.5/dashboard/将 IP 替换为你记录的EXTERNAL-IP即可看到 Dashboard。部署 whoami 示例并验证 Ingress 路由3. 创建 Deployment、Service 与 IngressapiVersion: apps/v1 kind: Deployment metadata: name: whoami-deployment spec: replicas: 1 selector: matchLabels: app: whoami template: metadata: labels: app: whoami spec: containers: - name: whoami-container image: containous/whoami --- apiVersion: v1 kind: Service metadata: name: whoami-service spec: ports: - name: http targetPort: 80 port: 80 selector: app: whoami --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: whoami-ingress spec: rules: - http: paths: - path: /whoami pathType: Exact backend: service: name: whoami-service port: number: 804. 应用清单kubectl apply -f whoami.yaml预期输出deployment.apps/whoami-deployment created service/whoami-service created ingress.networking.k8s.io/whoami-ingress created5. 通过 Ingress 访问服务curl http://192.168.0.5/whoami预期输出实际 Pod 名与 IP 会不同Hostname: whoami-deployment-85bfbd48f-7l77c IP: 127.0.0.1 IP: ::1 IP: 10.244.214.198 IP: fe80::b049:f8ff:fe77:3e64 RemoteAddr: 10.244.214.196:34858 GET /whoami HTTP/1.1 Host: 192.168.0.5 User-Agent: curl/7.68.0 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 192.168.0.82 X-Forwarded-Host: 192.168.0.5 X-Forwarded-Port: 80 X-Forwarded-Proto: http X-Forwarded-Server: traefik-1607085579-77bbc57699-b2f2t X-Real-Ip: 192.168.0.82输出中的X-Forwarded-*与X-Real-Ip请求头由 Traefik 在转发时注入表明流量确实经过了 Ingress 代理。至此从curl http://192.168.0.5/whoami到后端 Pod 的完整链路已经打通。更进一步向公网暴露与证书自动化借助 Traefik Ingress Controller还可以引入第三方工具如 ngrok将 LoadBalancer 反向暴露到公网进而利用 Lets Encrypt 实现动态证书签发方式有两种cert-manager以 CRD 方式统一管理集群内的 TLS 证书Traefik 内置 ACME Provider由 Traefik 直接与 Lets Encrypt 交互完成证书签发与续期。两者都可以与本文的 k0s Traefik 方案无缝衔接作为生产环境 HTTPS 落地的下一步。故障排查与延伸阅读EXTERNAL-IP一直为pending说明 MetalLB 未就绪或 IP 池配置不当。请确认IPAddressPool/L2Advertisement已正确应用、IP 段未被占用并检查 MetalLB 官方前置条件如 7946 端口、strictARP。Chart 未按预期安装检查kubectl get charts -n kube-system与kubectl describe chart ...查看协调状态k0s 控制器以--debugtrue运行时会输出 Helm 调试日志见 helm-charts.md。想免重启热更新扩展将extensions.helm中的声明迁移为Chart自定义资源创建于kube-system命名空间实现kubectl apply即生效迁移步骤见 Helm Charts 文档。其他负载均衡方案如使用云厂商 LoadBalancer可参考 cloud-providers.mdIngress 替代方案参见 NGINX Ingress 教程。High Availability 场景k0s 的 高可用部署文档 可帮助你规划多控制器集群下的入口层拓扑。赞分享云原生容器编排边缘计算【免费下载链接】k0sk0s - The Zero Friction Kubernetes项目地址https://gitcode.com/gh_mirrors/k0/k0s点击查看免费下载相关推荐minikube Traefik Ingress Controller Addon 完整实战指南启用、Ingress 路由、TLS 证书与 Nginx 迁移minikube Traefik Ingress Controller Addon 完整实战指南启用、Ingress 路由、TLS 证书与 Nginx 迁移云原生容器编排CLI开发工具使用 Meshery Design 将 Traefik 部署为 Kubernetes Ingress Controller使用 Meshery Design 将 Traefik 部署为 Kubernetes Ingress Controller 在 Kubernetes 集群中引入云原生微服务运维DevOps从 Ingress NGINX Controller 迁移到 Traefik零停机迁移完整实战指南从 Ingress NGINX Controller 迁移到 Traefik零停机迁移完整实战指南 本文基于 Traefik 官方迁移文档《Migrate f后端API网关负载均衡微服务网络云原生上一篇MoveCertificate 使用指南Android 7-16 用户证书迁移系统证书的 Magisk/KernelSU/APatch 模块实战下一篇Legendary终极指南跨平台Epic游戏管理完全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表