K8S 入門

簡介

Kubernetes(簡稱K8S)是開源的容器集羣管理系統,可以實現容器集羣的自動化部署、自動擴縮容、維護等功能。它既是一款容器編排工具,也是全新的基於容器技術的分佈式架構領先方案。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等功能,提高了大規模容器集羣管理的便捷性。

基本術語

  • pod:的最小調度單元,一個pod中可以有多個容器,多個容器共享網絡和存儲卷
  • service:kubernetes抽象出來一個概念,可以理解爲負載均衡器,後端接pod
  • cluster ip:service在集羣中的ip,相當負載均衡器的ip
  • ingress: 對集羣外部暴露集羣內部service的一種方式
  • nodeport: 對集羣外部暴露服務的第二種方式,跟隨service配置,讓集羣中的node節點都監聽相應的端口,可以通過node節點訪問集羣內部service
  • loadbalancer: 對集羣外部暴露集羣內部service的一種方式,一般只有在雲平臺才能使用
  • deployment:封裝了pod/replicaset,可以實現指定pod副本數量,滾動更新,擴容pod,一般一個應用(服務)一個deployment
  • statefullSet:相當於有狀態服務的deployment,重啓後,主機名和pod的名稱不會改變
  • daemonSet:在每個node節點都需要運行的pod可以使用daemonSet
  • job: 一次性任務
  • cronJob:類似於crontab定時執行任務
  • dns:kube-dns/coredns提供集羣中的dns服務,可以解析service到cluster ip,實現服務發現
  • pv:管理員用來提前創建好的存儲空間,供用戶申請使用
  • pvc:用戶用來申請存儲空間
  • storageClass:定義存儲類供pvc使用,當用戶通過pvc並指定storageClass請求pv時kubernetes可以根據storageClass動態創建pv

基礎組件介紹

K8S系統架構

  • etcd:etcd是kubernetes集羣用來存儲集羣相關數據的數據倉庫

master節點組件

master節點是主集羣中的大腦,負責處理外部的api請求,分配調度任務以及管理容器的副本數等
kube-apiserver:kubernetes對外的服務入口,其他組件通信的紐帶,服務無狀態,可水平擴容
kube-scheduler:負責pod的任務調度
kube-controller-manager:處理node節點當機情況、負責保證pod的副本數、管理endpoint,連接service和pod、爲新namespace創建默認api token和accounts

node節點組件

node節點負責幹活,執行master節點指派的相關任務

  • kubelet:負責啓動停止容器,保證容器運行。
  • kube-proxy:負責根據service生成網絡規則,生成路由規則

爲什麼需要 Pod


K8S 引入 Pod 主要基於下面兩個目的:

  • (1) 可管理性
    有些容器天生就是需要緊密聯繫,一起工作。Pod提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。Kubernetes以Pod爲最小單位進行調度、擴展、共享資源、管理生命週期。
  • (2) 通信和資源共享
    Pod中的所有容器使用同一個網絡namespace,即相同的IP地址和Port空間。它們可以直接用localhost通信。同樣的,這些容器可以共享存儲,當Kubernetes掛載volume到Pod,本質上是將volume掛載到 Pod中的每一個容器。

容器五種共享資源

  • PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID。
  • 網絡命名空間:Pod中的多個容器能夠訪問同一個IP和端口範圍。
  • IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信。
  • UTS命名空間:Pod中的多個容器共享一個主機名。
  • Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes。

爲什麼需要 Service


Deployment 可以部署多個副本,每個 Pod 都有自己的IP,外界如何訪問這些副本呢? 通過 Pod 的IP嗎? 要知道 Pod 很可能會被頻繁地銷燬和重啓,它們的IP會發生變化,用IP來訪問不太現實。這個時候,Service 就出現了。

k8s 中 Service 是一個面向微服務架構的設計,它從k8s本身解決了容器集羣的負載均衡,這些被服務標記的 Pod 一般都是通過label selector選擇的。

五種類型的 Service

ClusterIP

  • 創建一個 ClusterIP 來提供集羣內部訪問
  • 默認選項

NodePort
在每個節點 IP 上暴露一個端口(NodePort)來提供服務,集羣外部通過這種方式來訪問:<NodeIP>:<NodePort>,同時會創建一個

ClusterIP

  • 這種類型使用較多
  • 默認暴露的隨機端口範圍:30000-32767
    可以通過 nodePort 字段來顯式的指定端口

LoadBalancer
通過和 cloud provider’s load balancer 關聯使用,此時 NodePort and ClusterIP 將自動創建

ExternalName
將 service 名稱映射到一個 externalName (例如一個域名),通過 kube-dns 來提供 DNS 到 CNAME 記錄

附A:排錯技巧

  • 查看日誌 kubectl logs pod-name
  • 查看事件 kubectl describe pod-name
  • 查看docker日誌
    通過kubectl get pod -o wide找到容器運行的node節點
    在node節點上通過docker ps -a找到出錯的容器
    docker logs container-id
  • 查看kubelet及其他組件日誌:journalctl -u kubelet
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章