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

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)

分享創造快樂