这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

概述

k8s 源码学习的概述

1 - 组件

k8s 的组件

有哪些组件?

如何得知 k8s 有哪些组件?

看 k8s 进程

在 k8s 的 master 上,用 ps 命令查看 k8s 相关的进程:

ps -ef | grep -v kworker | grep -v nfs | grep -v nginx | grep -v pause | grep -v containerd | grep -v smbd | grep -v cpuhd | grep -v sshd  | grep -v /usr/bin | grep -v /usr/sbin | grep -v scsi | grep -v /sbin

排除和k8s无关的进程,能看到:

root        1388    1299  0 May13 ?        00:04:25 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true
root        1398    1297  0 May13 ?        00:17:47 kube-apiserver --advertise-address=192.168.3.112 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
root        1399    1295  0 May13 ?        00:08:55 etcd --advertise-client-urls=https://192.168.3.112:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --experimental-initial-corrupt-check=true --experimental-watch-progress-notify-interval=5s --initial-advertise-peer-urls=https://192.168.3.112:2380 --initial-cluster=k8s112=https://192.168.3.112:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.3.112:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.3.112:2380 --name=k8s112 --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
root        1401    1293  0 May13 ?        00:05:33 kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true
root        3114    2988  0 May13 ?        00:00:07 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=k8s112
root        5283    5118  0 May13 ?        00:00:39 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
1001        8052    7828  0 May13 ?        00:00:06 /dashboard-auth
65532       8054    7829  0 May13 ?        00:00:51 /coredns -conf /etc/coredns/Corefile
1001        8069    7948  0 May13 ?        00:00:06 /dashboard-api --insecure-bind-address=0.0.0.0 --bind-address=0.0.0.0 --namespace=kubernetes-dashboard --metrics-scraper-service-name=kubernetes-dashboard-metrics-scraper
1001        8070    7940  0 May13 ?        00:00:05 /dashboard-metrics-scraper
sky         8072    7968  0 May13 ?        00:01:29 /metrics-server --cert-dir=/tmp --secure-port=10250 --kubelet-preferred-address-types=InternalIP --kubelet-insecure-tls --kubelet-use-node-status-port --metric-resolution=15s
1001        8073    7860  0 May13 ?        00:00:05 /dashboard-web --insecure-bind-address=0.0.0.0 --bind-address=0.0.0.0 --namespace=kubernetes-dashboard --settings-config-map-name=kubernetes-dashboard-web-settings
65532       8083    7937  0 May13 ?        00:00:53 /coredns -conf /etc/coredns/Corefile

这里面直接和k8s相关的进程有:

  • coredns
  • etcd
  • kube-controller-manager
  • kube-proxy
  • kube-apiserver
  • kube-scheduler

k8s 扩展之一的 dashboard:

  • dashboard-api
  • dashboard-metrics-scraper
  • dashboard-web
  • dashboard-auth

k8s 扩展之一的 metrics-server:

  • metrics-server

看 k8s build 的产物

clone k8s 的源码:

https://github.com/kubernetes/kubernetes/

然后 build 一下:

git clone https://github.com/kubernetes/kubernetes
cd kubernetes
make

可以看到构建的日志:

+++ [0514 21:34:35] Building go targets for linux/amd64
    github.com/onsi/ginkgo/v2/ginkgo (non-static)
    k8s.io/apiextensions-apiserver (static)
    k8s.io/component-base/logs/kube-log-runner (static)
    k8s.io/kube-aggregator (static)
    k8s.io/kubernetes/cluster/gce/gci/mounter (static)
    k8s.io/kubernetes/cmd/kubeadm (static)
    k8s.io/kubernetes/cmd/kube-apiserver (static)
    k8s.io/kubernetes/cmd/kube-controller-manager (static)
    k8s.io/kubernetes/cmd/kubectl (static)
    k8s.io/kubernetes/cmd/kubectl-convert (static)
    k8s.io/kubernetes/cmd/kubelet (non-static)
    k8s.io/kubernetes/cmd/kubemark (static)
    k8s.io/kubernetes/cmd/kube-proxy (static)
    k8s.io/kubernetes/cmd/kube-scheduler (static)
    k8s.io/kubernetes/test/conformance/image/go-runner (non-static)
    k8s.io/kubernetes/test/e2e/e2e.test (test)
    k8s.io/kubernetes/test/e2e_node/e2e_node.test (test)

构建的产物在 _output/bin 目录下,可以看到:

$ pwd
/home/sky/work/code/kubernetes/kubernetes/_output/bin

$ ls -la
total 1069404
drwxrwxr-x 2 sky sky      4096 May 14 21:34 .
drwxrwxr-x 3 sky sky      4096 May 14 20:50 ..
-rwxr-xr-x 1 sky sky  75759800 May 14 21:34 apiextensions-apiserver
-rwxr-xr-x 1 sky sky 117823416 May 14 21:34 e2e_node.test
-rwxr-xr-x 1 sky sky 126209360 May 14 21:34 e2e.test
-rwxr-xr-x 1 sky sky  10580260 May 14 21:34 ginkgo
-rwxr-xr-x 1 sky sky   2056484 May 14 21:34 go-runner
-rwxr-xr-x 1 sky sky  74133688 May 14 21:34 kubeadm
-rwxr-xr-x 1 sky sky  73158840 May 14 21:34 kube-aggregator
-rwxr-xr-x 1 sky sky  98341048 May 14 21:34 kube-apiserver
-rwxr-xr-x 1 sky sky  91111608 May 14 21:34 kube-controller-manager
-rwxr-xr-x 1 sky sky  59900088 May 14 21:34 kubectl
-rwxr-xr-x 1 sky sky  58917048 May 14 21:34 kubectl-convert
-rwxr-xr-x 1 sky sky  82080036 May 14 21:34 kubelet
-rwxr-xr-x 1 sky sky   1839288 May 14 21:34 kube-log-runner
-rwxr-xr-x 1 sky sky  80322744 May 14 21:34 kubemark
-rwxr-xr-x 1 sky sky  70992056 May 14 21:34 kube-proxy
-rwxr-xr-x 1 sky sky  70004920 May 14 21:34 kube-scheduler
-rwxr-xr-x 1 sky sky   1757368 May 14 21:34 mounter

可以看到,k8s 的组件有:

  • apiextensions-apiserver
  • kubeadm
  • kube-aggregator
  • kube-apiserver
  • kube-controller-manager
  • kubectl
  • kubectl-convert
  • kubelet
  • kube-log-runner
  • kubemark
  • kube-proxy
  • kube-scheduler

2 - 代码仓库

k8s 的代码仓库

kubernetes/kubernetes

https://github.com/kubernetes/kubernetes

从它的 go.mod 文件可以看到,它依赖了大量的 k8s 的组件:

	k8s.io/api v0.0.0
	k8s.io/apiextensions-apiserver v0.0.0
	k8s.io/apimachinery v0.0.0
	k8s.io/apiserver v0.0.0
	k8s.io/cli-runtime v0.0.0
	k8s.io/client-go v0.0.0
	k8s.io/cloud-provider v0.0.0
	k8s.io/cluster-bootstrap v0.0.0
	k8s.io/code-generator v0.0.0
	k8s.io/component-base v0.0.0
	k8s.io/component-helpers v0.0.0
	k8s.io/controller-manager v0.0.0
	k8s.io/cri-api v0.0.0
	k8s.io/cri-client v0.0.0
	k8s.io/csi-translation-lib v0.0.0
	k8s.io/dynamic-resource-allocation v0.0.0
	k8s.io/endpointslice v0.0.0
	k8s.io/externaljwt v0.0.0
	k8s.io/klog/v2 v2.130.1
	k8s.io/kms v0.0.0
	k8s.io/kube-aggregator v0.0.0
	k8s.io/kube-controller-manager v0.0.0
	k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
	k8s.io/kube-proxy v0.0.0
	k8s.io/kube-scheduler v0.0.0
	k8s.io/kubectl v0.0.0
	k8s.io/kubelet v0.0.0
	k8s.io/metrics v0.0.0
	k8s.io/mount-utils v0.0.0
	k8s.io/pod-security-admission v0.0.0
	k8s.io/sample-apiserver v0.0.0
	k8s.io/system-validators v1.9.1
	k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979

而这些又被 replace 到本地的 ./staging/src/k8s.io/ 目录下:

replace (
	k8s.io/api => ./staging/src/k8s.io/api
	k8s.io/apiextensions-apiserver => ./staging/src/k8s.io/apiextensions-apiserver
	k8s.io/apimachinery => ./staging/src/k8s.io/apimachinery
	k8s.io/apiserver => ./staging/src/k8s.io/apiserver
	k8s.io/cli-runtime => ./staging/src/k8s.io/cli-runtime
	k8s.io/client-go => ./staging/src/k8s.io/client-go
	k8s.io/cloud-provider => ./staging/src/k8s.io/cloud-provider
	k8s.io/cluster-bootstrap => ./staging/src/k8s.io/cluster-bootstrap
	k8s.io/code-generator => ./staging/src/k8s.io/code-generator
	k8s.io/component-base => ./staging/src/k8s.io/component-base
	k8s.io/component-helpers => ./staging/src/k8s.io/component-helpers
	k8s.io/controller-manager => ./staging/src/k8s.io/controller-manager
	k8s.io/cri-api => ./staging/src/k8s.io/cri-api
	k8s.io/cri-client => ./staging/src/k8s.io/cri-client
	k8s.io/csi-translation-lib => ./staging/src/k8s.io/csi-translation-lib
	k8s.io/dynamic-resource-allocation => ./staging/src/k8s.io/dynamic-resource-allocation
	k8s.io/endpointslice => ./staging/src/k8s.io/endpointslice
	k8s.io/externaljwt => ./staging/src/k8s.io/externaljwt
	k8s.io/kms => ./staging/src/k8s.io/kms
	k8s.io/kube-aggregator => ./staging/src/k8s.io/kube-aggregator
	k8s.io/kube-controller-manager => ./staging/src/k8s.io/kube-controller-manager
	k8s.io/kube-proxy => ./staging/src/k8s.io/kube-proxy
	k8s.io/kube-scheduler => ./staging/src/k8s.io/kube-scheduler
	k8s.io/kubectl => ./staging/src/k8s.io/kubectl
	k8s.io/kubelet => ./staging/src/k8s.io/kubelet
	k8s.io/metrics => ./staging/src/k8s.io/metrics
	k8s.io/mount-utils => ./staging/src/k8s.io/mount-utils
	k8s.io/pod-security-admission => ./staging/src/k8s.io/pod-security-admission
)

3 - API

k8s 的API

k8s 的 API:

  • pod
  • replicationset
  • service
  • deployment
  • job
  • cronjob
  • statefulset
  • daemonset
  • cronjob