前段时间,由于chatGPT的爆火,笔者也做了个chatGPT相关的小应用,试图帮小伙伴们快速将chatGPT接入到个人微信中,详见用ChatGPT搞了个 OpenAI微信接入平台(网页版)。目前,微信扫码登录的方式由于存在安全隐患,官方已经禁止此类操作了。
不过,抛开应用本身,来了解下我是如何不到一天将其快速部署上线的吧!
基础配置
资源有限,目前手上只有这么一台虚拟机,配置如下:
-
内存:12GB
-
CPU:2核(虚拟)
架构介绍:
微信接入平台小程序是基于Python Flask开发的, 主要功能即调用OPENAI接口,属于无状态应用(无存储,无数据库等),因此很适合打包到Docker容器中。所以,架构上我从一开始打算将其部署在K8S上,以Pod的方式运行以实现服务的高可用,也为后续实现CICD流水线作业、自动化运维做好基础。
照例,来问问chatGPT技术相关问题,比如将我们的应用程序部署到Kubernetes上有什么好处吧
选型:
考虑到只有单台机器, 怎么选型K8S架构呢?目前业内有这么几种方案
可以看到,MicroK8s非常适合用于本地开发环境,它能够以轻量的资源消耗和简单的运维成本提供几乎完整的Kubernetes生态体验。此外,它支持高可用特性(HA),并且与完整版的Kubernetes一样能够快速组建K8s集群。
之前我使用过 Kubernetes 官方开源工具 Kubeadm来搭建集群,相比 MicroK8s整体搭建步骤会繁琐不少,更适合需要比较多定制的场景。因此,这次我打算来体验下MicroK8s ,作为线上部署环境。
安装microK8S
在 Ubuntu 环境下,安装 MicroK8s 非常简单,命令如下
sudo snap install microk8s --classic # 安装
sudo snap alias microk8s.kubectl kubectl # 设置 K8s 命令别名(alias)
sudo usermod -a -G microk8s ubuntu # 普通用户运行权限
newgrp microk8s
microk8s enable dns dashboard storage # 启用microK8S相关服务
搞定,这样就可以基本使用了, 检查下microk8s服务状态
查看下节点状态
ubuntu@instance-k8s:~$ k get nodes
NAME STATUS ROLES AGE VERSION
instance-k8s Ready <none> 273d v1.24.10-2+123bfdfc196019
单机版本的K8S就搭建好了 ,下面来部署应用吧!
应用部署
首先,编写DockerFile将Flask 应用打包到Docker
FROM python:3.9-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3-dev
COPY . ./app/
RUN pip install -r ./app/requirements.txt
EXPOSE 9000
ENTRYPOINT ["python3","./app/routes.py"]
接着,将镜像Push到docker hub上
docker login
docker build -t chatgpt-bot-arm:v1 .
docker tag chatgpt-bot-arm:v1 thai/chatgpt-bot-arm:v1
docker push thai/chatgpt-bot-arm:v1
接着,登录服务器,部署应用POD
kubectl run chat --image=thai/chatgpt-bot-arm:v1 --port=9000 --replicas=3
检查Pods状态
ubuntu@instance-k8s:~$ k get pods
NAME READY STATUS RESTARTS AGE
chat-c9d57f5dd-w6l9v 1/1 Running 0 7d9h
chat-c9d57f5dd-7khdh 1/1 Running 0 7d9h
chat-c9d57f5dd-xvc74 1/1 Running 0 7d9h
尝试从服务器本地访问Pod 是否正常
创建service
Pods正常启动后,下一步即创建应用Service,为我们刚创建的Deployment(一组Pods)添加访问入口
知识点:
Service 是 Kubernetes 里重要的服务对象。Kubernetes 引入 Service 的原因有两个:一是因为 Pod 的 IP 不固定,二是因为在一组 Pod 实例之间需要负载均衡。我们接下来创建的ClusterIP 模式的 Service ,就是为Pod 生成一个 稳定的 IP 地址,即 VIP,具体参考官方文档: kubernetes.io/docs/concep…
创建service.yaml
测试Service是否连通pod
启用Ingress
有了Service后,怎么才能从集群外(公网)访问到我们的服务呢?
知识点:
通常,我们会创建 LoadBalancer 类型的 Service,将内部服务暴露给外界,它会在 Cloud Provider(如:AWS or Azure)里创建一个与该 Service 对应的负载均衡服务,而本文我们将使用Ingress来实现外部访问
Kubernetes 里的 Ingress 服务,可以全局地、代理不同后端 Service 而设置的负载均衡服务,类似Service的Service,具体参考官网:kubernetes.io/docs/concep…
因此,我们需要部署Ingress来作为Kubernete的“反向代理”,具体如何实现呢?
在实际的使用中,我们需要从社区里选择一个具体的 Ingress Controller,把它部署在 Kubernetes 集群里即可,好在我们可以使用MicroK8S ingress插件,启用该插件可以帮我们一键部署 nginx-ingress-controller相关应用来作为我们的Ingress 控制器
简单的命令如下
microk8s.enable ingress
查看Ingress服务状态
最后,我们编写ingress.yaml
将其部署到K8S中
最终效果,打开浏览器访问URL
写在最后
本文展示了如何使用MicroK8S 快速地搭建单机版K8S 并部署程序应用上线,若你有轻量级的小应用也可以使用此方案将其快速部署到本地进行测试等,后续我们将结合Jenkins、harbor以及Flux等工具构建我们的 CICD部署流水线, 实现自动化运维等工作。
原文关注: 云原生SRE