龙空技术网

通过亲身体验 flask 微服务架构,学习 Kubernetes 基础知识。

吉祥庄钢铁侠 67

前言:

现在大家对“flask部署到虚拟机服务器”大约比较关注,兄弟们都需要知道一些“flask部署到虚拟机服务器”的相关资讯。那么小编也在网络上汇集了一些关于“flask部署到虚拟机服务器””的相关文章,希望同学们能喜欢,同学们一起来学习一下吧!

导言

大家好!本文适合有兴趣了解 Kubernetes 基础知识的读者。在本文中,我们将通过一个小项目(视频到 MP3 转换器)来了解 Kubernetes 的基础知识。我们将使用使用 python 语言构建的 flask micro web 框架。

该项目的主要组成部分包括

设置项目:

Kubernetes 是一种应用程序编排器。它能协调容器化的云原生微服务应用程序。

协调器是一种部署和管理应用程序的系统。它可以部署应用程序并动态响应变化。例如,Kubernetes 可以

- 部署应用程序

与许多现代云原生项目一样,它是用 Go 语言编写的,在 GitHub 上开放构建,在 IRC 频道上积极讨论,你可以在 Twitter(@kubernetesio)和 slack.k8s.io 上关注它。

作为集群的 Kubernetes

Kubernetes 集群由控制平面和工作节点组成。控制平面公开应用程序接口,有一个用于分配工作的调度程序,并在持久存储中记录集群和应用程序的状态。工作节点是用户应用运行的地方。

Kubernetes 喜欢声明式管理应用程序。在这种模式下,你可以在一组配置文件中描述你想要的东西,将它们发布到 Kubernetes,然后坐等 Kubernetes 实现这一切。我们将研究 yaml 文件,在其中声明微服务的状态。

控制平面:

Kubernetes 控制平面节点运行集群的控制平面服务。这些服务是集群的大脑,所有控制和调度决策都在这里做出。在幕后,这些服务包括 API 服务器、集群存储、调度器和核心控制器。

工作节点:

工作节点是运行用户应用程序的地方。它们主要做三件事:

1. 留意 API 服务器上的新工作任务

kubelet 是主要的 Kubernetes 代理,运行在每个工作节点上。当你将一个节点加入集群时,进程会安装 kubelet,然后负责将其注册到集群中。该进程会将节点的 CPU、内存和存储注册到更大的集群池中。

kubelet 需要一个容器运行时来执行与容器相关的任务,如调用映像、启动和停止容器等。

工作节点拼图的最后一块是 kube-proxy。它在每个节点上运行,负责本地集群联网。

为 Kubernetes 打包应用程序

要在 Kubernetes 集群上运行应用程序,需要满足几个条件。其中包括

1. 作为容器包装

pod

在 VMware 的世界里,调度的原子单元是虚拟机(VM)。在 Docker 的世界里,它是容器。嗯......在 Kubernetes 的世界里,它是 Pod。

Pod 圈定了主机操作系统的一个区域,构建了一个网络堆栈,创建了一堆内核命名空间,并运行一个或多个容器。如果在 Pod 中运行多个容器,它们将共享相同的 Pod 环境。这包括网络协议栈、卷、IPC 命名空间、共享内存等。

关于 Pod 的几个要点:

部署

你可以用自己选择的语言编写应用程序微服务。然后将其构建为容器映像并存储在注册表中。此时,它就被容器化了。

接下来,你需要定义一个 Kubernetes Pod 来运行容器化应用。在我们所处的高层次上,Pod 只是一个封装器,允许容器在 Kubernetes 集群上运行。

虽然可以像这样运行静态 Pod,但首选模式是通过更高级别的控制器部署所有 Pod。最常见的控制器是部署。它为无状态应用程序提供可扩展性、自愈和滚动更新。

服务

我们刚刚了解到,舱体是会死亡的。但是,如果通过更高级别的控制器对它们进行管理,它们就会在故障时被替换。但替换下来的 Pod 的 IP 地址完全不同。这种情况也会发生在推出和扩展操作中。诸如此类的事件会导致大量的 IP 流失。

这就是服务发挥作用的地方。它们为一组 Pod 提供可靠的网络连接。

当 Pod 来来去去时,服务会对此进行观察,自动更新,并继续提供稳定的网络端点。

现在,我们准备跳转到代码。如果你到现在还在关注,我假设你已经将 repo 克隆到本地,并按照 read me 文件中提到的步骤进行了操作。

了解项目中使用的组件

为了简单起见,我尽量保持所有应用程序 k8s 组件文件的格式一致。

apiVersion: apps/v1                            -- API versionkind: Deployment                               -- type of componentmetadata:  name: auth                                   -- name of deployment    labels:                                      -- service labels must be the subset of deployment labels        app: auth                                  -- Labels can be used to organize and to select subsets of objects.        spec:          replicas: 1                                  -- number of pods which will be running at a time            selector:    matchLabels:      app: auth        strategy:    type: RollingUpdate                        --     rollingUpdate:      maxSurge: 3  template:    metadata:      labels:        app: auth            spec:      containers:        - name: auth                          -- container name                  image: nilay103/k8sauth             -- image name                            ports:            - containerPort: 5000          envFrom:            - configMapRef:                            name: auth-configmap            - secretRef:                            name: auth-secret

有关部署的详细信息,请点击此处。

kubectl apply -f filename                      -- To apply k8s config you can runkubectl get deployment                         -- to get all deployments running on a serverkubectl describe deployment deployment_name    -- to get deployment description

服务通过标签和选择器与 Pod 实现松散耦合。服务要向 Pod 发送流量,Pod 需要服务选择的每个标签。Pod 还可以拥有服务不需要的其他标签。Pod 可以有额外的标签,但服务标签必须是 Pod 标签的子集。

apiVersion: v1                 -- API versionkind: Service                  -- type of componentmetadata:  name: auth                   -- name of service  spec:  selector:    app: auth                  -- label selector to identify pods      type: ClusterIP              -- type of service. Details can be found ->         ports:                       -- port bindings            - port: 5000      targetPort: 5000      protocol: TCP      

有关服务的详细信息,请点击此处。

kubectl apply -f filename            -- To apply k8s config you can runkubectl get services                 -- to get all deployments running on a serverkubectl describe svc service_name    -- to get deployment description

总之,PV 和 PVC 可用作存储。最常见的用例是为数据库定义存储(如 docker 中的卷)

apiVersion: v1                  -- API versionkind: PersistentVolume          -- type of componentmetadata:  name: mysql-pvvolume          -- name of component    labels:                       -- labels    type: local    spec:  storageClassName: manual      -- type of storage class      capacity:          storage: 2Gi            accessModes:                  -- access mode, it can be readonly or write only or read write etc.                - ReadWriteOnce  hostPath:    path: "/mnt/data"---      apiVersion: v1                  -- API version      kind: PersistentVolumeClaim     -- type of component      metadata:  name: mysql-pvclaim           -- name of component  spec:  storageClassName: manual    accessModes:    - ReadWriteOnce             -- access mode      resources:    requests:      storage: 2Gi      
apiVersion: v1                          -- API versionkind: Secret                            -- type of componentmetadata:  name: mysql-secret                    -- component name  stringData:                             -- config data (key, value)  MYSQL_PASSWORD: root  type: Opaque  ---    apiVersion: v1                          -- API version    kind: ConfigMap                         -- type of component    metadata:  name: celery-configmap                -- component name  data:                                   -- config data (key, value)  AUTH_SVC_ADDRESS: auth:5000  NOTIFICATION_SVC_ADDRESS: ns:5055  MONGO_HOST: mongodb    REDIS_HOST: redis    

恭喜你取得了这么好的成绩。如果你已经按照上述步骤进行了操作,那么你应该可以在本地机器上运行该项目了。你可以随意修改源代码、将更新的镜像推送到 docker 文件,并更改相关部署文件中的容器镜像部分。

标签: #flask部署到虚拟机服务器