微服务学习 - 在QingCloud上部署OpenFunction
概述
OpenFunction 是一个云原生的开源 FaaS 平台(函数即服务),旨在让用户专注于他们的业务逻辑,而不必关心底层运行环境和基础设施。
该文档将描述如何在 QingCloud 上部署 OpenFunction。
欢迎访问 OpenFunction 项目主页 参与贡献。
环境准备
4c8g虚拟机1台,操作系统 ubuntu 18.04.5 LTS ,内网地址用 <internal-ip>
表示
公网ip 2个,以下用 <public-ip-1>
和 <public-ip-2>
表示,其中:
<public-ip-1>
用于绑定 QingCloud 的VPC资源,方便访问虚拟机<public-ip-2>
用于提供 Knative 的外部网关地址
部署前准备
配置公钥登录
使用 ssh-keygen
生成公钥后,复制公钥内容到本机的 ~/.ssh/authorized_keys
1 | echo "`cat ~/.ssh/id_rsa.pub`" >> ~/.ssh/authorized_keys |
部署 kubernetes
使用 kubeKey 部署 kubernetes ,版本选择v1.20.4
安装基础软件
1 | apt install -y conntrack socat ipset |
安装 kubeKey
参考:下载 KubeKey
1 | curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.0 sh - |
生成配置
1 | ./kk create config -f config.yaml --with-kubernetes v1.20.4 |
对 config.yaml 内容进行编辑:
1 | apiVersion: kubekey.kubesphere.io/v1alpha1 |
执行安装
1 | ./kk create cluster -f config.yaml --with-kubernetes v1.20.4 --with-local-storage |
完成 kubectl 的自动补全
1 | Install bash-completion |
部署 OpenFunction
可以参考 prerequisites 中的内容,一键完成依赖组件的安装。
配置公网IP作为 Knative 网关地址
此处选择 Kourier 作为网关服务组件
安装组件
1
kubectl apply -f https://github.com/knative/net-kourier/releases/download/v0.24.0/kourier.yaml
配置 Kourier 为 Knative 的默认网关
1
2
3
4kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'配置 Kourier 的外部地址
参考 如何手动部署 QingCloud 负载均衡器插件 ,或按照以下内容执行。
这里将使用开头所说的
<public-ip-2>
作为 Kourier 的外部地址,具体为通过 QingCloud 的 cloud-controller-manager 来创建负载均衡器,<public-ip-2>
即为这个负载均衡器的vip地址来提供给 Kourier 使用:需要在节点上执行下面的命令:
{nodename} 为节点名称
1
2instance_id=`cat /etc/qingcloud/instance-id`
kubectl annotate nodes {nodename} "node.beta.kubernetes.io/instance-id=${instance_id}" ##请替换nodename生成api密钥文件,具体生成方法可参考https://docs.qingcloud.com/product/cli/#%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
touch secret.yaml; vim secret.yaml
,填充通过上面方法获取到的内容,内容例子如下:1
2
3qy_access_key_id: 'QINGCLOUDACCESSKEYID' #修改为自己的qy_access_key_id
qy_secret_access_key: 'QINGCLOUDSECRETACCESSKEYEXAMPLE' #修改为自己的qy_secret_access_key
zone: 'pek3' #修改为k8s集群节点所在zone文件保存之后使用下面的命令创建配置文件
1
kubectl create secret generic qcsecret --from-file=config.yaml=./secret.yaml -n kube-system
生成负载均衡器插件配置文件
touch qingcloud.yaml; vim qingcloud.yaml
,修改其中一些字段:1
2
3zone: pek3 #必填,值与第二步中的zone相同
defaultVxNetForLB: vxnet-lddzg8e #k8s集群主机所在私有网络ID, 可以通过IAAS控制台“网络与CDN/私有网络”查看
clusterID: "mycluster" #集群名称,必填,任意字符串,但是必须保证在一个网段内唯一。文件保存之后使用下面的命令创建配置文件
1
kubectl create configmap lbconfig --from-file=qingcloud.yaml -n kube-system
安装yaml,等待安装完成即可
1
kubectl apply -f https://raw.githubusercontent.com/yunify/qingcloud-cloud-controller-manager/master/deploy/kube-cloud-controller-manager.yaml
使用公网ip绑定负载均衡器
请参考 青云负载均衡器配置指南 ,或按照以下内容执行。
编辑 kourier service ,增加如下的 annotations :
eip-xxxxx 即为
<public-ip-2>
的名称,可以在 QingCloud 控制台上查看到1
2
3
4
5kubectl edit -n kourier-system svc kourier
annotations:
service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids: "eip-xxxxx" #这里设置EIP
service.beta.kubernetes.io/qingcloud-load-balancer-type: "0"
确认 Kourier 服务可用
经过上述配置后,等待负载均衡器创建完成,确认 kourier service 已经获取到正确的 EXTERNAL-IP
1
2
3
4kubectl --namespace kourier-system get service kourier
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kourier LoadBalancer 10.233.40.58 <public-ip-2> 80:30807/TCP,443:32762/TCP 18m
部署 OpenFunction 控制器
你可以参考 install 文档安装 OpenFunction 的稳定版本或开发版本。
使用案例
使用 OpenFunction 之前,需要做一些准备:
创建一个用于访问个人镜像仓库的秘钥:
1
2
3
4
5REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER=<your_registry_user> REGISTRY_PASSWORD=<your_registry_password>
kubectl create secret docker-registry push-secret \
--docker-server=$REGISTRY_SERVER \
--docker-username=$REGISTRY_USER \
--docker-password=$REGISTRY_PASSWORD创建一个函数配置:
可以参考 samples 中的案例,有使用 Knative 作为运行时的案例 hello-world-go 和使用 OpenFuncAsync 作为运行时的案例 Autoscaling service based on queue depth
以 hello-world-go 为例,克隆项目进入对应目录后,执行:
1
kubectl apply -f function-sample.yaml
可以通过 Tekton Dashboard 观察函数构建过程
访问函数
查看 serving 的状态
1
2
3
4kubectl get ksvc
NAME URL
function-sample-serving-ksvc http://function-sample-serving-ksvc.default.<public-ip-2>.sslip.io访问 URL 中的地址:
1
2
3curl http://function-sample-serving-ksvc.default.<public-ip-2>.sslip.io
Hello, World!