基于k3s的服务部署环境
介绍
在单机上使用k3s搭建一套高效的服务部署环境,可以显著提高服务的部署效率和管理便捷性。相比使用docker compose+nginx proxy manager方案,基于k3s的环境提供了更强大的集群管理和自动化能力。本文将详细介绍如何在单机上搭建k3s环境,并结合traefik和cert-manager来实现高效的服务部署。
背景
docker-compose + Nginx Proxy Manager
部署流程
编写
docker-compose.yaml定义服务容器配置,使用docker-compose命令部署服务容器基于
docker-compose部署Nginx Proxy Manager编写Nginx Proxy Manager配置,使其能够代理已部署的服务容器
优点
依托于Nginx Proxy Manager,代理灵活,强大
缺点
需要自行处理Nginx Proxy Manager的代理规则编写,需要对Nginx足够熟悉
需要自行在Nginx Proxy Manager中配置证书管理
需要注意配置多个docker容器的网络环境,配置模板可复用性不强
docker-compose与Nginx Proxy Manager的配置属于两套体系,配置体验不连贯
k3s/k8s + Traefik
部署流程
编写服务pod与其对应的svc yaml,使用
kubectl apply -f部署服务pod及其svc编写ingress配置yaml,并apply生效
优点
快速高效,网络管理扁平化
配置文件编写简单,模板可复用性强
缺点
如果想实现复杂的代理配置,依旧有较高的成本,教程相对Nginx少
准备工作
系统要求
操作系统:本文使用Debian 12演示
内存:至少2GB
CPU:至少1核
安装工具
curl或wgetsudo权限
安装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的服务部署环境。这套环境简化了证书管理和路由配置,使得我们可以更专注于应用的配置与部署。