自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在 Kubernetes 中面向虛擬機(jī)節(jié)點(diǎn)分發(fā)文件、執(zhí)行腳本

云計(jì)算 虛擬化
勿在浮沙筑高臺(tái)。業(yè)務(wù)量的增長(zhǎng)、業(yè)務(wù)形態(tài)的進(jìn)化都需要堅(jiān)實(shí)強(qiáng)勁的 IT 系統(tǒng)支撐。業(yè)務(wù)內(nèi)容對(duì)市場(chǎng)是透明的,但是 IT 系統(tǒng)不是一朝一夕能建設(shè)完善的。未來(lái)公司之間的競(jìng)爭(zhēng)主要也會(huì)來(lái)自于 IT 系統(tǒng)之間的競(jìng)爭(zhēng),能不能快速響應(yīng)業(yè)務(wù)需求是決勝的關(guān)鍵。

[[395417]]

本文轉(zhuǎn)載自微信公眾號(hào)「問(wèn)其」,作者陳少文。轉(zhuǎn)載本文請(qǐng)聯(lián)系問(wèn)其公眾號(hào)。    

1. 本文主要討論什么

勿在浮沙筑高臺(tái)。業(yè)務(wù)量的增長(zhǎng)、業(yè)務(wù)形態(tài)的進(jìn)化都需要堅(jiān)實(shí)強(qiáng)勁的 IT 系統(tǒng)支撐。業(yè)務(wù)內(nèi)容對(duì)市場(chǎng)是透明的,但是 IT 系統(tǒng)不是一朝一夕能建設(shè)完善的。未來(lái)公司之間的競(jìng)爭(zhēng)主要也會(huì)來(lái)自于 IT 系統(tǒng)之間的競(jìng)爭(zhēng),能不能快速響應(yīng)業(yè)務(wù)需求是決勝的關(guān)鍵。

IT 系統(tǒng)也在不斷進(jìn)化。建設(shè)高效、智能的 IT 系統(tǒng)成本是很高的。剛開(kāi)始只需要夠用,接著是好用,最后成為核心競(jìng)爭(zhēng)力。

變化并不可怕,可怕的是沉重的歷史包袱。對(duì)于技術(shù)人員來(lái)說(shuō),新需求不是什么難事,難的是在高速飛行狀態(tài)下更換部件。既能保證原有功能正常,又能滿(mǎn)足新的需求,還要更替 IT 基礎(chǔ)設(shè)施。

在進(jìn)行容器化、Kubernetes 化轉(zhuǎn)變的過(guò)程中,如何直接給虛擬機(jī) (VM) 分發(fā)文件,在虛擬機(jī)上執(zhí)行腳本是本文思考的重點(diǎn)。直接操作虛擬機(jī),不符合云原生不可變的基礎(chǔ)設(shè)施定義,但歷史業(yè)務(wù)場(chǎng)景要求,作為 IT 平臺(tái)方需要提供解決方案。本文將對(duì)此給出答案。

2. 為什么需要一個(gè) PaaS 平臺(tái)

當(dāng)一個(gè) IT 運(yùn)維團(tuán)隊(duì)開(kāi)始建設(shè) PaaS 時(shí),他們才真正算站起來(lái)了。

在目前的環(huán)境下,業(yè)務(wù)模式、形態(tài)不再是商業(yè)機(jī)密。信息、人員的快速流動(dòng),讓公司之間赤裸對(duì)峙。你有的業(yè)務(wù),我也可以有;我有的功能,你也可以加。業(yè)務(wù)短時(shí)間爆發(fā)增長(zhǎng)的時(shí)代已過(guò),我們正處于一個(gè)精細(xì)化運(yùn)營(yíng)、數(shù)據(jù)化決策的時(shí)代。

新時(shí)代對(duì) IT 系統(tǒng)有著更多的需求,這些需求在傳統(tǒng)模式下是無(wú)法滿(mǎn)足的。傳統(tǒng)的模式是針對(duì)特定的場(chǎng)景開(kāi)發(fā) SaaS 服務(wù),將技能封裝在固定的流程中,降本增效,控制風(fēng)險(xiǎn)。這在早期也夠用,但隨著業(yè)務(wù)規(guī)模發(fā)展,運(yùn)維人員會(huì)陷入無(wú)休止地加班改功能、加功能的狀態(tài)。

PaaS 的目的是為了抽象一些公共的功能。中臺(tái)也是這樣建設(shè)的,不變的領(lǐng)域?qū)崿F(xiàn)落地到平臺(tái),對(duì)外提供服務(wù)接口。讓前端直接與業(yè)務(wù)綁定在一起,應(yīng)對(duì)市場(chǎng)的快速變化。

當(dāng)有 PaaS 平臺(tái)時(shí),IT 技能才會(huì)有一個(gè)沉淀的方向,IT 人員才能從重復(fù)、繁雜的任務(wù)中抽離出來(lái)思考業(yè)務(wù),通過(guò)拼裝才能快速支撐業(yè)務(wù)。

3. 如何實(shí)現(xiàn)文件分發(fā)、腳本執(zhí)行

3.1 在傳統(tǒng) PaaS 平臺(tái)下

如果讓一個(gè)運(yùn)維人員批量分發(fā)一個(gè)文件、執(zhí)行一個(gè)腳本,他使用 Ansible 可以很快實(shí)現(xiàn)。

但是上面提到要解放雙手,建設(shè) PaaS 平臺(tái)。下面是一張傳統(tǒng)的 IT 設(shè)施架構(gòu)圖:

在傳統(tǒng)的 IT 流程中,購(gòu)買(mǎi)的每一臺(tái)機(jī)器都需要在 CMDB 中注冊(cè)登記,然后安裝 Agent 進(jìn)行管理。通過(guò) Agent 提供的文件、腳本管道,上層的平臺(tái)可以實(shí)現(xiàn)文件分發(fā)、腳本執(zhí)行的功能。

但 Agent 的開(kāi)發(fā)成本很高。無(wú)數(shù)次的業(yè)務(wù)故障才能打磨出一個(gè)高并發(fā)、高性能、高可用、高穩(wěn)定性、高安全性的 Agent。在一些開(kāi)源的解決方案中,Agent 作為公司 IT 核心不會(huì)開(kāi)放源碼。

3.2 在 Kubernetes 下

在云原生的背景下,直接修改 IaaS 層 VM 的狀態(tài)是不被允許的,稱(chēng)之為不可變的基礎(chǔ)設(shè)施。在有些實(shí)踐中,甚至?xí)萌萜鞯?SSHD,一旦有 SSH 登錄,容器會(huì)即刻退出。

在 Kubernetes 下是不提倡直接向節(jié)點(diǎn)分發(fā)文件、執(zhí)行腳本的。

不可變的基礎(chǔ)設(shè)施 (IaC) 的邏輯是為了保證狀態(tài)能復(fù)現(xiàn),符合聲明式的語(yǔ)義。直接修改基礎(chǔ)設(shè)施是一個(gè)過(guò)程式的操作,基礎(chǔ)設(shè)施處于正在運(yùn)行的狀態(tài),存在很多的不確定性,無(wú)法準(zhǔn)確描述。

下面是云原生下的 IT 設(shè)施架構(gòu)圖:

Kubernetes 接管了 IaaS 層的資源,控制著整個(gè)系統(tǒng)的運(yùn)作。而業(yè)務(wù)的服務(wù)主要通過(guò)鏡像倉(cāng)庫(kù)下發(fā),業(yè)務(wù)的日志采集和監(jiān)控還需要借助其他開(kāi)源組件。

4. Kubernetes 分發(fā)文件、執(zhí)行腳本計(jì)劃

4.1 演練的準(zhǔn)備

下面是清單:

  • 一個(gè) Kuberentes 集群,需要能執(zhí)行 kubectl 命令
  • 待分發(fā)的 VM 已經(jīng)添加到集群節(jié)點(diǎn)中
  • Docker 環(huán)境以及 Dockerhub 賬戶(hù)

4.2 演練的內(nèi)容

  1. 演練分為如下步驟:
  2. 準(zhǔn)備執(zhí)行的腳本和文件
  3. 構(gòu)建并推送鏡像

創(chuàng)建 Kubernetes Job 進(jìn)行分發(fā)

4.3 演練的目標(biāo)

  • 演練的目標(biāo)如下:
  • 在虛擬機(jī)上運(yùn)行一個(gè) Web 服務(wù),提供文件下載功能

將一個(gè)文件分發(fā)到虛擬機(jī),并添加到下載服務(wù)中

5. Kubernetes 分發(fā)文件、執(zhí)行腳本

5.1 集群描述

  1. kubectl get node -o wide 
  2.  
  3. NAME   STATUS   ROLES           AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME 
  4. test   Ready    master,worker   6d2h   v1.17.9   10.160.6.35   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://20.10.6 

由于預(yù)算有限,這里沒(méi)有布置多節(jié)點(diǎn)的環(huán)境。但為了貼合真實(shí)場(chǎng)景,在執(zhí)行 Job 時(shí)會(huì)使用 nodeSelector 選擇指定的節(jié)點(diǎn),而不會(huì)讓分發(fā)過(guò)程失控。

5.2 準(zhǔn)備分發(fā)文件、執(zhí)行腳本

1.文件目錄結(jié)構(gòu)

  • demo
    • Dockerfile
    • start.sh

以下構(gòu)建鏡像相關(guān)的命令都是在 demo 目錄中執(zhí)行。

2.腳本 start.sh 內(nèi)容

  1. cd /data 
  2.  
  3. nohup python -m SimpleHTTPServer 8000& 

Kubernetes 集群使用的是 CentOS 7 操作系統(tǒng),自帶 Python 2 的解釋器。這里為了簡(jiǎn)單,使用 SimpleHTTPServer 提供下載服務(wù)。

3.Dockerfile 內(nèi)容

  1. FROM docker.io/alpine:3.12 
  2. ARG file 
  3. ADD ${file} /data/ 

4.待分發(fā)的文件內(nèi)容

文件可以是構(gòu)建環(huán)境中的本地文件,也可以是任意的 URL 文件鏈接。這里我選擇的是一個(gè) PDF 的文件鏈接:https://www.chenshaowen.com/static/file/ui-autotest.pdf

5.3 構(gòu)建鏡像

在 Kubernetes 中通用的是 OCI 鏡像,因此需要對(duì)文件、腳本進(jìn)行封裝,將文件、腳本打包到鏡像中,通過(guò)鏡像倉(cāng)庫(kù)進(jìn)行分發(fā)。

將待分發(fā)的文件打包到鏡像中

  1. docker build --build-arg file=https://www.chenshaowen.com/static/file/ui-autotest.pdf -t shaowenchen/file-1:latest ./ 

推送鏡像:

  1. docker push shaowenchen/file-1:latest  

將待執(zhí)行的腳本打包到鏡像中

  1. docker build --build-arg file=./start.sh -t shaowenchen/shell-1:latest ./ 

推送鏡像:

  1. docker push shaowenchen/shell-1:latest  
  • 查看 Dockerhub 中的鏡像

5.4 Kubernetes 節(jié)點(diǎn)預(yù)處理

除了待分發(fā)的節(jié)點(diǎn)需要添加到 Kubernetes 集群,另外一個(gè)重要的地方是需要對(duì)節(jié)點(diǎn)進(jìn)行預(yù)處理。

節(jié)點(diǎn)預(yù)處理主要是給節(jié)點(diǎn)添加 label,對(duì)節(jié)點(diǎn)進(jìn)行標(biāo)記,便于準(zhǔn)確分發(fā)。在生產(chǎn)中,通常網(wǎng)絡(luò)是分區(qū)的,因此引入兩個(gè)維度的標(biāo)記:zone 和 ip。

  • 標(biāo)記節(jié)點(diǎn) zone 、ip

zone 表示分區(qū),這里標(biāo)記為 a。ip 表示虛擬機(jī)在這個(gè)分區(qū)中的 IP 地址。在實(shí)踐過(guò)程中,可以在安裝 Kubernetes 集群時(shí)批量處理。

  1. kubectl label node test zone=a 
  2. kubectl label node test ip=10.160.6.35 
  • 查看標(biāo)記的標(biāo)簽
  1. kubectl get nodes --show-labels 
  2.  
  3. NAME   STATUS   ROLES           AGE    VERSION   LABELS 
  4. test   Ready    master,worker   6d2h   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ip=10.160.6.35,kubernetes.io/arch=amd64,kubernetes.io/hostname=test,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,zone=a 

5.5 向指定節(jié)點(diǎn)分發(fā)腳本并執(zhí)行

  1. cat <<EOF | kubectl apply -f - 
  2. apiVersion: batch/v1 
  3. kind: Job 
  4. metadata: 
  5.   name: shell-1 
  6. spec: 
  7.   template: 
  8.     spec: 
  9.       containers: 
  10.       - name: shell-1 
  11.     spec: 
  12.       containers: 
  13.       - name: shell-1 
  14.         command: ["sh"
  15.         args: ["-c""cp /data/start.sh /hostdata/; echo 'sh /data/start.sh&' | nsenter -t 1 -m -u -i -n;sleep 99999"
  16.         image: shaowenchen/shell-1:latest  
  17.         securityContext: 
  18.           privileged: true 
  19.         volumeMounts: 
  20.         - name: hostdata 
  21.           mountPath: /hostdata 
  22.       hostIPC: true 
  23.       hostNetwork: true 
  24.       hostPID: true 
  25.       volumes: 
  26.       - name: hostdata 
  27.         hostPath: 
  28.           path: /data/ 
  29.       restartPolicy: Never 
  30.       nodeSelector: 
  31.         zone: a 
  32.         ip: 10.160.6.35 
  33. EOF 

由于鏡像很小,很快腳本就能得到執(zhí)行。登錄到虛擬機(jī)上,查看是否有相關(guān)的服務(wù)進(jìn)程:

  1. ps aux |grep SimpleHTTPServer 
  2.  
  3. root     16523  0.1  0.0 198028 10120 ?        S    22:38   0:00 python -m SimpleHTTPServer 8000 
  4. root     17558  0.0  0.0 112684  1000 pts/1    S+   22:39   0:00 grep --color=auto SimpleHTTPServer 

表明 SimpleHTTPServer 服務(wù)已經(jīng)在虛擬機(jī)上運(yùn)行成功

5.6 向指定節(jié)點(diǎn)分發(fā)文件

  1. cat <<EOF | kubectl apply -f - 
  2. apiVersion: batch/v1 
  3. kind: Job 
  4. metadata: 
  5.   name: file-1 
  6. spec: 
  7.   template: 
  8.     spec: 
  9.       containers: 
  10.       - name: file-1 
  11.     spec: 
  12.       containers: 
  13.       - name: file-1 
  14.         command: ["sh"
  15.         args: ["-c""cp -R /data/* /hostdata/; sleep 10"
  16.         image: shaowenchen/file-1:latest  
  17.         securityContext: 
  18.           privileged: true 
  19.         volumeMounts: 
  20.         - name: hostdata 
  21.           mountPath: /hostdata 
  22.       hostIPC: true 
  23.       hostNetwork: true 
  24.       hostPID: true 
  25.       volumes: 
  26.       - name: hostdata 
  27.         hostPath: 
  28.           path: /data/ 
  29.       restartPolicy: Never 
  30.       nodeSelector: 
  31.         zone: a 
  32.         ip: 10.160.6.35 
  33. EOF 

通過(guò)頁(yè)面訪(fǎng)問(wèn),可以查看到提供的下載頁(yè)面:

在虛擬機(jī)上查看分發(fā)的文件:

  1. ls /data/ 
  2.  
  3. start.sh  ui-autotest.pdf 

6. 總結(jié)

本文主要是在 Kubernetes 下,演示了面向虛擬機(jī)如何進(jìn)行文件分發(fā)、腳本執(zhí)行,給大家在設(shè)計(jì) PaaS 平臺(tái)時(shí)提供一點(diǎn)思路。

將 Kubelet 當(dāng)做傳統(tǒng)的 Agent 使用。Kubelet 管理 Pod ,而 Agent 管理 IaaS。兩者之間有共同點(diǎn)可以思考。另外,Kubernetes 單集群支持高達(dá) 5000 個(gè)節(jié)點(diǎn),能滿(mǎn)足絕大部分需求場(chǎng)景。通過(guò)多集群可以支持更多節(jié)點(diǎn)。

可以支持更多來(lái)源的二進(jìn)制分發(fā)。示例中使用的是 https 文件,也可以使用本地文件,還可以將 S3 中的文件下載到本地再打包。同時(shí),最終的鏡像只比原始文件大幾 M。

腳本執(zhí)行可以繼續(xù)優(yōu)化。當(dāng) Job 執(zhí)行完成時(shí),腳本執(zhí)行也會(huì)結(jié)束。在實(shí)踐過(guò)程中,應(yīng)該向主機(jī)添加托管的服務(wù)。這里為了演示簡(jiǎn)便,沒(méi)有深究。

 

直接使用 hostIPC/hostPID 的 Pod 替代傳統(tǒng)虛擬機(jī)上的服務(wù)進(jìn)程也是一種方案。

 

責(zé)任編輯:武曉燕 來(lái)源: 問(wèn)其
相關(guān)推薦

2022-08-14 09:11:13

Kubernetes容器云原生

2022-06-06 14:35:59

KubevirtKubernetes虛擬機(jī)

2019-09-03 16:18:03

Vagran虛擬機(jī)集群

2018-04-04 15:05:17

虛擬機(jī)字節(jié)碼引擎

2011-05-12 11:35:32

Oracle VM V虛擬機(jī)

2010-02-24 10:39:28

Python虛擬機(jī)

2023-04-26 07:51:36

虛擬機(jī)操作系統(tǒng)進(jìn)程

2010-10-26 10:20:31

SUSE 11XenWindows虛擬機(jī)

2023-02-06 15:28:51

2019-01-03 11:18:43

Kubernetes虛擬機(jī)容器

2023-11-27 00:46:39

裸機(jī)虛擬機(jī)

2012-05-18 10:22:23

2021-07-31 12:58:53

PodmanLinux虛擬機(jī)

2014-07-25 14:20:45

Linux腳本

2010-07-26 09:02:38

2010-12-29 10:48:49

虛擬機(jī)

2013-07-17 09:32:58

2011-12-12 09:08:48

OpenStack虛擬機(jī)監(jiān)控

2020-04-09 11:00:20

Java虛擬機(jī)對(duì)象

2022-05-04 11:07:32

虛擬機(jī)Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)