国内环境下 Kubernetes 源码编译及运行

本文详细介绍如何在本地环境中编译Kubernetes源码,包括二进制文件和Docker镜像的编译过程,以及如何使用编译后的产物。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、kubernete 源码编译介绍

我们知道,kubernetes 源码编译,分为本地二进制可执行文件编译和 docker 镜像编译两种。之前演示的 minikube 方式kubeadm 方式安装,都是基于第二种 docker 镜像方式运行,当然也可以基于二进制文件方式安装,不管哪种方式,都是直接使用并不需要修改任何 k8s 代码。不过当我们有特殊需求时,比如需要修改 kube-proxy 对 service 的代理逻辑,kube-scheduler 对 pod 的调度逻辑等,这个时候就需要修改 k8s 源码了,为了让修改的代码生效,就需要对 k8s 代码执行编译了。当然 k8s 也为我们提供了 CRD 等可扩展插件,在不修改 k8s 源码的基础上实现自定义功能,但是对于一些底层逻辑策略需要修改的话,还是办不到的。

2、环境、软件准备

本次演示环境,我是在虚拟机 Linux Centos7 系统上操作,以下是安装的软件及版本:

  • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
  • Linux: CentOS Linux release 7.3.1611 (Core)
  • Docker: 18.06.1-ce
  • Golang: go1.11.5
  • Kubernetes: v1.13.5

注意:因为 kubernetes 源码是由 go 语言编写的,所以要编译其源码,需要安装 go 环境,若我们想基于 docker 镜像编译 kubernetes 的话,那么还需要安装 docker 环境。

3、安装依赖 golang、docker

3.1、安装 golang

注意:kubernetes 1.13 版本需要依赖的 go 版本 >= 1.11.1,所以安装时需选择该版本以上,否则下边编译时会报错终止,提示需要升级 go 版本,这里提供两种方式安装 golang 环境。

一、直接下载源码安装(注意此方式需要机器网络可以越过墙)

$ cd /opt && wget -c https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.11.4.linux-amd64.tar.gz 
$ echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
$ source /etc/profile

二、通过 rpm 包 yum 安装

$ cd /opt && wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/g/golang-1.11.5-1.el7.x86_64.rpm
$ yum -y install golang-1.11.5-1.el7.x86_64.rpm

安装完毕后,执行 go version 能输出对应的版本号,说明安装没有问题。最后,为了方便编译,最好配置一下 GOPATH 作为 go 执行的工作路径。

$ echo "GOPATH=/root/go" >> /etc/profile
$ source /etc/profile

3.2、安装 docker

docker 安装非常方便,针对自己系统参照 Docker 官网文档 安装即可,这里简单操作一下吧!

一键式安装方式:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

rpm 包 yum 安装方式:

$ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm
$ yum -y install docker-ce-18.06.1.ce-3.el7.x86_64.rpm
$ systemctl enable docker
$ systemctl start docker

yum 源安装方式:

$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce docker-ce-cli containerd.io
$ systemctl enable docker
$ systemctl start docker

安装完毕后,执行 docker -v 命令能输出对应版本号,说明安装没问题。

4、二进制可执行文件编译 kubernetes

开始执行编译前,我们需要将 kubernetes 源码 拉取到本地 GOPATH 工作路径,并指定好 release-1.13 稳定分支。

$ mkdir -p $GOPATH/src/k8s.io && cd $GOPATH/src/k8s.io
$ git clone  https://github.com/kubernetes/kubernetes -b release-1.13
$ cd kubernetes

我们从 kubernetes/hack/lib/golang.sh 代码中可以看到,该脚本会检测当前系统环境来安装对应的必要的服务,默认不指定 KUBE_BUILD_PLATFORMS(当前构建平台环境类型)的话,它会分别编译多种环境,编译时间很长,而且没有必要。这里我们可以直接修改文件中 KUBE_SERVER_PLATFORMS KUBE_NODE_PLATFORMS KUBE_CLIENT_PLATFORMS KUBE_TEST_PLATFORMS 配置,只保留当前系统对应环境,例如我们的系统环境为 linux/amd64。另一种方式就是在编译时,直接指定 KUBE_BUILD_PLATFORMS 参数即可。编译命令如下:

$ KUBE_BUILD_PLATFORMS=linux/amd64 make all GOFLAGS=-v GOGCFLAGS="-N -l"

对参数简单说明一下:

  • KUBE_BUILD_PLATFORMS=linux/amd64 指定当前编译平台环境类型为 linux/amd64
  • make all 表示在本地环境中编译所有组件。
  • GOFLAGS=-v 编译参数,开启 verbose 日志。
  • GOGCFLAGS="-N -l" 编译参数,禁止编译优化和内联,减小可执行程序大小。

注意:执行以上命令时,需要机器可用内存在 4G 左右,否则编译时会报内存不够错误。若我们只想编译某个组件,例如,只想编译 kube-apiserver ,那么可以执行 make WHAT=cmd/kube-apiserver 命令。这里可选组件有很多,详细可参考 kubernetes/cmd/ 目录下所有组件。

稍等片刻,全部组件编译耗时较长,执行完毕后,二进制可执行文件默认生成到 kubernetes/_output/bin 目录下。

$ ll _output/bin/
total 1372584
-rwxr-xr-x 1 root root  39777728 Feb 20 16:32 apiextensions-apiserver
-rwxr-xr-x 1 root root  89522240 Feb 20 16:32 cloud-controller-manager
-rwxr-xr-x 1 root root   5800256 Feb 20 16:09 conversion-gen
-rwxr-xr-x 1 root root   5791968 Feb 20 16:08 deepcopy-gen
-rwxr-xr-x 1 root root   5783808 Feb 20 16:09 defaulter-gen
-rwxr-xr-x 1 root root  38382720 Feb 20 16:32 gendocs
-rwxr-xr-x 1 root root 174569288 Feb 20 16:32 genkubedocs
-rwxr-xr-x 1 root root 181003752 Feb 20 16:32 genman
-rwxr-xr-x 1 root root   3901568 Feb 20 16:32 genswaggertypedocs
-rwxr-xr-x 1 root root  38382720 Feb 20 16:32 genyaml
-rwxr-xr-x 1 root root   8126240 Feb 20 16:32 ginkgo
-rwxr-xr-x 1 root root   4460824 Feb 20 16:08 go2make
-rwxr-xr-x 1 root root   2005984 Feb 20 16:09 go-bindata
-rwxr-xr-x 1 root root 177541000 Feb 20 16:32 hyperkube
-rwxr-xr-x 1 root root  36350048 Feb 20 16:32 kubeadm
-rwxr-xr-x 1 root root 138505440 Feb 20 16:32 kube-apiserver
-rwxr-xr-x 1 root root 103774080 Feb 20 16:32 kube-controller-manager
-rwxr-xr-x 1 root root  39189984 Feb 20 16:32 kubectl
-rwxr-xr-x 1 root root 112883720 Feb 20 16:32 kubelet
-rwxr-xr-x 1 root root 110770664 Feb 20 16:32 kubemark
-rwxr-xr-x 1 root root  34775392 Feb 20 16:32 kube-proxy
-rwxr-xr-x 1 root root  37230848 Feb 20 16:32 kube-scheduler
-rwxr-xr-x 1 root root   4975168 Feb 20 16:32 linkcheck
-rwxr-xr-x 1 root root   1599264 Feb 20 16:32 mounter
-rwxr-xr-x 1 root root  10367840 Feb 20 16:09 openapi-gen

上边讲到单独对某个组件执行编译,除了上述办法之外,还可以进入到 kubernetes/cmd/ 目录下对应组件下执行,例如我们编译 kube-apiserver 组件。

$ cd kubernetes/cmd/kube-apiserver
$ go build -v
$ ls 
apiserver.go  app  kube-apiserver  BUILD  OWNERS

5、docker 镜像编译 kubernetes

docker 镜像编译 kubernetes,可以编译出各核心组件二进制文件以及对应的镜像文件,这里得提一下,由于国内网络的问题,想顺利的安装 kubernetes,依赖镜像拉取问题比较麻烦,之前文章也提到过,可以通过 Github 配合 DockerHub 的 Auto build 功能,将镜像推送到 DockerHub,然后本地拉取后修改 tag 名称,操作有点麻烦,不过好歹解决了我们镜像拉取不到的问题。现在我们可以本地编译出 kubernetes 依赖的镜像了,那就很方便了,有木有。

具体涉及到的代码目录为 kubernetes/build,这里主要包含几个核心基础镜像的制作,包括 kube-crosspause-amd64debian-iptables-amd64debian-base-amd64debian-hyperkube-base-amd64。这里我偷个懒,先不挨个构建了,当然依旧可以通过上边提到的途径解决,直接拿别人构建好的镜像,拉取后修改 tag 即可。

$ docker pull xiaoxu780/pause-amd64:3.1
$ docker pull xiaoxu780/kube-cross:v1.11.2-1
$ docker pull xiaoxu780/debian-base-amd64:0.4.0
$ docker pull xiaoxu780/debian-iptables-amd64:v11.0
$ docker pull xiaoxu780/debian-hyperkube-base-amd64:0.12.0

$ docker tag xiaoxu780/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
$ docker tag xiaoxu780/kube-cross:v1.11.2-1 k8s.gcr.io/kube-cross:v1.11.5-1
$ docker tag xiaoxu780/debian-base-amd64:0.4.0 k8s.gcr.io/debian-base-amd64:0.4.0
$ docker tag xiaoxu780/debian-iptables-amd64:v11.0 k8s.gcr.io/debian-iptables-amd64:v11.0
$ docker tag xiaoxu780/debian-hyperkube-base-amd64:0.12.0 k8s.gcr.io/debian-hyperkube-base-amd64:0.12.0

注意:这里通过 kube-cross 组件有指定的版本,可以从 kubernetes/build/build-image/cross/VERSION 文件得到,我这里显示是 v1.11.5-1,跟上边提供的版本不一致,不过没关系,直接修改为该版本 tag 亲测没有问题的。

依赖的基础镜像本地已经有了,接下来需要修改构建策略,忽略 --pull 参数,不然每次构建还是会去外网拉取基础镜像,要让它直接读取本地镜像。修改 kubernetes/build/lib/release.sh 文件如下:

"${DOCKER[@]}" build --pull -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null
修改为
"${DOCKER[@]}" build -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null

其次修改 kubernetes/hack/lib/version.sh 文件,将变量 KUBE_GIT_TREE_STATE="dirty" 修改为 KUBE_GIT_TREE_STATE="clean"dirty 表示 Git 提交 ID 之后的源代码有更改,clean 表示 Git 提交 ID 之后没有更改,为了确保版本号干净,都修改为 clean

接下来直接执行如下编译命令:

$ KUBE_BUILD_PLATFORMS=linux/amd64 KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_HYPERKUBE=n make release-images GOFLAGS=-v GOGCFLAGS="-N -l"
+++ [0221 10:48:26] Verifying Prerequisites....
+++ [0221 10:48:27] Building Docker image kube-build:build-d0824d4b8f-5-v1.11.5-1
+++ [0221 10:48:49] Creating data container kube-build-data-d0824d4b8f-5-v1.11.5-1
+++ [0221 10:48:53] Syncing sources to container
+++ [0221 10:49:11] Running build command...
......
+++ [0221 10:56:08] Syncing out of container
+++ [0221 10:56:13] Building images: linux-amd64
+++ [0221 10:56:14] Starting docker build for image: cloud-controller-manager-amd64
+++ [0221 10:56:14] Starting docker build for image: kube-apiserver-amd64
+++ [0221 10:56:14] Starting docker build for image: kube-controller-manager-amd64
+++ [0221 10:56:14] Starting docker build for image: kube-scheduler-amd64
+++ [0221 10:56:14] Starting docker build for image: kube-proxy-amd64
+++ [0221 10:56:24] Deleting docker image k8s.gcr.io/kube-scheduler:v1.13.4-beta.0.12_4ef32ffb4e7c35
+++ [0221 10:56:25] Deleting docker image k8s.gcr.io/kube-proxy:v1.13.4-beta.0.12_4ef32ffb4e7c35
+++ [0221 10:56:32] Deleting docker image k8s.gcr.io/cloud-controller-manager:v1.13.4-beta.0.12_4ef32ffb4e7c35
+++ [0221 10:56:33] Deleting docker image k8s.gcr.io/kube-controller-manager:v1.13.4-beta.0.12_4ef32ffb4e7c35
+++ [0221 10:56:33] Deleting docker image k8s.gcr.io/kube-apiserver:v1.13.4-beta.0.12_4ef32ffb4e7c35
+++ [0221 10:56:33] Docker builds done

说明一下:

  • UBE_BUILD_CONFORMANCE=nKUBE_BUILD_HYPERKUBE=n 参数配置是否构建 hyperkube-amd64conformance-amd64 镜像,默认是 y 构建,这里设置为 n 暂时不需要构建了。
  • make release-images 表示执行编译并生成镜像 tar 包。

稍等片刻,编译的 kubernetes 组件 docker 镜像以 tar 包的形式发布在 kubernetes/_output/release-tars/amd64 目录中。

$ ll _output/release-images/amd64/
total 611988
-rw-r--r-- 2 root root 133416960 Feb 21 10:56 cloud-controller-manager.tar
-rw-r--r-- 2 root root 182395904 Feb 21 10:56 kube-apiserver.tar
-rw-r--r-- 2 root root 147664384 Feb 21 10:56 kube-controller-manager.tar
-rw-r--r-- 2 root root  82071552 Feb 21 10:56 kube-proxy.tar
-rw-r--r-- 2 root root  81121280 Feb 21 10:56 kube-scheduler.tar

生成的核心组件二进制可执行文件以及镜像,在 kubernetes/_output/release-stage/server/linux-amd64/kubernetes/server/bin/ 目录可以找到。

$ ll _output/release-stage/server/linux-amd64/kubernetes/server/bin/
total 1006368
-rwxr-xr-x 1 root root  89526336 Feb 21 10:56 cloud-controller-manager
-rw-r--r-- 1 root root        33 Feb 21 10:56 cloud-controller-manager.docker_tag
-rw-r--r-- 2 root root 133416960 Feb 21 10:56 cloud-controller-manager.tar
-rwxr-xr-x 1 root root 138505472 Feb 21 10:56 kube-apiserver
-rw-r--r-- 1 root root        33 Feb 21 10:56 kube-apiserver.docker_tag
-rw-r--r-- 2 root root 182395904 Feb 21 10:56 kube-apiserver.tar
-rwxr-xr-x 1 root root 103774112 Feb 21 10:56 kube-controller-manager
-rw-r--r-- 1 root root        33 Feb 21 10:56 kube-controller-manager.docker_tag
-rw-r--r-- 2 root root 147664384 Feb 21 10:56 kube-controller-manager.tar
-rwxr-xr-x 1 root root  34775392 Feb 21 10:56 kube-proxy
-rw-r--r-- 1 root root        33 Feb 21 10:56 kube-proxy.docker_tag
-rw-r--r-- 2 root root  82071552 Feb 21 10:56 kube-proxy.tar
-rwxr-xr-x 1 root root  37230848 Feb 21 10:56 kube-scheduler
-rw-r--r-- 1 root root        33 Feb 21 10:56 kube-scheduler.docker_t

这些镜像 tar 包是可以直接用的,这下再也不用担心镜像拉不下来了。

6、如何使用编译产物

之前我们使用 minikube 或 kubeadm 方式安装 kubernetes,都是基于 docker 镜像方式运行的,现在本地已经有镜像 tar 包了,只需要导入即可。

$ docker load -i kube-apiserver.tar
8b4af753a2e6: Loading layer  138.5MB/138.5MB
Loaded image: k8s.gcr.io/kube-apiserver:v1.13.4-beta.0.12_4ef32ffb4e7c35
$ docker load -i kube-controller-manager.tar
b6bc9feeea3e: Loading layer  103.8MB/103.8MB
Loaded image: k8s.gcr.io/kube-controller-manager:v1.13.4-beta.0.12_4ef32ffb4e7c35
$ docker load -i kube-proxy.tar
f809931d55f8: Loading layer  34.78MB/34.78MB
Loaded image: k8s.gcr.io/kube-proxy:v1.13.4-beta.0.12_4ef32ffb4e7c35
$ docker load -i kube-scheduler.tar
08c5e224b023: Loading layer  37.23MB/37.23MB
Loaded image: k8s.gcr.io/kube-scheduler:v1.13.4-beta.0.12_4ef32ffb4e7c35

$ docker images | grep kube
REPOSITORY                               TAG                                IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-apiserver                v1.13.4-beta.0.12_4ef32ffb4e7c35   478c9f2cf9b0        7 hours ago         181MB
k8s.gcr.io/kube-controller-manager       v1.13.4-beta.0.12_4ef32ffb4e7c35   2095dd7895ac        7 hours ago         146MB
k8s.gcr.io/kube-proxy                    v1.13.4-beta.0.12_4ef32ffb4e7c35   b22db5302318        7 hours ago         80.2MB
k8s.gcr.io/kube-scheduler                v1.13.4-beta.0.12_4ef32ffb4e7c35   d17edffb4bca        7 hours ago         79.6MB
kube-build                               build-d0824d4b8f-5-v1.11.5-1       1b02b2eeeffd        7 hours ago         2.31GB

对于二进制可执行文件,亦可直接使用,具体可参考 kubeasz 项目,该项目致力于提供快速部署高可用 k8s 集群的工具,它基于二进制可执行程序方式部署和利用 ansible-playbook 实现自动化安装的。

参考资料

<think>嗯,用户问的是拿到项目源码后怎么部署安装环境。首先,我需要回忆一下自己之前部署项目的步骤,然后整理成一个清晰的流程。可能用户是个刚接触开发的新手,或者对部署流程不太熟悉,需要详细的指导。 首先,用户可能没有说项目类型,比如是前端、后端,还是全栈,不同项目可能有不同的依赖。所以第一步应该是查看项目文档,比如README.md,里面通常会有安装说明。不过有时候文档可能不全或者过时,这时候需要进一步分析。 接下来,环境检查。需要确认系统是否安装了合适的运行环境,比如Python版本、Node.js版本,或者Java、Ruby等。版本不匹配会导致各种问题,所以这一步很重要。可能需要用命令行工具检查版本号,比如python --version或者node -v。 然后是依赖管理。不同的语言有不同的包管理工具,比如Python的pip和virtualenv,Node.js的npm或yarn,Java的Maven或Gradle。安装依赖时可能会遇到权限问题,这时候可能需要sudo或者调整权限设置。虚拟环境也是个好习惯,可以避免全局污染。 配置文件部分,用户可能需要复制.env.example到.env,并修改里面的数据库连接、API密钥等信息。这里可能会有环境变量的配置错误,导致应用无法启动。需要注意文件路径和权限。 数据库部署方面,可能需要安装MySQL、PostgreSQL或者MongoDB,然后创建数据库,执行迁移脚本。有时候需要手动导入SQL文件,或者运行ORM的迁移命令,比如Python的alembic upgrade head。 然后是编译或构建步骤,前端项目可能需要npm run build生成静态文件,后端可能需要mvn package打成JAR包。构建过程中可能会有依赖缺失或者版本冲突,需要根据错误信息调整。 启动应用时,可能用npm start、python app.py等命令。这时候可能会遇到端口占用、权限不足的问题,需要检查日志输出,查看错误信息。日志文件的位置也很重要,比如在/var/log/或者项目目录的logs文件夹里。 测试部分,运行单元测试或集成测试,确保部署后的功能正常。测试失败的话,可能需要检查环境变量或数据库连接是否正确。 最后,安全优化方面,比如生产环境需要关闭调试模式,配置防火墙,设置HTTPS。用户可能需要使用Nginx或Apache作为反向代理,配置SSL证书。 可能用户在实际操作中会遇到各种问题,比如依赖安装失败、环境变量配置错误、数据库连接问题等,需要逐一排查。这时候详细的日志和错误信息是关键,用户可能需要学习如何阅读日志,使用调试工具。 另外,如果项目使用DockerKubernetes,部署流程会更简单,但用户可能不熟悉容器化技术,可能需要额外的指导。这时候建议用户查看项目是否有Dockerfile或docker-compose.yml文件,然后按照相应的命令构建和运行容器。 总之,部署环境需要系统性的步骤,同时要有耐心处理可能出现的各种问题,逐步排查。用户可能需要结合文档、社区支持和自己的调试能力来完成部署。</think>好的,以下是部署项目环境的标准化流程,按照步骤操作可降低出错概率: 一、基础准备阶段 1. 文档解析 检查项目根目录下是否存在以下文件: - `README.md` | `INSTALL.md` | `requirements.txt` - `package.json` (Node.js) | `pom.xml` (Java) | `composer.json` (PHP) - `.env.example` 环境模板文件 2. 环境检测 ```bash # 检查系统版本 lsb_release -a # Linux ver # Windows cmd # 检查运行时版本 python --version # Python项目 node -v && npm -v # Node.js项目 java -version # Java项目 ``` 二、依赖安装阶段 1. 包管理器操作示例 ```bash # Python虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac pip install -r requirements.txt # Node.js项目 npm install --registry=https://registry.npm.taobao.org # 使用国内镜像 # Java项目 mvn clean install -DskipTests # 跳过测试加速构建 ``` 三、配置处理阶段 1. 环境变量配置 ```bash cp .env.example .env # 复制模板文件 # 典型需要修改的配置项 DATABASE_URL=mysql://user:password@localhost:3306/dbname DEBUG=false # 生产环境必须关闭 SECRET_KEY=your_secure_key_here ``` 四、数据库部署阶段 1. 数据库初始化示例 ```sql -- MySQL示例 CREATE DATABASE project_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON project_db.* TO 'project_user'@'localhost' IDENTIFIED BY 'secure_password'; FLUSH PRIVILEGES; # 执行迁移命令(不同框架) python manage.py migrate # Django npx sequelize-cli db:migrate # Sequelize php artisan migrate --seed # Laravel ``` 五、服务启动阶段 1. 开发模式启动命令对比 ```bash # Python Flask export FLASK_APP=app.py && flask run --port=5000 # Node.js Express npm run dev -- --port=3000 # Java Spring Boot java -jar target/project-0.0.1-SNAPSHOT.jar # Ruby on Rails rails server -p 3000 -b 0.0.0.0 ``` 六、验证测试阶段 1. 健康检查端点测试 ```bash curl http://localhost:3000/healthcheck # 期望响应示例 {"status":"OK","timestamp":"2024-02-20T14:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值