从后端研发角度出发,使用k8s部署业务系统

k8s,作为目前最流行的容器编排中间件,大家应该都听说过,很多公司也都在用,但基本都是运维在管理k8s,开发人员一般涉及不到,开发人员只需要写业务代码,然后运维人员负责制作镜像,然后用k8s拉取镜像,启动容器,对外提供服务,这一套,现在都是自动化的,但是我觉着作为业务研发,也应该要清楚这一套流程的实现机制,这样在出问题的时候,可以多一些排查的思路,而不是只能干等着运维同事排查。
接下来,我就以一个python项目的启动过程举例,来看一下一个python项目是如何在k8s中部署起来的。

(1)、第一步,编写python的业务代码
(2)、第二步,使用预先写好的Dockerfile文件制作docker镜像,镜像中会包含执行python文件的命令定义
(3)、第三步,将docker镜像推到本地的镜像仓库,比如:docker提供的registry或者VMvare提供的harbor,后者是对registry的扩展,添加了很多企业级功能,目前大部分企业一般都用后者来管理镜像
(4)、第四步,编写k8s的的yaml文件,yaml文件中会指定从企业的镜像仓库拉取镜像,然后以此创建pod,对外提供服务

以上就是将一个python项目容器化启动的流程,下面我们具体操作一下。
先看一下目录

文章目录

  • 1、编写python的业务代码
  • 2、编写Dockerfile文件,制作docker镜像
    • 2.1、编写Dockerfile文件
    • 2.2、制作docker镜像
  • 3、将docker镜像推送到本地registry镜像仓库
    • 3.1、启动一个带认证功能的registry
      • 3.1.1、创建加密的用户名和密码文件
      • 3.1.2、启动带认证功能的registry
      • 3.1.3、验证认证功能
    • 3.2、推送docker镜像
  • 4、编写k8s的yaml文件
    • 4.1、创建kubenetes secret
    • 4.2、编写yaml文件
  • 5、根据yaml文件,创建pod

1、编写python的业务代码

这部分业务代码,参考了极客时间的<深入剖析kubernetes>专栏课。
这段python代码很简单,就是从环境变量里读取NAME的值,打印在hello后面,如果获取不到,就将world打印在hello后面。

from flask import Flask
import socket
import osapp = Flask(__name__)@app.route('/')
def hello():html = "<h3>Hello {name}!</h3>" \"<b>Hostname:</b> {hostname}<br/>"return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())if __name__ == "__main__":app.run(host='0.0.0.0', port=80)

代码里,引用了flask框架来发布web服务,我们使用requirements.txt来声明我们引用的包,requirements.txt文件在python代码的同级目录下。

app.py requirements.txt

2、编写Dockerfile文件,制作docker镜像

2.1、编写Dockerfile文件

这个Dockerfile文件,也是参考极客时间的<深入剖析kubernetes>专栏课,每一行代码都是一个Dockerfile的命令原语。这些原语具体的含义,都做了注释

# 使用官方提供的Python开发镜像作为基础镜像,我们制作出来的镜像,就会包含python的基础开发环境
FROM python:2.7-slim# 将工作目录切换为/app,类似于一个cd /app命令
WORKDIR /app# 将当前目录下的所有内容复制到/app下
ADD . /app# 使用pip命令安装这个python应用所需要的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt# 允许外界访问容器的80端口
EXPOSE 80# 设置环境变量
ENV NAME=World# 设置容器进程为:python app.py,即:这个Python应用的启动命令
CMD ["python", "app.py"]

2.2、制作docker镜像

docker build -t py_container .
-t意思是给这个镜像起一个名字,创建成功的话,使用docker image ls可以查看我们创建的这个镜像在这里插入图片描述

3、将docker镜像推送到本地registry镜像仓库

3.1、启动一个带认证功能的registry

3.1.1、创建加密的用户名和密码文件

# 安装工具,Ubuntu系统
apt-get install -y apache2-utils# 创建认证文件(用户:admin,密码:123456)
mkdir -p /opt/registry/auth
htpasswd -Bbn admin 123456 > /opt/registry/auth/htpasswd

3.1.2、启动带认证功能的registry

docker run -d -p 5000:5000 \--name registry \-v /opt/registry/auth:/auth \-e "REGISTRY_AUTH=htpasswd" \-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \-v /opt/registry/data:/var/lib/registry \--restart always \registry:2

3.1.3、验证认证功能

我们访问一下我们此前推送到registry的镜像列表

root@1121-67dff6765fc00 # curl http://localhost:5000/v2/_catalog
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}

可以看到,认证失败。此时我们加上此前设置的用户名密码,就可以访问registry成功

root@1121-67dff6765fc00 # curl -u admin:123456 http://localhost:5000/v2/_catalog
{"repositories":["py-container"]}

3.2、推送docker镜像

#将我们此前制作的镜像打上一个tag
docker tag cf756704a3dc localhost:5000/py-container:0.0.1
#将打好tag的镜像推送到仓库
docker push localhost:5000/py-container:0.0.1

4、编写k8s的yaml文件

4.1、创建kubenetes secret

我们需要将这个regcred配置到yaml中,然后kubenetes就可以访问到需要认证才可以访问的本地registry

kubectl create secret docker-registry regcred \--docker-server=localhost:5000 \--docker-username=admin \--docker-password=123456

4.2、编写yaml文件

这个yaml文件很简单,就是创建了一个名为py-container-deployment的deployment,这个deployment管理了2个pod,pod的镜像从本地registry中拉取。yaml文件的末尾,我们增加了imagePullSecrets来引用此前创建的kubenetes secret,以此可以访问需要加密访问的registry

apiVersion: apps/v1
kind: Deployment
metadata:name: py-container-deployment
spec:selector:matchLabels:app: py-containerreplicas: 1template:metadata:labels:app: py-containerspec:containers:- name: py-podimage: localhost:5000/py-container:0.0.1ports:- containerPort: 80imagePullSecrets:- name: regcred

5、根据yaml文件,创建pod

kubectl create -f py_pod.yaml

查看pod的启动情况
在这里插入图片描述
如果要删除这个deployment管理的pod,我们可以通过以下命令删除

kubectl delete deployment py-container-deployment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 Echarts 3D圆柱体柱状图实现教程以及封装一个可复用的组件

文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 首先实现一个基础柱状图3.3 添加上下2个椭圆面3.4 进阶封装一个可复用的3D圆形柱状图组件 总结 前言 在前端开发的数据可视…

WPF 上位机开发模板

WPF 上位机开发模板 WPF上位机开发模板,集成了基础操作菜单、海康视觉实时图像界面、串口通讯、网口通讯、主流PLC通讯、数据存储、图片存储、参数配置、权限管理、第三方webapi接口接入、数据追溯与查询等功能。 一、项目结构 WpfSupervisor/ ├── Models/ …

浏览器插件,提示:此扩展程序未遵循 Chrome 扩展程序的最佳实践,因此已无法再使用

1、发现的问题如下&#xff1a; 如果你是比较新的 Chrome 135.0.7049.42&#xff08;含&#xff09;以上版本的话&#xff0c;可以通过修改 chorme://flags 来彻底解决。 2、在浏览器分别输入两个地址&#xff1a; chrome://flags/#extension-manifest-v2-deprecation-disable…

【原创】从s3桶将对象导入ES建立索引,以便快速查找文件

总体功能&#xff1a; 这段程序的作用是&#xff1a; 从指定的S3桶中读取所有对象的元数据&#xff08;文件名、大小、最后修改时间、存储类型、ETag等&#xff09;&#xff0c;并把这些信息写入到Elasticsearch&#xff08;ES&#xff09;中&#xff0c;建立索引&#xff0c…

git 查看用户信息

在 Git 中查看用户信息是一项常见的任务&#xff0c;可以帮助你确认当前仓库的配置或全局的 Git 配置是否正确设置。你可以通过多种方式来查看这些信息。 查看全局用户信息 全局用户信息是应用于所有 Git 仓库的默认设置。要查看全局用户信息&#xff0c;可以使用以下命令&am…

制作JDK17 arm64基础镜像,解决字体安装问题

1、下载jdk17 arm64的安装包 官网下载地址 2、编写Dockerfile 图形验证码生成需要使用到相关字体&#xff0c;所以基础镜像把字体相关也安装上。 # 基础镜像 FROM arm64v8/centos:8.4.2105MAINTAINER hqh# 换源 RUN sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/…

人工智能数学基础(三):微积分初步

微积分作为数学的重要分支&#xff0c;为人工智能的发展提供了坚实的理论基础。从理解数据的变化趋势到优化模型参数&#xff0c;微积分的应用贯穿其中。本文将深入探讨微积分的核心概念&#xff0c;并结合 Python 编程实例&#xff0c;助力大家轻松掌握这些关键知识点。资源绑…

区块链密码学核心

文章目录 概要1. 基础密码学哈希函数&#xff08;Hash Function&#xff09;对称加密与非对称加密数字签名&#xff08;Digital Signature&#xff09;密钥管理 2. 区块链专用密码学技术零知识证明&#xff08;Zero-Knowledge Proof, ZKP&#xff09;同态加密&#xff08;Homom…

Java后端开发day39--方法引用

&#xff08;以下内容全部来自上述课程&#xff09; 1.1 含义 把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体。 已经有的方法&#xff1a;可以是Java自己写的&#xff0c;也可以是第三方的。 示例语句&#xff1a; &#xff1a;&#xff1a;是方法引…

目前市面上知名的数据采集器

程序员爱自己动手打造一切&#xff0c;但这样离钱就会比较远。 市面上知名的数据采集工具 数据采集工具&#xff08;也称为网络爬虫或数据抓取工具&#xff09;在市场上有很多选择&#xff0c;以下是目前比较知名和广泛使用的工具分类介绍&#xff1a; 一、开源免费工具 Scra…

TP5兼容达梦国产数据库

1.首先数据库安装&#xff0c;部署时需配置大小写不敏感 2.安装PHP达梦扩展&#xff0c;一定要是对应版本&#xff08;兼容操作系统&#xff09;的扩展&#xff0c;否则会出现各种报错。参考官方文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new…

《解锁图像“高清密码”:超分辨率重建之路》

在图像的世界里&#xff0c;高分辨率意味着更多细节、更清晰的画面&#xff0c;就像用高清望远镜眺望远方&#xff0c;一切都纤毫毕现。可现实中&#xff0c;我们常被低分辨率图像困扰&#xff0c;模糊的监控画面、老旧照片里难以辨认的面容……不过别担心&#xff0c;图像超分…

整合 CountVectorizer 和 TfidfVectorizer 绘制词云图

本文分别整合 CountVectorizer 和 TfidfVectorizer 绘制词云图 ✨ CountVectorizer CountVectorizer 是 scikit-learn 中用于 文本特征提取 的一个工具&#xff0c;它的主要作用是将一组文本&#xff08;文本集合&#xff09;转换为词频向量&#xff08;Bag-of-Words&#xf…

Linux 用户管理

用户管理是 Linux 系统管理中的重要组成部分&#xff0c;它涉及到用户和用户组的创建、删除、修改以及权限分配等操作。以下是关于用户和用户组管理的详细说明&#xff1a; 一、用户和用户组的概念 &#xff08;一&#xff09;用户&#xff08;User&#xff09; 用户是系统中…

【HTTP/2和HTTP/3的应用现状:看不见的革命】

HTTP/2和HTTP/3的应用现状&#xff1a;看不见的革命 实际上&#xff0c;HTTP/2和HTTP/3已经被众多著名网站广泛采用&#xff0c;只是这场革命对普通用户来说是"无形"的。让我们揭开这个技术变革的真相。 著名网站的HTTP/2和HTTP/3采用情况 #mermaid-svg-MtfrNDo5DG…

青少年编程与数学 02-018 C++数据结构与算法 16课题、贪心算法

青少年编程与数学 02-018 C数据结构与算法 16课题、贪心算法 一、贪心算法的基本概念定义组成部分 二、贪心算法的工作原理三、贪心算法的优点四、贪心算法的缺点五、贪心算法的应用实例&#xff08;一&#xff09;找零问题问题描述&#xff1a;贪心策略&#xff1a;示例代码&a…

UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别

在 Unreal Engine 的蓝图里&#xff0c;SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三个节点虽然都能改变物体位置&#xff0c;但作用对象和坐标空间&#xff08;Coordinate Space&#xff09;不同&#xff1a; 1. SetActorLocation 作用对象&#xff1a;整个…

VINS-FUSION:跑通手机录制数据

文章目录 &#x1f4da;简介&#x1f680;手机录制数据&#x1f680;跑通数据&#x1f527;启动rviz&#x1f527;启动配置&#x1f527;播放rosbag&#x1f3af;跑通结果 &#x1f4da;简介 利用智能手机的 摄像头IMU 采集数据&#xff0c;并在 VINS-Fusion&#xff08;视觉惯…

Spring AI在大模型领域的趋势场景题深度解析

Spring AI在大模型领域的趋势场景题深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于Spring AI在大模型领域的趋势场景的相关问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们…

MySQL数据库全面详解:从基础到高级应用

一、数据存储概述 在计算机系统中&#xff0c;数据可以存储在多种形式中&#xff1a; 变量&#xff1a;程序中最基本的数据存储单元 元组&#xff1a;不可变的序列类型&#xff0c;常用于函数返回多个值 列表&#xff1a;有序可变集合&#xff0c;可存储不同类型元素 字典&…