一、kubernetes源碼簡介
kubernetes是一個開源的容器編排系統,為容器化應用提供自動化部署、擴展和管理的平台。其具有高度的可移植性,支持多種容器運行時系統,如docker和CRI-O。kubernetes是基於容器技術的,它將多個容器組合到一起構成一個應用程序,並根據容器化方式運行和擴展。在kubernetes中,所有的操作都是通過API Server實現的,而其它組件如kubelet、kube-proxy、etcd等也都是通過API Server協作工作的。
二、kubernetes源碼的模塊結構
kubernetes源碼的具有以下模塊結構:
pkg/ ├── api │ └── ... ├── apierrors │ └── ... ├── apiserver │ └── ... ├── apimachinery │ └── ... ├── client │ └── ... ├── cloudprovider │ └── ... ├── controller │ └── ... ├── kubelet │ └── ... ├── kubectl │ └── ... ├── proxy │ └── ... ├── scheduler │ └── ...
其中,pkg目錄包含了kubernetes的所有代碼模塊,每個模塊下可能會有多個子目錄,如api、apierrors、apiserver、apimachinery、client等,代表了kubernetes源碼中的各個部分,例如 kubelet部分負責機器上的Pod管理。
三、源碼解析——API Server
API Server是kubernetes的核心組件之一,所有的kubernetes組件都是通過API Server進行通信和協作的。API Server主要有以下3個核心組件:
- RESTful API Server:提供RESTful API,用於管理kubernetes對象。
- etcd:提供數據存儲。
- 認證和授權組件:提供認證和授權功能,保證kubernetes的安全性。
1、RESTful API Server
RESTful API是一種使用HTTP協議的web服務。kubernetes採用RESTful協議作為對象的API格式。其API以JSON格式交換對象的配置和狀態。API Server通過自定義的API對象,維護了kubernetes的所有狀態信息。
下面給出獲取Node狀態的HTTP URL示例:
GET /api/v1/nodes/ HTTP/1.1 Host: kubernetes.default.svc Accept: application/json Authorization: Bearer
2、etcd
etcd是一種分散式的鍵值存儲系統,用於存儲kubernetes的所有狀態數據。kubernetes使用etcd來存儲集群中的所有數據,包括了Pod、Node、Service、關係等等。
下面給出一個在etcd中查找Pod狀態的主鍵示例:
/pods/default/nginx-1-db234#23de3
3、認證和授權組件
kubernetes支持多種認證和授權方法,如x509認證,token認證和HTTP basic認證。其中,最常用的是token認證。
下面是一個使用token認證的訪問API Server的示例:
GET /api/v1/nodes/ HTTP/1.1 Host: kubernetes.default.svc Accept: application/json Authorization: Bearer
四、源碼解析——Scheduler
Scheduler是kubernetes的核心組件之一,其主要功能是進行Pod調度,將Pod分配到合適的Node上運行。Scheduler採用的是Kube-scheduler的演算法,實現了一種統一的調度框架。
調度過程的主要步驟如下:
- 1、調用extender(如Federation或者第三方擴展)對調度演算法進行補充。
- 2、調度演算法計算合適的Node並打標記。
- 3、調用插件進行預選和剔除。
- 4、選擇一個Node並返回給調用方。
下面是一個scheduler.go文件的示例:
package scheduler
type Scheduler struct {
}
func New() *Scheduler {
return &Scheduler{}
}
type ScheduleResult struct {
PodName string
NodeName string
}
func (s *Scheduler) Schedule(pod *api.Pod, nodeList *api.NodeList) (*ScheduleResult, error) {
// 進行調度計算
return &ScheduleResult{}, nil
}
五、源碼解析——kubelet
kubelet是kubernetes的核心組件之一,其主要作用是將Pod轉換為一個容器(容器包括docker、CRI-O等)來運行,並監測容器的健康狀況。
下面是一個kubelet.go文件的示例:
package kubelet
import (
"context"
"time"
"github.com/spf13/pflag"
"k8s.io/kubernetes/cmd/kubelet/app/options"
"k8s.io/kubernetes/pkg/kubelet"
)
// Kublet 啟動參數
type KubletConfig struct {
ConfigFile string
}
// Kublet 啟動
func StartKubelet(cfg *KubletConfig) error {
// 解析參數
// ...
// 設置默認Kubelet配置參數
// ...
// 創建KubeletServer,並啟動
// ...
kcfg, err := kubelet.NewKubeletConfigFromFile(cfg.ConfigFile)
if err != nil {
return err
}
klet, err := kubelet.NewMainKubelet(
kcfg,
kubelet.GetHostname(kcfg.NodeStatusUpdateFrequency.Duration),
kubelet.ProbeVolumePlugins(),
)
if err != nil {
return err
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
kubelet.SetSignal(ctx, klet)
err = klet.Run(ctx)
if err != nil {
return err
}
return nil
}
六、源碼解析——kubeadm
kubeadm是kubernetes的組件之一,其主要作用是用於在多個Node上部署kubernetes集群。它提供了一種初始化Kubernetes控制平面的方式,其驅動程序實現kubeadm init和kubeadm join.
下面是一個kubeadm.go文件的示例:
package kubeadm
import (
"context"
"github.com/spf13/cobra"
)
func NewRootCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "kubeadm",
Short: "kubernetes集群初始化部署",
Long: "",
}
cmd.AddCommand(NewCmdInit(), NewCmdJoin())
return cmd
}
func NewCmdInit() *cobra.Command {
cmd := &cobra.Command{
Use: "init",
Short: "初始化kubeadm安裝",
Long: "",
Args: cobra.ExactArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return runInit(context.Background())
},
}
return cmd
}
func NewCmdJoin() *cobra.Command {
cmd := &cobra.Command{
Use: "join",
Short: "加入kubernetes集群",
Long: "",
Args: cobra.ExactArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return runJoin(context.Background())
},
}
return cmd
}
func runInit(ctx context.Context) error {
// ...
return nil
}
func runJoin(ctx context.Context) error {
// ...
return nil
}
七、總結
本文主要對kubernetes源碼進行了相應的剖析,從kubernetes源碼的模塊結構、API Server、Scheduler、kubelet以及kubeadm等多個方面進行了詳細的闡述。通過對kubernetes源碼的深入學習,我們可以更好地理解kubernetes的工作原理和機制,並進行相應的二次開發和優化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183678.html
微信掃一掃
支付寶掃一掃