IT Tools 是一个开源的工具集,包含了非常多好用的工具,Token 生成,Hash 生成,UUID 生成,加密解密,BIP39 passphrase 生成,Hmac 生成,RSA 密钥生成,Password 生成,PDF 签名检查,日期转换,Base64 转换,Unicode,ASCII,YAML,JSON 等等非常多有用的工具。

今天这篇文章就以 IT Tools 为例来介绍一下在 K3s 上部署这样一个无状态的服务,并且通过 Traefik 配置域名访问 K3s 内部服务。

前提条件

在安装之前,需要确保

  • 一个运行正常的 K3s
  • Helm 工具
  • 一个可以配置 DNS A 记录的域名

获取 Chart

获取第三方的 Chart

helm repo add jeffresc https://charts.jeffresc.dev
helm repo update
helm install it-tools jeffresc/it-tools

直接安装

helm install it-tools jeffresc/it-tools

卸载命令

helm uninstall it-tools

如果为了测试,可以直接执行下面的命令,通过临时端口转发来测试服务是否正常。

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=it-tools,app.kubernetes.io/instance=it-tools" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

如果您只是临时需要从其他集群外部访问,可以在port-forward命令中添加--address参数:

kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT --address 0.0.0.0

这样可以让 port-forward 监听所有网络接口,而不仅仅是 localhost。但请注意,这种方法不是生产环境的推荐做法,因为它依赖于保持 kubectl 命令运行。

为了让服务可以向集群外部提供,这里有几个方法

  • 通过 NodePort Service,接集群内部的端口映射到集群外部
  • 通过 Ingress ,管理从集群外部到内部的服务 HTTP 和 HTTPS 访问,集群的流量入口

NodePort 类型的 Service

[[Kubernetes NodePort]] 可以创建 NodePort 类型的 Service

❯ cat it-tools-service.yml
apiVersion: v1
kind: Service
metadata:
  name: it-tools-nodeport
  namespace: default
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: it-tools
    app.kubernetes.io/instance: it-tools
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080  # 可选,不指定会随机分配30000-32767之间的端口

应用此配置之后,可以通过 http://节点:30080 来访问应用。K3s 会在每个节点上开放 30080 端口,访问任一一个节点的 IP 加上端口都可以正常访问该服务。

使用 Ingress

[[Kubernetes Ingress]]

如果想通过域名来访问应用,可以配置 Ingress,K3s 默认安装了 Traefik 作为 Ingress 控制器。

❯ cat it-tools-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: it-tools-ingress
  namespace: default
  annotations:
    # 可选:添加Traefik特定的注解
    traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
  - host: tools.einverne.info
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: it-tools
            port:
              number: 8080
  tls:
  - hosts:
    - it-tools.einverne.info
    secretName: it-tools-tls-secret

这样,当配置了 DNS A 记录指向 K3s 节点的 IP 地址,就可以通过 http://tools.einverne.info 来访问应用。Traefik 会自动申请证书,配置证书。

对于生产环境,建议使用 LoadBalancer 或 Ingress 方式,这样可以确保服务的稳定性和可扩展性。如果您的应用需要特定的 TCP/UDP 端口(不仅仅是 HTTP/HTTPS),LoadBalancer 是更好的选择。

检查证书是否成功颁发

kubectl get certificates -n default

当证书状态显示为Ready: True时,表示证书已成功颁发并可以使用。

reference