dongfg' blog

无数渺小的思考填满了人的一生

0%

K3s 部署 Knative

背景

个人使用的一些服务部署在阿里云函数计算上,详见阿里云函数计算使用经验分享,但函数计算服务从 2022 年底取消了免费额度,给了老用户1年的试用套餐。在使用了FissionKnative 这两个 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

安装 Cert Manager

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