硬核技能k8s初體驗

2020-09-15 心萊科技

文章來源於Dotnet Plus,作者小碼甲

Kubernetes 是一個軟體系統,使你在數以萬計的電腦節點上運行軟體時就像所有節點是以單個大節點一樣, 它將底層基礎設施抽象,這樣做同時簡化了應用開發、部署,以及對開發和運維團隊的管理。

Kubernetes集群架構

Kubernetes集群由很多節點組成,分為兩大類:

主節點 承載Kubernetes控制和管理整個集群系統的控制面板

工作節點 運行實際部署的應用

控制面板

控制集群並使它工作,包含多個組件(組件單節點或通過副本分別部署到多個主節點以確保高可用)

  • Kubernetes Api Server:客戶端Kubectl、控制面板其他組件和worker節點都需要和它通信

  • Scheduler: 調度應用

  • Controller Manager: 執行集群級別功能,如複製組件、持續跟蹤工作節點、處理節點失敗等

  • etcd:可靠的分布式資料庫存儲,能持久化集群配置

工作節點

運行容器化應用的機器,運行、監控、管理應用服務的任務由下組件完成:

  • Docker、rtk或其他容器類型

  • Kubelet與API Server通信,並管理它所在節點容器

  • Kube-Proxy:負責組件之間負載均衡網絡流量

MiniKube環境& 核心概念

本處window10+Hyper-V搭建minikube本地集群

這臺虛擬機既作為master,又作為worker,Kubectl從集群外部發起管理和控制。

對於ReplicaSet囉嗦兩句:新一代的ReplicationController; 通常不會直接創建ReplicaSet,而是在創建更高級的Deployment資源時自動創建它們。

3. Pod

Kubernetes Pod是創建/部署k8s對象中最小最簡單的單元:

由於不能將多個進程聚集在一個單獨容器,需要另外一種高級結構將容器綁定在一起,作為一個單元管理,這就是Pod背後根本原理, 一個pod中容器共享相同ip和埠空間。

4. Controller

k8s控制器是一個control loop(監控集群狀態,在被需要時或主動請求時更新集群),每個控制器都試圖將當前集群狀態移動到期望狀態

在機器人和自動化,control loop是一個非終止迴路,用於調節系統狀態,例如房間的空調。

控制器自身可以執行操作,但一般情況下,控制器會將引起連鎖反應的消息發往api server.

Kubernetes內置了一些控制器: ReplicaSet、Deployment、StatefulSets、DaemonSet、Job...

# k8s deployment檢查容器健康狀態、保證容器數量、還具備部署相關的特性, deployment是管理和縮放容器的推薦控制器
kubectl create deployment hello-kubia --iamge=luksa/kubia

這4個概念連起來就是:K8s已經定義了API元數據,Controller調度K8s系統到指定的預期狀態(這個預期狀態以K8s對象體現),在落地形式上以創建/調度Pod來承載應用。 (此4個概念還不包含NetWork相關)

開啟Kubernetes之旅

創建3實例nodejs應用

  1. 使用上面的K8s對象定義文件:kubia-rs.yaml文件:

\> kubectl create -f kubia-rs.yaml

\> kubectl get pod --show-labels=true
NAME READY STATUS RESTARTS AGE LABELS
kubia-rs-96ncq 1/1 Running 0 3m40s app=kubia
kubia-rs-h5ppz 1/1 Running 0 3m41s app=kubia
kubia-rs-x5578 1/1 Running 0 3m40s app=kubia

注意:Pod控制器中使用標籤選擇器來指定哪些Pod屬於同一組(服務也使用同樣機制)。

  1. 以上有多個Pod,創建服務對後端Pod形成負載均衡

[集群內訪問]:ClusterIP

[提供集群外訪問]:

  • nodeport:把service的port 映射到集群節點的一個埠上

  • LoadBalancer:負載均衡器會單獨分配一個ip地址並監聽後端服務的指定埠,請求的流量會通過指定的埠轉發到後端對應的服務。

  • Ingress (minikube addons先啟用ingress,智能路由)

4種網絡方式的yaml代碼如下:請通過kubectl create -f *file*.yaml命令生成對應的服務(ingress不是服務)

LoadBalancer是服務暴露到集群外或者公網上的標準方式;

Ingress 這個服務類型跟我們前面的三種服務類型不一樣,它實際上不是一種服務類型,而是類似一種集群服務入口的存在,它可以基於你配置的不同路徑或者子域名把流量路由到對應的後端服務,更像是一個「智能路由」服務。

  1. 訪問3 Pod實例的nodejs應用

ClusterIP 只能在集群內訪問,minikube ssh 進入集群,或者Hyper-V進入VM後:curl 10.100.166.197訪問

nodePort、Loadbalancer 需要使用minikube獲取本地集群url

ingress 是複雜網絡應用的常規做法

(1) hosts文件添加host到IP位址的映射(2) 通過ingress路由訪問pod

上面輸出差異體現了隨機Pod(即使連接來自同一個客戶端),SessionAffinity親和力屬性(ClientIP)可讓所有請求都指向一個Pod。

旅行總結

本文從K8s全局架構講起,力求先在你頭腦中構築宏觀思維導圖;

提出核心概念幫助全流程理解;

通過一個常見的多實例nodejs應用來實踐k8s核心功能。

https://github.com/zaozaoniao/k8s-example.git

閱讀更多

  • 使用Docker-Compose搭建高可用redis哨兵集群
  • 誰說docker-compose不能水平擴展容器、服務多實例?
  • 基於docker-compose的Gitlab CI/CD實踐&排坑指南

  • 實例解讀Docker Swarm

關注我們

更多乾貨及潮流技術

層出不窮的新技術對程式設計師來說既是挑戰也是機遇,固守自己的一畝三分地遲早落於他人,是時候跳出來看看行業內的發展新趨勢,參與2020 DAMS中國數據智能管理峰會是個不錯的選擇,其中前沿技術議題包括:

《當5G遇上金融,看電信甜橙金融如何創新?》中國電信甜橙金融技術創新中心總經理 張小虎

《智能製造的數位化基礎的設計與演進》長城汽車集團雲計算總監 張小斌

《平安銀行「傳統+網際網路」混合CMDB及運營中臺實踐》平安銀行運營開發負責人 徐大蔚

《中信銀行的DevOps實踐》中信銀行DevOps實施牽頭人 李紅濤

8月7日,一起在上海洞悉技術發展新趨勢,逆襲碼農人生吧!

相關焦點

  • 14 - MLSQL on k8s(2) - Spark on k8s
    (BasicDriverFeatureStep.scala:119) at org.apache.spark.deploy.k8s.submit.KubernetesDriverBuilder.(KubernetesDriverBuilder.scala:58) at org.apache.spark.deploy.k8s.submit.Client.run(KubernetesClientApplication.scala:100) at org.apache.spark.deploy.k8s.submit.KubernetesClientApplication.
  • k8s集群CI/CD集成介紹二:rancher搭建k8s集群環境
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。
  • k8s版本平滑升級
    容器化技術興起後,k8s無疑成為了容器編排技術的事實標準。各行各業軟體領域的廣泛應用,進一步促進了k8s的快速發展,對應版本的更新也層出不窮。實際項目使用過程中,可能會遇到框架層面的bug在新版本中得到修復,高版本的一些特性剛好滿足新的業務需求,這時候就需要在原有k8s集群上進行升級。如何快速、平滑的實現k8s的版本更新?
  • k8s存儲系統介紹
    在k8s集群中,運行服務離不開持久化地將數據保存起來,這就涉及到k8s的存儲系統了。k8s的存儲系統在運行機制上基於docker原生的volume機制,本質上都是先將存儲掛在到主機上,經過處理後,通過docker的volume機制掛載到容器中。但在存儲實現上,k8s自己包裝了一套volume plugins,用於對接各種存儲的後端實現。
  • K8S(Kubernetes)是什麼?
    k8s是什麼呢?k8s是一個編排容器的工具,其實也是管理應用的全生命周期的一個工具,從創建應用,應用的部署,應用提供服務,擴容縮容應用,應用更新,都非常的方便,而且可以做到故障自愈,例如一個伺服器掛了,可以自動將這個伺服器上的服務調度到另外一個主機上進行運行,無需進行人工幹涉。
  • k8s三部曲第一章第3節 k8s架構基本原理
    borg系統2)架構* 一個master節點 * api server k8s網關,所有的指令請求都必須經過api server * scheduler 調度器,使用調度算法,把請求資源調度某一個node節點 * controller 控制器,維護k8s資源對象 * etcd 存儲資源對象* node節點
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-命令行操作k8s太麻煩?
    前面幾篇中,查看和操作k8s的資源都是通過命令行操作,每次查詢一個資源的狀態都需要手動執行命令。這種方式。。。。多少有點。。。。。不方便。而且,k8s不光面向運維,有時候開發也需要關注集群中某些服務的狀態,做一些簡單的配置。
  • 用rancher2分分鐘搭建k8s集群
    Kubernetes簡單介紹先簡單介紹下Kubernetes,簡稱k8s。的安全相信現在很多公司和團隊都都很想用k8s來提升devops能力。但是,相信我安裝k8s是一個巨大的工程,需要你對它的原理,概念,設計理念都有一定的了解,要不然安裝過程中肯定是巨坑無比,但是我只是想試用下k8s,體驗下它的魅力,而不是未開始就陷入安裝的大坑中,那需要怎麼辦呢?Rancher介紹> rancher真是這樣的神器。
  • k8s集群搭建
    Kubernetes集群中5、部署Dashboard Web頁面,可視化查看Kubernetes資源環境準備安裝3臺虛擬機分別是k8s-master、k8s-node1、k8s-node2啟動3臺虛擬機,並設置好網絡設置linux環境(三個節點都執行)關閉防火牆systemctl stop firewalldsystemctl
  • 乾貨|帶您了解k8s
    二、k8s介紹k8s是2014年google對外開放的。Borg是谷歌內部非常棒的容器編排工具,k8s就是站在Borg基礎上開發出來的,所以k8s從一出世,就吸引了太多太多人的關注,直到今天為止,它也確實沒有辜負人們的期望。2017年是容器技術最輝煌的一年,AWS、微軟的雲技術、阿里雲等雲廠商開始對外宣布,他們支持k8s。
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-k8s安裝與部署
    上一章我們介紹了k8s的核心組件,了解了這些,我們就可以開始k8s的安裝和部署了。來吧,動手吧!準備好兩伺服器(系統是centos7.3),分別作為matser和node,如下:要讓k8s能夠管理我們的集群,需要在所有的節點上面分別安裝k8s的組件。在安裝之前,需要在兩臺節點上做如下的操作。
  • k8s快速通關秘籍(1)
    k8s越來越流行,已經成為容器管理與調度編排的首選平臺和事實標準,開發,測試,運維等技術人員,需要快速的學習和掌握k8s相關知識,通關秘籍系列就從k8s架構和組件,k8s的安裝部署,k8s的日常運維等方面介紹k8s,使零基礎的小白技術人員,迅速拿到k8s的通關秘籍。
  • 一句話說明,為什麼k8s還取代不了OpenStack
    如今很容易將Kubernetes(以下簡寫為k8s)視為OpenStack這樣的雲平臺的破壞者,許多人也都認為k8s會取代OpenStack,真的是這樣嗎?事實上,只要k8s和容器一天沒有消滅虛擬機,這種觀點就是不成立的。這可能是對k8s和虛擬機的最精闢的判斷了。
  • go| 使用go連接k8s集群的三種方式
    1.服務運行在k8s集群外部,連接k8s集群,讀取config文件,默認在~/.kube/configpackage mainimport ( "flag" "log" "path/filepath" "k8s.io/client-go
  • 詳解kubeadm安裝k8s集群常見問題
    set-hostname k8s-node1hostnamectl set-hostname k8s-node2或者修改vi /etc/hostname修改hostsvi /etc/hosts192.168.143.130
  • 使用kubeadm的方式搭建K8S高可用集群
    為例hostnamectl set-hostname k8s-master01(1)、配置主機hosts映射10.1.10.100 k8s-master0110.1.10.101 k8s-master0210.1.10.102 k8s-master0310.1.10.103&
  • k8s集群CI&CD集成介紹四:Jenkins部署應用到rancher集群
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • kubeadm安裝kubernetes/k8s的詳細筆記(包括各種坑和注意事項)
    上一篇文章(),筆者簡單的介紹了k8s已經用rancher來快速安裝k8s集群,非常簡單,因為中間的安裝過程極其中的細節rancher都幫我們封裝好了,但是建議對於k8s的初學者不要通過這樣的方式去學習k8s,當然不是說rancher封裝的不好,相反是rancher做的太好,封裝的太好了,把安裝細節,把k8s涉及到的基本概念,設計思想都隱藏掉了,對應初學者去理解k8s是不好的。
  • 搭建最新的k8s集群
    我更新了鏡像的標籤名稱 master節點初始化kubeadm init --kubernetes-version=v1.18.6 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swapkubernetes-version: 當前k8s
  • 樹莓派centos-arm安裝k8s編譯
    本文演示如何在centos-arm系統上進行編譯k8s1.安裝k8s的安裝環境:golang# wget -c https://dl.google.com/go/go1.11.4.linux-arm64.tar.gz -P /opt/package/wget https://golang.google.cn/doc/install?