feat(ingress): configure TLS with Let's Encrypt for production and staging environments
Deployment Config CI / Deployment Config (push) Successful in 19s
Deployment Config CI / Deployment Config (push) Successful in 19s
This commit is contained in:
+50
-10
@@ -5,7 +5,7 @@
|
|||||||
- infra: `postgres`, `monitoring-postgres`, `pgbouncer`, `monitoring-pgbouncer`, `rabbitmq`, `redis`, `qdrant`, `minio`
|
- infra: `postgres`, `monitoring-postgres`, `pgbouncer`, `monitoring-pgbouncer`, `rabbitmq`, `redis`, `qdrant`, `minio`
|
||||||
- jobs: `migrate`, `minio-init`
|
- jobs: `migrate`, `minio-init`
|
||||||
- apps: `tenant-api`, `browser-fetch`, `worker-generate`, `kol-assist-worker`, `scheduler`, `ops-api`, `frontend`, `ops-web`
|
- apps: `tenant-api`, `browser-fetch`, `worker-generate`, `kol-assist-worker`, `scheduler`, `ops-api`, `frontend`, `ops-web`
|
||||||
- ingress: `geo-rankly.local` -> `frontend`, `ops.geo-rankly.local` -> `ops-web`
|
- ingress: `saas.shengxintui.com` -> `frontend`, `ops.shengxintui.com` -> `ops-web`, `api.shengxintui.com` -> `tenant-api`
|
||||||
|
|
||||||
对象存储部署跟随 `deploy/config.yaml` / `deploy/config.yml` 里的 `object_storage.provider`,并允许 `deploy/config.local.yaml` / `deploy/config.local.yml` 覆盖:
|
对象存储部署跟随 `deploy/config.yaml` / `deploy/config.yml` 里的 `object_storage.provider`,并允许 `deploy/config.local.yaml` / `deploy/config.local.yml` 覆盖:
|
||||||
|
|
||||||
@@ -134,12 +134,13 @@ k3s 默认同时支持两种访问方式。
|
|||||||
|
|
||||||
### 4.1 直接用节点 IP + 端口
|
### 4.1 直接用节点 IP + 端口
|
||||||
|
|
||||||
`frontend` 和 `ops-web` 已固定为 NodePort:
|
`frontend`、`ops-web` 和 `tenant-api` 已固定为 NodePort:
|
||||||
|
|
||||||
- tenant admin: `http://<node-ip>:30080`
|
- tenant admin: `http://<node-ip>:30080`
|
||||||
- ops admin: `http://<node-ip>:30081`
|
- ops admin: `http://<node-ip>:30081`
|
||||||
|
- tenant api: `http://<node-ip>:30083`
|
||||||
|
|
||||||
这两个 NodePort Service 使用 `externalTrafficPolicy: Local`,用于保留客户端源 IP,后端日志和登录审计会读取规范化后的 `X-Forwarded-For` / `X-Real-IP`。
|
这些 NodePort Service 使用 `externalTrafficPolicy: Local`,用于保留客户端源 IP,后端日志和登录审计会读取规范化后的 `X-Forwarded-For` / `X-Real-IP`。
|
||||||
|
|
||||||
如果通过 k3s 内置 Traefik Ingress 对外提供服务,也需要把 Traefik Service 调整为保留源地址:
|
如果通过 k3s 内置 Traefik Ingress 对外提供服务,也需要把 Traefik Service 调整为保留源地址:
|
||||||
|
|
||||||
@@ -153,20 +154,59 @@ kubectl -n kube-system patch svc traefik -p '{"spec":{"externalTrafficPolicy":"L
|
|||||||
|
|
||||||
- tenant admin: `http://192.168.100.19:30080`
|
- tenant admin: `http://192.168.100.19:30080`
|
||||||
- ops admin: `http://192.168.100.19:30081`
|
- ops admin: `http://192.168.100.19:30081`
|
||||||
|
- tenant api: `http://192.168.100.19:30083`
|
||||||
|
|
||||||
### 4.2 用域名 Ingress
|
### 4.2 用域名 Ingress + HTTPS
|
||||||
|
|
||||||
k3s 默认 Traefik 会接管 Ingress。先把域名指到 k3s 节点 IP:
|
k3s 默认 Traefik 会接管 Ingress。先把域名指到 k3s 节点公网 IP。如果 `www.shengxintui.com` 已经解析到了这个节点,可以把 `saas`、`ops`、`api` 做 CNAME 指向 `www.shengxintui.com`:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
<node-ip> geo-rankly.local
|
saas.shengxintui.com CNAME www.shengxintui.com
|
||||||
<node-ip> ops.geo-rankly.local
|
ops.shengxintui.com CNAME www.shengxintui.com
|
||||||
|
api.shengxintui.com CNAME www.shengxintui.com
|
||||||
```
|
```
|
||||||
|
|
||||||
然后访问:
|
也可以直接添加 A 记录:
|
||||||
|
|
||||||
- tenant admin: `http://geo-rankly.local`
|
```text
|
||||||
- ops admin: `http://ops.geo-rankly.local`
|
saas.shengxintui.com A <node-ip>
|
||||||
|
ops.shengxintui.com A <node-ip>
|
||||||
|
api.shengxintui.com A <node-ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
HTTPS 使用 cert-manager + Let's Encrypt 自动签发和续期证书。签发前需要保证公网可以访问 k3s 节点的 80/443 端口;证书签发成功后,cert-manager 会在过期前自动续期。
|
||||||
|
|
||||||
|
先安装 cert-manager:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml
|
||||||
|
kubectl -n cert-manager get pods -w
|
||||||
|
```
|
||||||
|
|
||||||
|
确认 cert-manager Pod 正常后,安装 Let's Encrypt ClusterIssuer:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f deploy/k3s/addons/letsencrypt-clusterissuer.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
然后部署或更新业务清单:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -k deploy/k3s
|
||||||
|
```
|
||||||
|
|
||||||
|
访问:
|
||||||
|
|
||||||
|
- tenant admin: `https://saas.shengxintui.com`
|
||||||
|
- ops admin: `https://ops.shengxintui.com`
|
||||||
|
- tenant api: `https://api.shengxintui.com`
|
||||||
|
|
||||||
|
检查证书状态:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl -n geo-rankly get certificate,challenge,order
|
||||||
|
kubectl -n geo-rankly describe certificate shengxintui-com-tls
|
||||||
|
```
|
||||||
|
|
||||||
临时调试时也可用端口转发:
|
临时调试时也可用端口转发:
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Requires cert-manager to be installed before applying this file.
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: ClusterIssuer
|
||||||
|
metadata:
|
||||||
|
name: letsencrypt-staging
|
||||||
|
spec:
|
||||||
|
acme:
|
||||||
|
email: admin@shengxintui.com
|
||||||
|
server: https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
privateKeySecretRef:
|
||||||
|
name: letsencrypt-staging-account-key
|
||||||
|
solvers:
|
||||||
|
- http01:
|
||||||
|
ingress:
|
||||||
|
ingressClassName: traefik
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: ClusterIssuer
|
||||||
|
metadata:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
spec:
|
||||||
|
acme:
|
||||||
|
email: admin@shengxintui.com
|
||||||
|
server: https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
privateKeySecretRef:
|
||||||
|
name: letsencrypt-prod-account-key
|
||||||
|
solvers:
|
||||||
|
- http01:
|
||||||
|
ingress:
|
||||||
|
ingressClassName: traefik
|
||||||
@@ -3,7 +3,8 @@ kind: Ingress
|
|||||||
metadata:
|
metadata:
|
||||||
name: geo-rankly-web
|
name: geo-rankly-web
|
||||||
annotations:
|
annotations:
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||||
|
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||||
spec:
|
spec:
|
||||||
ingressClassName: traefik
|
ingressClassName: traefik
|
||||||
rules:
|
rules:
|
||||||
@@ -37,3 +38,9 @@ spec:
|
|||||||
name: tenant-api
|
name: tenant-api
|
||||||
port:
|
port:
|
||||||
number: 8080
|
number: 8080
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- saas.shengxintui.com
|
||||||
|
- ops.shengxintui.com
|
||||||
|
- api.shengxintui.com
|
||||||
|
secretName: shengxintui-com-tls
|
||||||
|
|||||||
Reference in New Issue
Block a user