日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kubernetes学习笔记 (二):k8s初体验

發(fā)布時間:2024/4/13 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kubernetes学习笔记 (二):k8s初体验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文采用本地k8s v1.10.3版本開發(fā),如果還沒有搭建可參照 kubernetes學(xué)習(xí)筆記 (一):搭建本地k8s開發(fā)環(huán)境進(jìn)行搭建

搭建本地Docker鏡像倉庫

  • docker pull docker.io/registry 拉取registry的鏡像到本機
  • docker run -d -p 5000:5000 --name=registry --restart=always --privileged=true --log-driver=none -v /home/data/registrydata:/tmp/registry registry 運行剛剛拉取的registry
  • 在Docker for Mac中找到Docker -> Preferences -> Daemon,在insecure registries中填入自己剛剛搭建的本地倉庫 http://localhost:5000
  • 準(zhǔn)備一個Docker鏡像

  • 隨意使用什么語言寫一個http接口,例如Nodejs:
  • @Get('whoami')async whoAmI() {debug('whoAmI called with %O', {});return { serverType: Config.SERVER_TYPE };} 復(fù)制代碼
  • 編寫對應(yīng)的DockerFile
  • FROM node:8 WORKDIR /rootRUN mkdir -p /root/appCOPY package.json /root/app/ COPY dist /root/app/distWORKDIR /root/appRUN npm config set registry https://registry.npm.taobao.org/ ;\npm config set disturl https://npm.taobao.org/dist/ ;\npm i --productionCMD [ "node", "/root/app/dist/main.js" ]EXPOSE 80復(fù)制代碼
  • 編譯、打標(biāo)簽,并推送到本地倉庫中
  • echo 'Building to dits ...' tscecho 'Docker building image ...' docker build --rm -t localhost:5000/gateapp:0.0.1 .echo 'Pushing ...' docker push localhost:5000/gateappecho 'Docker list images ...' docker images 復(fù)制代碼

    最后你會看到localhost:5000/gateapp:0.0.1的鏡像已經(jīng)在你的機器中啦,下面會用到

    Kubernetes中的重要概念

  • Cluster: Cluster是計算、存儲和網(wǎng)絡(luò)資源的集合,Kubernetes利用這些資源運行各種基于容器的應(yīng)用
  • Master: Master是Kubernetes的大腦,它的主要職責(zé)是調(diào)度,即決定將應(yīng)用放在那里運行。
  • Node: Node的職責(zé)是運行容器應(yīng)用。Node由Master管理,Node負(fù)責(zé)監(jiān)控并匯報容器的狀態(tài),同時根據(jù)Master的要求管理容器的生命周期。
  • Pod: Pod是Kubernetes中最小工作單元。每個Pod包含一個或多個容器。Pod中的容器會作為一個整體被Master調(diào)度到一個Node上運行。
  • Controller:Kubernetes通常不會直接創(chuàng)建Pod,而是通過Controller來管理Pod。Controller中定義了Pod的部署特性,比如有幾個副本、在什么樣的Node上運行等。為了滿足不同的業(yè)務(wù)場景,Kubernetes提供了多種Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等,后面會逐個學(xué)習(xí)這些Controller
  • Service:Service定義外界訪問一組特定Pod的方式。
  • 創(chuàng)建Deployment部署應(yīng)用

  • 新建一個yaml文件,如:
  • apiVersion: extensions/v1beta1 # kubectl api的版本 kind: Deployment # kubernetes的資源類型 metadata:name: gate-deployment-dev spec:replicas: 2 # 運行的Pod副本數(shù)量template:metadata:labels:app: gate-app-devspec:containers:- name: gateappimage: localhost:5000/gateapp:0.0.1 # Docker鏡像地址(上面創(chuàng)建的)env: # 鏡像啟動時的環(huán)境變量- name: NODE_ENVvalue: 'development'- name: HTTP_PORTvalue: '80' # 容器http的端口 需要自己代碼中實現(xiàn) 復(fù)制代碼
  • 通過kubectl apply -f xxx.yaml就可以部署上面的Deployment的了,也可以打開Kubernetes的Dashboard點擊創(chuàng)建,輸入yaml文件中的內(nèi)容進(jìn)行創(chuàng)建。經(jīng)過一段時間后,在Dashboard面板中可以看到,1個部署 gate-deployment-dev,一個副本集 gate-deployment-dev-775d556ffb,兩個容器組 gate-deployment-dev-775d556ffb-2tlgn、gate-deployment-dev-775d556ffb-sfqrq,可以點擊查看每個資源的信息,大部分內(nèi)容都是自解釋的。

    在部署Deployment后,Kubernetes大致執(zhí)行了以下幾個過程:

    • 用戶創(chuàng)建Deployment
    • Deployment創(chuàng)建了一個副本集(ReplicaSet)gate-deployment-dev-775d556ffb
    • ReplicaSet創(chuàng)建了兩個Pod,與我們定義的replicas: 2 一致
  • 創(chuàng)建Service

    此時上面的鏡像提供的接口還不能供外界訪問,需要創(chuàng)建一個對應(yīng)的Service

  • 新創(chuàng)建一個yaml文件或者在上一個yaml文件中添加 --- 隔開
  • 編輯以下內(nèi)容:
  • apiVersion: v1 # kubectl api的版本 kind: Service # kubernetes的資源類型 metadata:name: gate-svc-dev spec:type: NodePort # service的類型 ClusterIp類型 只有Cluster內(nèi)部節(jié)點和Pod可以訪問 NodePort Cluster外部可以通過<NodeIp>:<NodePort>訪問 LoadBalancer負(fù)載均衡selector:app: gate-app-dev # 與上面的template中定義的label一致ports:- protocol: TCP # 只有TCP 或 UDPport: 80 # clusterIp 監(jiān)聽的端口nodePort: 30000 # Node 監(jiān)聽的端口取值范圍 30000-32767targetPort: 80 # Pod 監(jiān)聽的端口 復(fù)制代碼
  • kubectl apply -f xxx.yaml 或者在Dashboard中創(chuàng)建

  • 觀察Dashboard面板,會發(fā)現(xiàn)多了一個名字叫g(shù)ate-svc-dev的服務(wù),提供了監(jiān)聽了30000端口

  • curl http://localhost:30000/whoami 可以看到接口已經(jīng)可以訪問了

    需要注意的是:

    • 為什么需要Service?

      Deployment等其他Controller動態(tài)創(chuàng)建和銷毀Pod來保證應(yīng)用的健壯性,也就是Pod是脆弱的,應(yīng)用是健壯的,我們不該期望Pod的健壯性。每個Pod都有自己的ClusterIp地址,當(dāng)Pod發(fā)生故障被新的Pod替代時,ClusterIp很有可能發(fā)生變化,所以如果直接讓外界訪問Pod就有問題了。

    • Service和Pod如何映射?

      通過上面的yaml定義可以看出,Service通過 label標(biāo)簽選擇器選擇對應(yīng)的一堆Pod。當(dāng)請求被發(fā)送到Service上時,Service采用了某種分配策略把流量轉(zhuǎn)發(fā)到了某一個Pod上面進(jìn)行處理。

    • Service有哪些類型?

    • ClusterIp:Service通過Cluster內(nèi)部的IP對外提供服務(wù),只有Cluster內(nèi)的節(jié)點和Pod可以訪問,這是默認(rèn)的類型。
    • NodePort: Service通過Cluster節(jié)點的靜態(tài)端口對外提供服務(wù)。Cluster外部可以通過<NodeIp>:<NodePort>訪問Service
    • LoadBalancer: cloud provider特有的對外提供服務(wù),后續(xù)線上部署時會講到
  • 滾動更新

    滾動更新是一次只更新一小部分副本,成功后再更新更多的副本,最終完成所有副本的更新。滾動更新最大的好處就是零停機,保證了業(yè)務(wù)的連續(xù)性。

  • 對本地代碼進(jìn)行一點改動
  • 編譯、打標(biāo)簽,并推送到本地倉庫中
  • echo 'Building to dits ...' tscecho 'Docker building image ...' docker build --rm -t localhost:5000/gateapp:0.0.2 .echo 'Pushing ...' docker push localhost:5000/gateappecho 'Docker list images ...' docker images 復(fù)制代碼

    這時候可以看到有0.0.1 和 0.0.2兩個版本的鏡像

  • 在Dashboard中編輯Deployment,把image: localhost:5000/gateapp:0.0.1改成image: localhost:5000/gateapp:0.0.2,點擊更新

  • 等待一段時間,再觀察所有的Pod都被更新成0.0.2版本的了,是不是很方便!

    反復(fù)執(zhí)行上面的步驟,不難發(fā)現(xiàn)更新過程中Kubernets都做了什么:

    • Deployment的鏡像被更新為0.0.2版本
    • 新創(chuàng)建了一個名稱為gate-deployment-dev-594468997c的ReplicaSet副本集,鏡像為0.0.2
    • 新的ReplicaSet增加了一個Pod
    • 舊的ReplicaSet減少了一個Pod
    • 逐漸的新的ReplicaSet接管了所有舊ReplicaSet的Pod,滾動更新完成
  • 自定義滾動更新行為

  • strategy:rollingUpdate: # 滾動更新策略maxSurge: 10% # 數(shù)值越大 滾動更新時新創(chuàng)建的副本數(shù)量越多maxUnavailble: 10% # 數(shù)值越大 滾動更新時銷毀的舊副本數(shù)量越多replicas: 2 # 運行的Pod副本數(shù)量 復(fù)制代碼- maxSurge:此參數(shù)控制滾動更新中副本總數(shù)超過DESIRED的數(shù)量或最大比例,數(shù)值越大 滾動更新時新創(chuàng)建的副本數(shù)量越多 - maxUnavailble:此參數(shù)控制滾動更新中,不可用的副本占DESIRED的最大數(shù)量或最大利弊,數(shù)值越大 滾動更新時銷毀的舊副本數(shù)量越多 復(fù)制代碼

    那如果更新過程出錯了怎么辦?請接著往下看

    健康檢查

    Kubernetes有很強大的自愈能力,默認(rèn)的實現(xiàn)方式是重啟發(fā)生故障的容器,此外用戶可以使用Liveness、 Readiness的探測機制設(shè)置更為精細(xì)的健康檢查,進(jìn)而真正實現(xiàn)零停機部署、避免部署無效的鏡像、更加安全的滾動升級

  • 編輯之前的Deployment.yaml,例如:
  • image: localhost:5000/gateapp:0.0.13readinessProbe: # 一種健康檢查決定是否加入到service 對外服務(wù)httpGet:scheme: HTTP # 支持http httpspath: /healthyport: 80 # 與你的pod端口一致initialDelaySeconds: 10 # 容器啟動多久后開始檢查periodSecods: 5 # 幾秒檢查一次 復(fù)制代碼
    • readinessProbe即是使用Readiness健康探測機制,當(dāng)檢查不通過時(例如接口返回的狀態(tài)碼不是200-400之間),Kubernetes就不會把容器添加到Service中供外界訪問,觀察Pod的狀態(tài)為Not Ready。 initialDelaySeconds是決定容器啟動多久后開始檢查,通常要比啟動時間再長一些;periodSecods是多久檢查一次,連續(xù)3次探測失敗后,Ready將變成不可用,Kubernets把這個Pod從Service中下線

    • LiveNess的配置項和Readiness的一樣,不同之處在于探測失敗后的行為。前者會重啟容器,后者會設(shè)置Pod不可用,并從Service中下線。

    • LiveNess和Readiness的探測是獨立使用的,二者沒有依賴,可以單獨使用也可以同時使用。一般情況下使用LiveNess判斷容器是否需要重啟實現(xiàn)自愈;Readiness判斷容器是否已經(jīng)準(zhǔn)備好對外提供服務(wù)。

  • 自定義健康檢查的代碼: 自定義/healthy get接口,比如數(shù)據(jù)庫連接等等
  • @Get('healthy')async checkHealthy(@Res() res: Response) {let isHealthy = false;// some code to check healthy beginisHealthy = true;// check endconst data = {isHealthy,};debug('執(zhí)行健康檢查結(jié)果 %O', data);res.status(isHealthy ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR).json(data);} 復(fù)制代碼

    一起來學(xué)習(xí)Kubernetes

    相信看完以上的文章,你也會認(rèn)為Kubernetes真的非常強大,是非常值得學(xué)習(xí)的。筆者也是小白一個,從0開始學(xué)習(xí)的,如果你也想一起,可以加入我們的群。

    總結(jié)

    以上是生活随笔為你收集整理的kubernetes学习笔记 (二):k8s初体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。