Kubernetes教程FG076-Kubernetes无服务器计算(Knative)实战
内容简介
本篇文章主要介绍Kubernetes中无服务器计算(Knative)的配置与使用方法。风哥教程参考Kubernetes官方文档无服务器相关内容,结合生产环境实际操作场景,详细讲解Knative的安装、配置和最佳实践。
目录大纲
Part01-基础概念与理论知识
1.1 无服务器计算概述
无服务器计算是一种云计算模型,它允许开发者专注于代码开发,而无需管理服务器基础设施。无服务器计算的特点包括:
- 按需付费:只支付实际使用的资源
- 自动扩缩容:根据负载自动调整资源
- 无服务器管理:无需管理服务器基础设施
- 事件驱动:基于事件触发执行
- 短暂性:函数执行完成后资源被释放
1.2 Knative架构
Knative是一个基于Kubernetes的无服务器平台,它提供了以下组件:
- Knative Serving:
- 自动扩缩容:包括缩容到零
- 流量管理:支持蓝绿部署、金丝雀发布
- 自动TLS证书管理
- 服务版本管理
- Knative Eventing:
- 事件源管理:支持多种事件源
- 事件通道:可靠的事件传递
- 事件接收器:处理事件的服务
- 事件代理:路由事件到接收器
- Knative Functions:
- 函数框架:简化函数开发
- 函数模板:提供常见语言的模板
- 函数部署:一键部署函数
Part02-生产环境规划与建议
2.1 无服务器部署策略
- 应用类型:
- API服务:处理HTTP请求的服务
- 事件处理:处理事件的函数
- 数据处理:处理数据的任务
- 资源配置:
- CPU和内存请求:根据应用需求设置
- 并发限制:控制同时处理的请求数
- 超时设置:设置函数执行超时时间
- 扩缩容策略:
- 最小实例数:设置最小运行实例数
- 最大实例数:设置最大运行实例数
- 扩缩容指标:基于CPU、内存或并发请求
2.2 Knative配置建议
- 网络配置:
- 使用Istio作为网络层
- 配置适当的Ingress
- 设置TLS证书
- 存储配置:
- 使用临时存储:适合无状态应用
- 使用持久存储:适合需要持久化数据的应用
,风哥提示:。
- 监控与日志:
- 集成Prometheus监控
- 集成ELK或EFK日志系统
- 设置告警规则
Part03-生产环境项目实施方案
3.1 Knative安装
安装Knative,风哥提示:。
安装Istio
[root@fgedu-master ~]# curl -L https://istio.io/downloadIstio | sh –
# 进入Istio目录
[root@fgedu-master ~]# cd istio-1.16.0
# 添加istioctl到PATH
[root@fgedu-master istio-1.16.0]# export PATH=$PATH:$(pwd)/bin
# 安装Istio
[root@fgedu-master istio-1.16.0]# istioctl install –set profile=default -y
安装Knative Serving
[root@fgedu-master ~]# kubectl apply -f https://github.com/knative/serving/releases/download/v1.8.0/serving-crds.yaml
# 安装Knative Serving核心组件
[root@fgedu-master ~]# kubectl apply -f https://github.com/knative/serving/releases/download/v1.8.0/serving-core.yaml
安装Knative Eventing
[root@fgedu-master ~]# kubectl apply -f https://github.com/knative/eventing/releases/download/v1.8.0/eventing-crds.yaml
# 安装Knative Eventing核心组件
[root@fgedu-master ~]# kubectl apply -f https://github.com/knative/eventing/releases/download/v1.8.0/eventing-core.yaml
验证安装
[root@fgedu-master ~]# kubectl get pods -n knative-serving
[root@fgedu-master ~]# kubectl get pods -n knative-eventing
NAME READY STATUS RESTARTS AGE
activator-6f8598c89b-2k8x9 1/1 Running 0 5m
autoscaler-78d6878595-5k9x8 1/1 Running 0 5m
controller-7f9f85b84d-9k8x9 1/1 Running 0 5m
webhook-6b8b945955-2k8x9 1/1 Running 0 5m
# knative-eventing命名空间
NAME READY STATUS RESTARTS AGE
eventing-controller-558b8b4b76-2k8x9 1/1 Running 0 5m
eventing-webhook-7c5c9f596c-9k8x9 1/1 Running 0 5m
imc-controller-668bc79964-5k9x8 1/1 Running 0 5m
imc-dispatcher-558b8b4b76-5k9x8 1/1 Running 0 5m
mt-broker-controller-7c5c9f596c-2k8x9 1/1 Running 0 5m
mt-broker-filter-6b8b945955-5k9x8 1/1 Running 0 5m
mt-broker-ingress-78d6878595-2k8x9 1/1 Running 0 5m
3.2 无服务器应用部署
部署无服务器应用。
创建服务
[root@fgedu-master ~]# cat > service.yaml << EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello-world namespace: default,学习交流加群风哥微信: itpux-com。 spec: template: spec: containers: - image: gcr.io/knative-samples/helloworld-goenv: - name: TARGET value: "fgedu" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi EOF
[root@fgedu-master ~]# kubectl apply -f service.yaml
查看服务
[root@fgedu-master ~]# kubectl get ksvc
hello-world http://hello-world.default.fgedu.net.cn hello-world-00001 hello-world-00001 True
测试服务
[root@fgedu-master ~]# curl http://hello-world.default.fgedu.net.cn
3.3 事件驱动架构
配置事件驱动架构:
创建Broker
[root@fgedu-master ~]# kubectl create namespace fgedu-eventing
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: eventing.knative.dev/v1 kind: Broker metadata: name: default namespace: fgedu-eventing EOF
创建Trigger
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: hello-trigger namespace: fgedu-eventing spec: broker: default filter: attributes: type: dev.knative.samples.helloworld subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: hello-world namespace: default EOF
发送事件
[root@fgedu-master ~]# curl -X POST “http://broker-ingress.knative-eventing.svc.cluster.local/fgedu-eventing/default” \
-H “Ce-Id: 123456789” \,学习交流加群风哥QQ113257174。
-H “Ce-Source: curl-source” \
-H “Ce-Type: dev.knative.samples.helloworld” \
-H “Ce-Specversion: 1.0” \
-H “Content-Type: application/json” \
-d ‘{“message”: “Hello Knative!”}’
Part04-生产案例与实战讲解
4.1 企业级无服务器应用部署
某企业需要部署无服务器应用,用于处理API请求和事件处理。
案例背景
- 应用类型:API服务和事件处理函数
- 技术栈:Go、Python
- 业务需求:
- 自动扩缩容:根据负载自动调整资源
- 流量管理:支持蓝绿部署和金丝雀发布
- 事件驱动:处理来自多种源的事件
- 监控与日志:实时监控应用状态和日志
部署方案
# 安装Istio
curl -L https://istio.io/downloadIstio | sh –
cd istio-1.16.0
export PATH=$PATH:$(pwd)/bin
istioctl install –set profile=default -y
# 安装Knative Serving
kubectl apply -f https://github.com/knative/serving/releases/download/v1.8.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v1.8.0/serving-core.yaml
# 安装Knative Eventing
kubectl apply -f https://github.com/knative/eventing/releases/download/v1.8.0/eventing-crds.yaml
kubectl apply -f https://github.com/knative/eventing/releases/download/v1.8.0/eventing-core.yaml
# 2. 部署API服务
cat > api-service.yaml << EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: user-api namespace: fgedu-production spec: template: spec: containers: - image: fgedu/user-api:v1.0 env: - name: DB_HOST value: "mysql" - name: DB_PORT value: "3306" - name: DB_NAME value: "fgedudb" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi traffic: - revisionName: user-api-00001 percent: 100 EOF kubectl apply -f api-service.yaml # 3. 部署事件处理函数 cat > event-handler.yaml << EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: order-handler namespace: fgedu-production spec: template: spec: containers: - image: fgedu/order-handler:v1.0 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m,更多视频教程www.fgedu.net.cn。 memory: 256Mi EOF kubectl apply -f event-handler.yaml # 4. 配置事件驱动 # 创建Broker kubectl create namespace fgedu-eventing kubectl apply -f - << EOF apiVersion: eventing.knative.dev/v1 kind: Broker metadata: name: default namespace: fgedu-eventing EOF # 创建Trigger kubectl apply -f - << EOF apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: order-trigger namespace: fgedu-eventing spec: broker: default filter: attributes: type: com.fgedu.order.created subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: order-handler namespace: fgedu-production EOF # 5. 配置流量管理 # 蓝绿部署 cat > blue-green.yaml << EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: user-api namespace: fgedu-production spec: template: metadata: name: user-api-v2 spec: containers: - image: fgedu/user-api:v2.0 env: - name: DB_HOST value: "mysql" - name: DB_PORT value: "3306" - name: DB_NAME value: "fgedudb" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi traffic: - revisionName: user-api-00001 percent: 50 - revisionName: user-api-v2 percent: 50 EOF kubectl apply -f blue-green.yaml # 6. 验证部署 kubectl get ksvc -n fgedu-production kubectl get broker -n fgedu-eventing kubectl get trigger -n fgedu-eventing
4.2 事件驱动架构实战
某企业需要构建事件驱动架构,用于处理来自多种源的事件。。。
案例背景
- 事件源:Kafka、GitHub、CloudEvents
- 事件处理:函数和服务
- 业务需求:
- 可靠的事件传递
- 事件过滤和路由
- 事件处理的可扩展性
部署方案
,更多学习教程公众号风哥教程itpux_com。
[root@fgedu-master ~]# kubectl apply -f https://github.com/knative-sandbox/eventing-kafka-broker/releases/download/v1.8.0/kafka-broker.yaml
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: eventing.knative.dev/v1alpha1 kind: KafkaBroker metadata: name: kafka-broker namespace: fgedu-eventing spec: config: bootstrap.servers: kafka:9092 EOF
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: sources.knative.dev/v1 kind: KafkaSource metadata: name: kafka-source namespace: fgedu-eventing spec: bootstrapServers: - kafka:9092 topics: - orders consumerGroup: knative-group sink: ref: apiVersion: eventing.knative.dev/v1 kind: Broker name: kafka-broker namespace: fgedu-eventing EOF
[root@fgedu-master ~]# cat > event-processor.yaml << EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-processor namespace: fgedu-production spec: template: spec: containers: - image: fgedu/event-processor:v1.0 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi EOF
[root@fgedu-master ~]# kubectl apply -f event-processor.yaml
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: kafka-trigger namespace: fgedu-eventing spec: broker: kafka-broker filter: attributes: type: com.fgedu.order.created subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-processor namespace: fgedu-production EOF。
,from K8S+DB视频:www.itpux.com。
[root@fgedu-master ~]# kubectl get kafka source -n fgedu-eventing
[root@fgedu-master ~]# kubectl get broker -n fgedu-eventing
[root@fgedu-master ~]# kubectl get trigger -n fgedu-eventing
[root@fgedu-master ~]# kubectl get ksvc -n fgedu-production
Part05-风哥经验总结与分享
5.1 Knative最佳实践
- 应用设计:
- 无状态设计:避免使用本地存储
- 短暂性:设计为可随时启动和停止
- 事件驱动:使用事件触发执行
- 资源配置:
- 合理设置CPU和内存请求
- 设置适当的并发限制
- 配置超时时间
- 扩缩容策略:
- 根据业务需求设置最小实例数
- 设置合理的最大实例数
- 选择合适的扩缩容指标
- 流量管理:
- 使用蓝绿部署进行版本更新
- 使用金丝雀发布进行灰度测试
- 配置适当的路由规则
- 监控与日志:
- 集成Prometheus监控
- 集成ELK或EFK日志系统
- 设置告警规则
- 安全:
- 使用TLS加密
- 配置适当的权限
- 使用Secret存储敏感信息
5.2 常见问题与解决方案
冷启动延迟 实例缩容到零 设置最小实例数
资源不足 资源配置过低 增加资源请求和限制
事件丢失 事件处理失败 配置重试机制
流量管理失败 路由规则错误 检查路由配置
监控数据缺失 监控配置错误 检查监控配置
日志管理困难 日志分散 使用集中式日志管理
安全漏洞 镜像存在安全漏洞 定期扫描镜像,更新基础镜像
部署失败 YAML配置错误 检查YAML配置语法
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
