從后端研發角度出發,使用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.pswp.cn/bicheng/79038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79038.shtml
英文地址,請注明出處:http://en.pswp.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;可存儲不同類型元素 字典&…