歡迎光臨
每天分享高質量文章

Kubernetes基礎介紹

之前我一直想學習Kubernetes,因為它聽起來很有意思(如果你是希臘人,你會覺得這個名字很有問題),但我從來沒有機會,因為我沒有任何東西需要執行在叢集中。而最近,我的工作中開始逐步涉及Kubernetes相關的事情,所以這次我抓住機會,開始查資料,但後來我發現目前所有的資料(包括官方教程)都過於冗長,結構也不合理,這讓我一開始有點沮喪。
經過幾天的研究,我開始逐步理解Kubernetes的核心理念,並且把他部署到了生產環境中。因為我的簡歷現在說自己是個“Kubernetes專家”,一個想法立刻誕生了:為什麼不把我對這個系統的寬泛理解以及我已經耗費了幾個小時的研究所收集的知識讓更多人看到?雖然我無法說服自己不應該再寫另一篇漫無目的的文章,但是我很快就明白了:
這就是那篇文章。
我在現有文章中遇到的主要問題是,在深入研究具體細節之前,我找不到的任何內容總結了這些元件是什麼以及它們如何組合起來的高階概述。 而這種高屋建瓴的呈現方式是我學習最好的方式。我是以這種方式來寫的,希望它也適合你。如果你知道任何描述了Kubernetes如何工作,而且讓人容易理解的專家級的文章/教程,請不要告訴我,因為你在我需要你的時候你在哪裡,現在我寫了我的文章而你卻沒有及早把它拿出來。
另外請記住,我實際上只學習了Kubernetes一個星期左右,所以學得不會非常深入,有些可能是不準確的,希望沒有什麼錯誤,這裡的資訊應該足夠讓你達到執行簡單叢集的程度。
話雖如此,最後我發現Kubernetes中的概念還是非常簡單的,雖然我確信有很多東西我還不知道。但是,我知道的事情就足以建立一個叢集並讓我們的應用在其上執行,而且我很確定它們足以讓大多數人知道如何開始。
基本概念

我們需要做的第一件事是詳細介紹Kubernetes的各個部分:
  • 控制平面(Control plane):顧名思義,這是控制其他一切的部分,這也是我一無所知的部分,因為我們只是向亞馬遜付費,讓亞馬遜幫我們處理這部分。我的理解是,這是最好的決定,除非你是谷歌,否則你應該付費給一些公司,讓他們為你管理。

  • 節點(Nodes):節點本質上就是一臺伺服器,就像您付費的物理機worker一樣。 這是所有程式碼部署的地方,將裸伺服器變成節點的方法是在其上安裝Docker,kubelet,kube-proxy和其他一些東西。本文假設您的群集中已有一些worker。

  • 容器集(Pod):Pod是容器集合。 這是您的程式碼所在的位置,通常每個容器都有一個Pod,儘管您可能希望將一些密切相關的服務放在同一個Pod中。 Pod在單個節點上執行(但是一個節點可以執行許多Pod),這意味著Pod中的所有容器將具有相同的IP地址,並且它們可以透過連線到localhost上的彼此埠來相互通訊。Pod在部署後無法更新,只能刪除或替換它們。

  • 部署(Deployments): Deployment是您將Pod實際部署到群集的方式。 您可以在沒有Deployment的情況下執行Pod,但如果沒有Deployment,則無法輕鬆指定所需的副本數量,在失敗時自動重新部署Pod,回滾到早期狀態等。Deployment使程式碼生命週期管理變得更容易,並且您可以使用它來使Docker映象在Kubernetes上執行。

  • 服務(Service):服務允許您從一個Pod開啟埠到其他Pod,並指定一個Pod的DNS名稱,以便能夠查詢並連線到群集中的其他Pod。

  • 入口(Ingress):Ingresses是你如何告訴你的Ingress控制器(通常是像Traefik這樣的web server)向外界暴露什麼,以及在哪個路徑或主機名上。 入口將https://some-hostname.your-cluster.your-company.com對映到將實際應答該請求的Pod。本教程也假設您已經配置了入口,雖然設定Traefik來做到這一點不應該非常困難(在用他們的教程時請使用Deployment方法)。

所有這些都可以使用命令列的kubectl建立,或者更安全地透過YAML檔案建立,該檔案將包含您要部署的內容的定義和詳細資訊(然後執行kubectl apply -f )。
概括地講,您把容器放入pods中,這些pods將由deployment建立和部署,其網路將由service處理,並新增ingress以便外部世界可以訪問您的伺服器。
讓我們逐個介紹這些部分,看看它們的YAML配置是什麼樣的。
The Pod

讓我們看一下將在容器中執行Redis映象的pod的YAML配置。 請記住,Pod並不是永續性的,所以你幾乎不會直接使用它。 相反,您將使用deployment間接部署Pod,我們將在下麵介紹。
以下配置示例僅供您進行修改。 你只需要看看它,然後繼續閱讀,不要停下來驚嘆它的美麗。
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-name
spec:
  containers:
  - name: my-redis
    image: redis
    ports:
    - containerPort: 6379

正如您所看到的,它非常簡單,您添加了一堆Kubernetes特定的東西,每個都只是複製貼上,然後您宣告此配置是為Pod,給它一個名稱,指定在其中執行的容器和他們監聽的埠,請刪除整個檔案吧,你已經準備好了!
Kubernetes官方檔案中提供了更多關於Pod[1]的資訊。
The Deployment

以下是您實際執行上述Pod的方式,即使用deployment。 請記住,您根本不需要關註上面的Pod配置,我們將在deployment裡重新定義它。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment-name
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: my-redis-pod
    spec:
      containers:
      - name: my-redis
        image: redis
        ports:
        - containerPort: 6379

您會註意到這主要是上面的Pod配置,但有一些額外的配置,如副本(replica)等。這些定義了deployment的名稱以及我們要部署的副本數量。 更改副本數量,將會部署更多template部分中指定的Pod。
Kubernetes官方檔案中提供了更多關於Deployments[2]的資訊。
The Service

現在我們已經部署了一個Pod,我們需要將其埠暴露給叢集的其餘部分。 部署中的containerPort指令暴露了Docker埠,但實際上並不轉發主機上的埠,因此多個Pod(不是同一Pod中的容器)可以使用相同的埠而不會發生衝突。
要將上面的埠實際暴露給叢集上執行的其他Pod,我們需要為它建立一個Service。 這將建立轉髮埠所需的規則,併為我們提供DNS條目,我們可以使用該條目來解析該Pod的IP。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  ports:
  - port: 6379
    name: redis-port
    targetPort: 6379
    protocol: TCP
  selector:
    app: my-redis-pod

這會將Redis埠暴露給叢集中的其他Pod,可以透過my-service:6379連線它。
要部署你的應用中更多部分,只需將另一個deployment和關聯的Service新增到群集即可。 您可以使用與上面的Redis完全相同的方式部署主應用程式服務。
The Ingress

最後,我們可以使用Ingress將我們的服務暴露給網際網路。 這裡是使用Traefik的一個例子,雖然您可能實際上並不想將Redis暴露給外面的世界,但同樣的方法適用於您自己的應用程式。
apiVersion: extensions/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: redis.yourdomain.com
    http:
      paths:
      - backend:
          serviceName: my-service
          servicePort: 6379

這一節配置是告訴Traefik你希望所有名為redis.yourdomain.com的主機上的流量都轉發到我的服務埠6379。據我所知,這隻是針對Traefik的配置。 在應用配置後,Pod將透過redis.yourdomain.com上的Traefik暴露到網際網路。
結語

我希望這篇文章對初學者有用。這篇文章很簡短,因為Kubernetes的基礎很短,但我們設法涵蓋瞭如何以最小的麻煩來執行服務。
如果帖子中有任何不準確或錯誤(或者如果您有任何要新增的內容),請透過Twitter[3]或tooting[4]告訴我。
現在你應該懂Kubernetes是什麼了!
相關連結:
  1. https://kubernetes.io/docs/concepts/workloads/pods/pod/

  2. https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

  3. https://twitter.com/intent/user?screen_name=Stavros

  4. https://mastodon.host/@stavros

原文連結:https://www.stavros.io/posts/kubernetes-101/

Kubernetes應用實戰培訓

Kubernetes應用實戰培訓將於2018年10月19日在上海開課,3天時間帶你係統學習Kubernetes本次培訓包括:容器特性、映象、網路;Docker特性、架構、元件、概念、Runtime;Docker安全;Docker實踐;Kubernetes架構、核心元件、基本功能;Kubernetes設計理念、架構設計、基本功能、常用物件、設計原則;Kubernetes的實踐、執行時、網路、外掛已經落地經驗;微服務架構、DevOps等,點選下方圖片檢視詳情。

贊(0)

分享創造快樂