Knative备忘录 2022-12-12 笔记,实验 暂无评论 1171 次阅读 [TOC] ## Knative是什么 - Knative是一个Serverless框架,用于部署函数服务(Function as a Service) - 中文文档:https://knative-sample.com/10-getting-started/10-why-knative/ - 官方文档:https://knative.dev/docs/ ## 国内安装Knative > 别在国内服务器折腾Knative。需要拿Knative做实验的话,可以花1块钱租1小时的外网地区的云服务器,释放前20分钟保存一下系统镜像,下次用再租,真的可以跳过很多麻烦。 Knative官方文档提供了适合[菜鸟(QuickStart)](https://knative.dev/docs/install/quickstart-install/)、[新手(YAML)](https://knative.dev/docs/install/yaml-install/)、[老手(Operator)](https://knative.dev/docs/install/operator/knative-with-operators/)的三种安装方式。但是,由于国内服务器连不上`谷歌容器镜像仓库gci.io`和`Github资源库githubusercontent.com`,三种安装方法一个都用不了。最后是通过开发者方式(git clone)安装的。 以下是国内服务器成功安装Knative以后,对关键步骤的回忆,不算是安装教程。 ### 安装Kubernetes(K8s) 最简单、不容易出错的方法,是用 [kind](https://kind.sigs.k8s.io/docs/user/quick-start/) 在Docker容器内部署Kubernetes集群。宿主机只需要安装kubectl来操作集群就行了,**不需要在宿主机安装kubelet和kubeadm**。 ```shell # 修改Docker镜像与cgroup驱动 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker # 安装KIND curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64 chmod +x ./kind sudo mv ./kind /usr/local/bin/kind # 配置Kubernetes国内源 apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat </etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-$(lsb_release -c|awk '{print $2}') main EOF apt-get update # 安装kubectl apt-get install -y kubectl=1.25.3-00 ``` 上面有几个细节: - 修改Docker的cgroups驱动 - Docker与Kubernetes的cgroups驱动要保持一致 - Kubernetes的默认是systemd,而Docker的默认是cgroupfs - 配置Kubernetes国内源 - 只有先配置Kubernetes源,才能安装kubelet、kubeadm、kubectl - 官方源是谷歌的,国内源是阿里云的。 - `lsb_release -c|awk '{print $2}'`是输出Ubuntu系统代号的命令 - `lsb_release -c`是输出:`Codename: focal` - `awk '{print $2}'`是选取第二个字段,输出:`focal` - > ps. 以后想更新Ubuntu的软件源,就可以直接运行下面命令,不用手动修改版本代号了: > > ```shell > mv /etc/apt/sources.list /etc/apt/sources.list.bak > echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ $(lsb_release -c|awk '{print $2}') main restricted universe multiverse" >/etc/apt/sources.list > echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ $(lsb_release -c|awk '{print $2}')-updates main restricted universe multiverse" >>/etc/apt/sources.list > echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ $(lsb_release -c|awk '{print $2}')-backports main restricted universe multiverse" >>/etc/apt/sources.list > echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ $(lsb_release -c|awk '{print $2}')-security main restricted universe multiverse" >>/etc/apt/sources.list > apt-get update > ``` - 安装指定版本号的kubectl - 目前Kind的最新版本是v0.17.0,可以部署1.25.3版本的k8s - 不带版本号,apt默认会安装最新版的k8s(1.25.4版本) ### Docker镜像机器人 容器镜像仓库一般是指docker.io,但K8s和Knative用的容器镜像仓库是gcr.io。 gcr.io在国内访问不了,而Docker镜像加速只能加速docker.io。 Docker镜像机器人可以将gcr.io里的镜像搬到docker.io,这样国内就能下载了。 - Fork这个项目:https://github.com/togettoyou/hub-mirror - 绑定自己的Dockerhub账号 - 通过提交issue来让Github Action搬运镜像 ### 安装Knative - 安装`kn`命令行工具:https://knative.dev/docs/install/quickstart-install - 创建集群: - ```shell cat <./kind-knative.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 name: knative nodes: - role: control-plane image: kindest/node:v1.24.3 extraPortMappings: - containerPort: 31080 listenAddress: 127.0.0.1 hostPort: 80 EOF kind create cluster --wait=120s --config=./kind-knative.yaml ``` - 这个创建集群命令是从`kn quickstart kind`源码里扒的,如果服务器的80端口已经拿来开网站了,就需要将上面的`hostPort: 80`改成其他任意端口号。 - 安装serving和eventing这两个组件,Knative就安装完成了。 - 把这两个组件克隆到本地 - serving组件:https://github.com/knative/serving - eventing组件:https://github.com/knative/eventing - 这两个组件的安装步骤,都在项目根目录的`DEVELOPMENT.md`里。 - 安装这两个组件,都需要配置go和ko。 - 安装Go语言 - 从[Go语言官网](https://go.dev/doc/install)或者[镜像站](https://gomirrors.org)下载`go1.19.4.linux-amd64.tar.gz` - 安装并设置环境变量: ```shell rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.4.linux-amd64.tar.gz echo "export PATH=$PATH:/usr/local/go/bin:/root/go/bin" >> /etc/profile echo "export GOPROXY=https://goproxy.cn,direct" >> /etc/profile source /etc/profile ``` - 安装Ko: - ```shell go install github.com/google/ko@latest ``` - 这两个组件,项目根目录都有个`.ko.yaml`,里面的默认镜像是gcr.io开头的,需要将这个镜像搬到docker.io,并在`.ko.yaml`里改成docker.io的,否则ko命令会超时。 ## 外网服务器部署Knative ``` sudo su mkdir ~/knative cd ~/knative # 安装docker apt install -y docker.io # 登录docker docker login -u <用户名> -p <密码> # 安装go wget https://go.dev/dl/go1.19.4.linux-amd64.tar.gz rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.4.linux-amd64.tar.gz echo "export PATH=$PATH:/usr/local/go/bin:/root/go/bin" >> /etc/profile source /etc/profile # 修改Docker镜像与cgroup驱动 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker # 安装KIND curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64 chmod +x ./kind sudo mv ./kind /usr/local/bin/kind # 安装Kubectl(当前kind是1.24.3版本) curl -LO https://dl.k8s.io/release/v1.24.3/bin/linux/amd64/kubectl sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # 安装kn git clone https://github.com/knative/client.git cd client/ hack/build.sh -f mv kn /usr/bin/ kn version # 安装knative一键部署插件 cd ../ git clone https://github.com/knative-sandbox/kn-plugin-quickstart.git cd kn-plugin-quickstart/ hack/build.sh mv kn-quickstart /usr/local/bin kn quickstart --help # 部署knative kn quickstart kind kind get clusters # 安装func cd ../ git clone https://github.com/knative/func.git func cd func/ make mv ./func /usr/bin/ func version # 创建python函数 cd ../ mkdir example cd example func create -l python hello # 修改镜像仓库 cd hello vim func.yaml ``` 将registry后面改为"docker.io/<用户名>"。 ``` func deploy ``` 如果deploy卡在push阶段,就可以先运行`export FUNC_PUSH=false`来跳过push。 >查看部署结果: ``` root@VM-0-10-ubuntu:/home/ubuntu# kn service list NAME URL LATEST AGE CONDITIONS READY REASON hello http://hello.default.127.0.0.1.sslip.io hello-00001 21h 3 OK / 3 True ``` 调用函数: ``` root@VM-0-10-ubuntu:/home/ubuntu# curl http://hello.default.127.0.0.1.sslip.io -d "name=pro1515151515" -d "website=www.proup.club" {"name": "pro1515151515", "website": "www.proup.club"} ``` 标签: none 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭