背景
个人使用的一些服务部署在阿里云函数计算上,详见阿里云函数计算使用经验分享,但函数计算服务从 2022 年底取消了免费额度,给了老用户1年的试用套餐。在使用了Fission 跟 Knative 这两个 Serverless 平台一段时间后,准备迁移服务到 Knative。
环境准备
我使用的是一台 4C8G 的虚拟机,安装 K3s 之后安装 Knative。
安装的版本信息如下:
服务 |
版本 |
Debian |
12 bookworm |
K3s |
v1.27.7+k3s2 |
Knative |
v1.12 |
Cert Manager |
v1.13.2 |
使用的域名 example.com
,A 记录配置
1
| *.fn.example.com. 600 IN A x.x.x.x
|
安装 K3s - 使用 AutoK3s
AutoK3s 是简化 K3s 集群管理的轻量级工具
创建 K3s 集群示例
1
| autok3s create --provider native --name k3s-server --tls-sans 'k3s.example.com' --tls-sans 'x.x.x.x' --master-extra-args '--write-kubeconfig-mode=644 --disable=traefik' --k3s-version v1.27.2-k3s2 --k3s-channel stable --k3s-install-script https://rancher-mirror.rancher.cn/k3s/k3s-install.sh --k3s-install-mirror INSTALL_K3S_MIRROR=cn --docker-script https://get.docker.com --enable explorer --ssh-key-name dev_dongfg --master-ips x.x.x.x
|
K3s 的安装本文不做展开,只需要注意禁用 traefik
(--disable=traefik
),它会跟 Knative Kourier 冲突
安装 Knative
Installing Knative Serving using YAML files
Knative 的镜像放在 gcr.io
上,可能会有访问问题,可以使用 南大镜像服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| wget https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-crds.yaml wget https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-core.yaml wget https://github.com/knative/net-kourier/releases/download/knative-v1.12.1/kourier.yaml
# 使用镜像服务 sed -i '' "s/gcr.io/gcr.nju.edu.cn/g" serving-crds.yaml sed -i '' "s/gcr.io/gcr.nju.edu.cn/g" serving-core.yaml sed -i '' "s/gcr.io/gcr.nju.edu.cn/g" kourier.yaml
kubectl apply -f serving-crds.yaml kubectl apply -f serving-core.yaml kubectl apply -f kourier.yaml
kubectl patch configmap/config-network --namespace knative-serving --type merge --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}' # 更换为自己访问 knative 的域名 kubectl patch configmap/config-domain --namespace knative-serving --type merge --patch '{"data":{"example.com":""}}'
# 运行函数的 namespace kubectl create ns fn
|
此处的域名配置成 example.com,访问的服务域名就是 [svc].[namespace].[example.com],例如: hello.fn.example.com
验证安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| kubectl -n knative-serving get pods
# 创建测试服务 # 官方项目 https://github.com/knative-sample/helloworld-go # 非官方镜像 jimmysong/knative-samples-helloworld-go:latest
tee hello.yaml > /dev/null <<EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello spec: template: spec: containers: - image: jimmysong/knative-samples-helloworld-go:latest ports: - containerPort: 8080 env: - name: TARGET value: "World" EOF
kubectl -n fn apply -f hello.yaml
# 查看服务状态,等待状态 Ready kubectl -n fn get ksvc
# 访问测试服务 curl http://hello.fn.example.com
|
配置 TLS
Enabling automatic TLS certificate provisioning
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml
# 创建 ClusterIssuer # 因为 阿里云DNS 没有 cert-manger 的官方支持,只有第三方支持,这里使用 http01 验证 tee cluster-issuer.yaml > /dev/null <<EOF apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-http01 spec: acme: privateKeySecretRef: name: letsencrypt server: https://acme-v02.api.letsencrypt.org/directory solvers: - http01: ingress: class: istio EOF
|
配置 Knative 使用 Cert Manager
1 2 3 4 5 6 7 8
| wget https://github.com/knative/net-certmanager/releases/download/knative-v1.12.0/release.yaml -O net-certmanager.yaml # 使用镜像服务 sed -i '' "s/gcr.io/gcr.nju.edu.cn/g" net-certmanager.yaml kubectl apply -f net-certmanager.yaml # 指定 ClusterIssuer kubectl patch configmap/config-certmanager --namespace knative-serving --type merge --patch '{"data":{"issuerRef":"kind: ClusterIssuer\nname: letsencrypt-http01\n"}}' # 启用 tls kubectl patch configmap/config-network --namespace knative-serving --type merge --patch '{"data":{"external-domain-tls":"Enabled"}}'
|
安装验证
等待证书申请完成,如果遇到问题参考 Troubleshooting 排查
1 2 3 4 5
| # 查看服务状态 kubectl -n fn get ksvc
# 访问测试服务 curl https://hello.fn.example.com
|