基于k3s的服务部署环境

12 9.1~11.7 分钟 4112

介绍

在单机上使用k3s搭建一套高效的服务部署环境,可以显著提高服务的部署效率和管理便捷性。相比使用docker compose+nginx proxy manager方案,基于k3s的环境提供了更强大的集群管理和自动化能力。本文将详细介绍如何在单机上搭建k3s环境,并结合traefik和cert-manager来实现高效的服务部署。

背景

docker-compose + Nginx Proxy Manager

部署流程

  1. 编写docker-compose.yaml 定义服务容器配置,使用docker-compose命令部署服务容器

  2. 基于docker-compose 部署Nginx Proxy Manager

  3. 编写Nginx Proxy Manager配置,使其能够代理已部署的服务容器

优点

  • 依托于Nginx Proxy Manager,代理灵活,强大

缺点

  • 需要自行处理Nginx Proxy Manager的代理规则编写,需要对Nginx足够熟悉

  • 需要自行在Nginx Proxy Manager中配置证书管理

  • 需要注意配置多个docker容器的网络环境,配置模板可复用性不强

  • docker-compose与Nginx Proxy Manager的配置属于两套体系,配置体验不连贯

k3s/k8s + Traefik

部署流程

  1. 编写服务pod与其对应的svc yaml,使用kubectl apply -f 部署服务pod及其svc

  2. 编写ingress配置yaml,并apply生效

优点

  • 快速高效,网络管理扁平化

  • 配置文件编写简单,模板可复用性强

缺点

  • 如果想实现复杂的代理配置,依旧有较高的成本,教程相对Nginx少

准备工作

系统要求

  • 操作系统:本文使用Debian 12演示

  • 内存:至少2GB

  • CPU:至少1核

安装工具

  • curlwget

  • sudo 权限

安装K3s

下载并安装K3s

curl -sfL https://get.k3s.io | sh -

验证安装

sudo kubectl get nodes

安装Traefik

k3s环境配置好后,环境中已经包含Traefik

安装Cert-Manager

kubectl apply安装

sudo kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.1/cert-manager.yaml

验证安装

sudo kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS       AGE
cert-manager-69f748766f-rmfd5              1/1     Running   3 (4d4h ago)   18d
cert-manager-cainjector-7cf6557c49-266d2   1/1     Running   3 (4d4h ago)   18d
cert-manager-webhook-58f4cff74d-68wrf      1/1     Running   2 (4d4h ago)   18d

配置域名和证书

创建ClusterIssuer

创建一个名为cluster-issuer.yaml的文件,内容如下:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: your-example@mail.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource that will be used to store the account's private key.
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: traefik

应用ClusterIssuer配置

sudo kubectl apply -f cluster-issuer.yaml

部署示例服务

创建示例服务

创建一个名为example-service.yaml的文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example
        image: nginx:latest
        ports:
        - containerPort: 80

应用示例服务

sudo kubectl apply -f example-service.yaml

创建Ingress

创建一个名为example-ingress.yaml的文件,内容如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # add an annotation indicating the issuer to use.
    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
    cert-manager.io/cluster-issuer: letsencrypt-prod
    spec.ingressClassName: traefik
  name: example-ingress
spec:
  rules:
  - host: example.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  tls:
  - hosts:
    - example.yourdomain.com
    secretName: example-tls

应用Ingress

sudo kubectl apply -f example-ingress.yaml

访问https://example.yourdomain.com 即可看到Nginx的默认页面

部署服务前,需要先将将要使用的域名解析到对应的服务器

总结

通过以上步骤,我们成功地在单机上搭建了一套基于k3s、Traefik和Cert-Manager的服务部署环境。这套环境简化了证书管理和路由配置,使得我们可以更专注于应用的配置与部署。

参考