微服务学习 - 在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
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
apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
name: sample
spec:
hosts:
- {name: master, address: <internal-ip>, internalAddress: <internal-ip>, privateKeyPath: "~/.ssh/id_rsa"}
roleGroups:
etcd:
- master
master:
- master
worker:
- master
controlPlaneEndpoint:
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.20.4
imageRepo: kubesphere
clusterName: cluster.local
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
registry:
registryMirrors: []
insecureRegistries: []
addons: []

执行安装

1
./kk create cluster -f config.yaml --with-kubernetes v1.20.4 --with-local-storage

完成 kubectl 的自动补全

1
2
3
4
5
6
7
8
# Install bash-completion
apt-get install bash-completion

# Source the completion script in your ~/.bashrc file
echo 'source <(kubectl completion bash)' >>~/.bashrc

# Add the completion script to the /etc/bash_completion.d directory
kubectl completion bash >/etc/bash_completion.d/kubectl

部署 OpenFunction

可以参考 prerequisites 中的内容,一键完成依赖组件的安装。

配置公网IP作为 Knative 网关地址

此处选择 Kourier 作为网关服务组件

  1. 安装组件

    1
    kubectl apply -f https://github.com/knative/net-kourier/releases/download/v0.24.0/kourier.yaml
  2. 配置 Kourier 为 Knative 的默认网关

    1
    2
    3
    4
    kubectl patch configmap/config-network \
    --namespace knative-serving \
    --type merge \
    --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'
  3. 配置 Kourier 的外部地址

    参考 如何手动部署 QingCloud 负载均衡器插件 ,或按照以下内容执行。

    这里将使用开头所说的 <public-ip-2> 作为 Kourier 的外部地址,具体为通过 QingCloud 的 cloud-controller-manager 来创建负载均衡器,<public-ip-2> 即为这个负载均衡器的vip地址来提供给 Kourier 使用:

    1. 需要在节点上执行下面的命令:

      {nodename} 为节点名称

      1
      2
      instance_id=`cat /etc/qingcloud/instance-id`
      kubectl annotate nodes {nodename} "node.beta.kubernetes.io/instance-id=${instance_id}" ##请替换nodename
    2. 生成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
      3
      qy_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
    3. 生成负载均衡器插件配置文件

      touch qingcloud.yaml; vim qingcloud.yaml ,修改其中一些字段:

      1
      2
      3
      zone: pek3  #必填,值与第二步中的zone相同
      defaultVxNetForLB: vxnet-lddzg8e #k8s集群主机所在私有网络ID, 可以通过IAAS控制台“网络与CDN/私有网络”查看
      clusterID: "mycluster" #集群名称,必填,任意字符串,但是必须保证在一个网段内唯一。

      文件保存之后使用下面的命令创建配置文件

      1
      kubectl create configmap lbconfig --from-file=qingcloud.yaml -n kube-system
    4. 安装yaml,等待安装完成即可

      1
      kubectl apply -f https://raw.githubusercontent.com/yunify/qingcloud-cloud-controller-manager/master/deploy/kube-cloud-controller-manager.yaml
    5. 使用公网ip绑定负载均衡器

      请参考 青云负载均衡器配置指南 ,或按照以下内容执行。

      编辑 kourier service ,增加如下的 annotations :

      eip-xxxxx 即为 <public-ip-2> 的名称,可以在 QingCloud 控制台上查看到

      1
      2
      3
      4
      5
      ~# kubectl 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"
  4. 确认 Kourier 服务可用

    经过上述配置后,等待负载均衡器创建完成,确认 kourier service 已经获取到正确的 EXTERNAL-IP

    1
    2
    3
    4
    ~# kubectl --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. 创建一个用于访问个人镜像仓库的秘钥:

    1
    2
    3
    4
    5
    REGISTRY_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
  2. 创建一个函数配置:

    可以参考 samples 中的案例,有使用 Knative 作为运行时的案例 hello-world-go 和使用 OpenFuncAsync 作为运行时的案例 Autoscaling service based on queue depth

    hello-world-go 为例,克隆项目进入对应目录后,执行:

    1
    kubectl apply -f function-sample.yaml
  3. 可以通过 Tekton Dashboard 观察函数构建过程

  4. 访问函数

    查看 serving 的状态

    1
    2
    3
    4
    ~# kubectl get ksvc

    NAME URL
    function-sample-serving-ksvc http://function-sample-serving-ksvc.default.<public-ip-2>.sslip.io

    访问 URL 中的地址:

    1
    2
    3
    ~# curl http://function-sample-serving-ksvc.default.<public-ip-2>.sslip.io

    Hello, World!