Kubernetes master服务定制编译docker镜像
前言
之前部署了Kubernetes 1.13.0,发现master服务的启动方式与1.10.4版本有所区别,kube-apiserver、kube-controller-manager和kube-scheduler分别使用不同的镜像启动,而不再是公用一个hyperkube镜像。但是官方的 kube-controller-manager镜像中不包含ceph client,导致无法创建RBD volume。于是需要打包自定义镜像,安装ceph client。
1. 环境
系统:CentOS 7.2
Docker:18.03.1-ce
Kubernetes:1.13.0
2. 下载Kubernetes源码
使用git clone –b参数下载对应版本的源码:
# git clone -b v1.13.0 https://github.com/kubernetes/kubernetes.git
3. 下载base镜像
打包过程使用到的base镜像有:
k8s.gcr.io/kube-cross:v1.11.2-
k8s.gcr.io/pause-amd64:3.1
k8s.gcr.io/debian-base-amd64:0.4.
k8s.gcr.io/debian-iptables-amd64:v11.
k8s.gcr.io/debian-hyperkube-base-amd64:0.12.
这些镜像可以使用make release命令从源码编译生成,为了方便,我直接使用官方编译好的镜像。我将它们下载下来上传到了私有镜像仓库,方便在不同机器上打包。
4. 修改镜像地址
由于使用本地镜像仓库,要修改打包脚本中的镜像仓库地址。修改如下:
build/build-image/Dockerfile:
# git diff build/build-image/Dockerfile
diff --git a/build/build-image/Dockerfile b/build/build-image/Dockerfile
index ff4543b..976a377
--- a/build/build-image/Dockerfile
+++ b/build/build-image/Dockerfile
@@ -, +, @@
# limitations under the License. # This file creates a standard build environment for building Kubernetes
- FROM k8s.gcr.io/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG
+FROM registry.example.com/k8s_gcr/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG # Mark this as a kube-build container
RUN touch /kube-build-image
build/common.sh:
# git diff build/common.sh
diff --git a/build/common.sh b/build/common.sh
index b3b7748..902b08f
--- a/build/common.sh
+++ b/build/common.sh
@@ -, +, @@ kube::build::get_docker_wrapped_binaries() {
local arch=$
local debian_base_version=0.4.
local debian_iptables_version=v11.
+ local registry="registry.example.com/k8s_gcr"
### If you change any of these lists, please also update DOCKERIZED_BINARIES
### in build/BUILD. And kube::golang::server_image_targets
local targets=(
- cloud-controller-manager,"k8s.gcr.io/debian-base-${arch}:${debian_base_version}"
- kube-apiserver,"k8s.gcr.io/debian-base-${arch}:${debian_base_version}"
- kube-controller-manager,"k8s.gcr.io/debian-base-${arch}:${debian_base_version}"
- kube-scheduler,"k8s.gcr.io/debian-base-${arch}:${debian_base_version}"
- kube-proxy,"k8s.gcr.io/debian-iptables-${arch}:${debian_iptables_version}"
+ cloud-controller-manager,"${registry}/debian-base-${arch}:${debian_base_version}"
+ kube-apiserver,"${registry}/debian-base-${arch}:${debian_base_version}"
+ kube-controller-manager,"${registry}/debian-base-${arch}:${debian_base_version}"
+ kube-scheduler,"${registry}/debian-base-${arch}:${debian_base_version}"
+ kube-proxy,"${registry}/debian-iptables-${arch}:${debian_iptables_version}"
) echo "${targets[@]}"
build/root/WORKSPACE:
# git diff build/root/WORKSPACE
diff --git a/build/root/WORKSPACE b/build/root/WORKSPACE
index cee8962..f1a7c37
--- a/build/root/WORKSPACE
+++ b/build/root/WORKSPACE
@@ -, +, @@ http_file(
docker_pull(
name = "debian-base-amd64",
digest = "sha256:86176bc8ccdc4d8ea7fbf6ba4b57fcefc2cb61ff7413114630940474ff9bf751",
- registry = "k8s.gcr.io",
+ registry = "registry.example.com/k8s_gcr",
repository = "debian-base-amd64",
tag = "0.4.0", # ignored, but kept here for documentation
)
@@ -, +, @@ docker_pull(
docker_pull(
name = "debian-iptables-amd64",
digest = "sha256:d4ff8136b9037694a3165a7fff6a91e7fc828741b8ea1eda226d4d9ea5d23abb",
- registry = "k8s.gcr.io",
+ registry = "registry.example.com/k8s_gcr",
repository = "debian-iptables-amd64",
tag = "v11.0", # ignored, but kept here for documentation
)
@@ -, +, @@ docker_pull(
docker_pull(
name = "debian-hyperkube-base-amd64",
digest = "sha256:4a77bc882f7d629c088a11ff144a2e86660268fddf63b61f52b6a93d16ab83f0",
- registry = "k8s.gcr.io",
+ registry = "registry.example.com/k8s_gcr",
repository = "debian-hyperkube-base-amd64",
tag = "0.12.0", # ignored, but kept here for documentation
)
build/lib/release.sh:
# git diff build/lib/release.sh
diff --git a/build/lib/release.sh b/build/lib/release.sh
index d7ccc01..47d9e37
--- a/build/lib/release.sh
+++ b/build/lib/release.sh
@@ -, +, @@ function kube::release::create_docker_images_for_server() {
local images_dir="${RELEASE_IMAGES}/${arch}"
mkdir -p "${images_dir}" - local -r docker_registry="k8s.gcr.io"
+ local -r docker_registry="registry.example.com/k8s_gcr"
# Docker tags cannot contain '+'
local docker_tag="${KUBE_GIT_VERSION/+/_}"
if [[ -z "${docker_tag}" ]]; then
5. kube-controller-manager安装ceph client
Kubernetes master服务镜像的build在build/lib/release.sh的kube::release::create_docker_images_for_server()中进行,它们的Dockerfile也是由这个函数动态生成的。修改这个函数,在Dockerfile中增加上安装ceph client的命令。
由于使用的base镜像k8s.gcr.io/debian-base-amd64:0.4.0是Debian 9.5 Stretch版本的,ceph mimic使用C++ 17标准,需要gcc 8支持,所以不支持Debian Stretch。于是只能安装ceph luminous版本的client。当然也可以使用第三方编译的deb包,比如croit。
在步骤四的修改上继续修改build/lib/release.sh:
# git diff build/lib/release.sh
diff --git a/build/lib/release.sh b/build/lib/release.sh
index d7ccc01..0d03da9
--- a/build/lib/release.sh
+++ b/build/lib/release.sh
@@ -, +, @@ function kube::release::create_docker_images_for_server() {
local images_dir="${RELEASE_IMAGES}/${arch}"
mkdir -p "${images_dir}" - local -r docker_registry="k8s.gcr.io"
+ local -r docker_registry="registry.example.com/k8s_gcr"
# Docker tags cannot contain '+'
local docker_tag="${KUBE_GIT_VERSION/+/_}"
if [[ -z "${docker_tag}" ]]; then
@@ -, +, @@ function kube::release::create_docker_images_for_server() {
cat <<EOF > "${docker_file_path}"
FROM ${base_image}
COPY ${binary_name} /usr/local/bin/${binary_name}
+RUN echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib\ndeb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib\
+RUN apt-get update && apt-get -y install apt-transport-https gnupg2 wget curl
EOF
# ensure /etc/nsswitch.conf exists so go's resolver respects /etc/hosts
if [[ "${base_image}" =~ busybox ]]; then
echo "COPY nsswitch.conf /etc/" >> "${docker_file_path}"
fi
+
+ # install ceph client
+ if [[ ${binary_name} =~ "kube-controller-manager" ]]; then
+ echo "RUN wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | apt-key add -" >> "${docker_file_path}"
+ echo "RUN echo 'deb https://download.ceph.com/debian-luminous/ stretch main' > /etc/apt/sources.list.d/ceph.list" >> "${docker_file_path}"
+ echo "RUN apt-get update && apt-get install -y ceph-common ceph-fuse" >> "${docker_file_path}"
+ fi
+
"${DOCKER[@]}" build -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null
"${DOCKER[@]}" save "${docker_image_tag}" > "${binary_dir}/${binary_name}.tar"
echo "${docker_tag}" > "${binary_dir}/${binary_name}.docker_tag"
将所有镜像的源换成了aliyun,并在kube-controller-manager Dockerfile中增加了安装ceph client的命令。
至此准备工作就完成了,下面开始编译镜像。
6. 编译kubernetes镜像
编译命令:
# cd kubernetes
# make clean
# KUBE_BUILD_PLATFORMS=linux/amd64 KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_HYPERKUBE=n make release-images GOFLAGS=-v GOGCFLAGS="-N -l"
其中KUBE_BUILD_PLATFORMS=linux/amd64指定目标平台为linux/amd64,GOFLAGS=-v开启verbose日志,GOGCFLAGS="-N -l"禁止编译优化和内联,减小可执行程序大小。
7. 导入镜像
等待编译完成后,在_output/release-stage/server/linux-amd64/kubernetes/server/bin/目录下保存了编译生成的二进制可执行程序和docker镜像tar包。导入kube-controller-manager镜像,上传到镜像仓库:
# docker load –i _output/release-stage/server/linux-amd64/kubernetes/server/bin/kube-controller-manager.tar
# docker tag registry.example.com/k8s_gcr/kube-controller-manager:v1.13.0 registry.example.com/k8s_gcr/kube-controller-manager:v1.13.0-ceph-mimic
# docker push registry.example.com/k8s_gcr/kube-controller-manager:v1.13.0-ceph-mimic
整个编译过程结束,现在就可以到master节点上,修改/etc/kubernetes/manifests/kube-controller-manager.yaml描述文件中的image,修改完立即生效,创建RBD PV可以看到效果。
测试发现kube-controller-manager创建rbd没问题,但是node节点挂载rbd时报错。进一步测试发现与ceph client版本的关系不大,而与kernel的版本有关。将node节点的内核从3.10升级到4.17后,可以正常挂载。
参考资料
croit | Debian 9 (Stretch) Ceph Mimic mirror
Kubernetes master服务定制编译docker镜像的更多相关文章
- 03.pipeline实现项目自动编译docker镜像自动打包
https://jenkins.io/zh/doc/book/pipeline/ 官方教程,可以中文.Jenkinsfile就是把pipeline内容保存到文件,然后提交到svn等版本控制库中.安装b ...
- Azure DevOps (八) 通过流水线编译Docker镜像
上一篇文章我们完成了最简单的传统部署:上传应用到服务器上使用守护进程进行应用的部署. 本篇文章我们开始研究容器化和流水线的协作. 在开始操作之前,我们首先需要准备一下我们的dockerfile,这里我 ...
- k8s Gitlab CI/CD 之自动编译Docker镜像并推送到指定的Registry
环境介绍: 说明 节点 ip 系统 Gitlab Server git.ds.com 10.0.1.179 CentOS 7.5.1804 Gitlab Runner 10.0.1.178 Cen ...
- Docker 镜像加速教程
原文链接:https://fuckcloudnative.io/posts/docker-registry-proxy/ 在使用 Docker 和 Kubernetes 时,我们经常需要访问 gcr. ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...
- 将spring cloud打包docker镜像
简介:用spring cloud构建微服务后,微服务肯定要docker镜像化然后用rancher等可视化工具管理,这就是走完了一套基本的流程,现在简单介绍下 环境:两台centos7.x的服务器,一台 ...
- 【玩转开源】制作Docker镜像
做嵌入式方向经常会遇到的一个问题,就是编译环境安装,如果换电脑,再重新安装环境是一个比较费时的事情,这个时候可以自己制作一个Docker镜像,然后把编译环境在Docker镜像里面配置好,以后同步环境就 ...
- CentOS7 下 配置Docker远程访问 与 windows下使用maven构筑Spring Boot 的 Docker镜像到远程服务端
1.设置Docker服务端,以支持远程访问: 修改docker服务端配置文件,命令: vim /usr/lib/systemd/system/docker.service 修改后: [Unit] De ...
- 简单谈谈Docker镜像的使用方法_docker
在上篇文章(在Docker中搭建Nginx服务器)中,我们已经介绍了如何快速地搭建一个实用的Nginx服务器.这次我们将围绕Docker镜像(Docker Image),介绍其使用方法.包括三部分: ...
随机推荐
- electron 集成 SQLCipher
mac 安装 brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...
- 我对USB的认识
一.USB协议规范 (1) 基本概念 每一个设备(device)会有一个或者多个的逻辑连接点在里面,每个连接点叫endpoint.每个endpoint有四种数据传送方式:控制(Contr ...
- android获取https证书
最近碰到一个问题, 有朋友问android这边能不能拿到服务器下发的证书,意思就是 自签名证书的https接口,在请求的时候,也没有添加自签名证书进信任列表,直接去发https请求,按照正常htt ...
- Pylint 是什么
Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考 ...
- Jsoup进阶选择器
package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...
- IOS给图片增加水印(图片、文字)
在网上发现很多人使用 CGContextDrawImage(context,CGRectMake(0,0,self.width,self.height),[image CGImage]); //原图 ...
- xtrabackup 安装
xtrabackup 安装 yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Dige ...
- hdu1213-How Many Tables---基础并查集
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 题目大意: 今天是Ignatius的生日,他邀请了许多朋友.现在是吃晚饭的时间,Ignatiu ...
- 简析平衡树(一)——替罪羊树 Scapegoat Tree
前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构.不过,由于最近做的题目的题解中经常出现"平衡树"这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树. 简介 替罪羊树 ...
- 漫谈 Clustering (3): Gaussian Mixture Model
上一次我们谈到了用 k-means 进行聚类的方法,这次我们来说一下另一个很流行的算法:Gaussian Mixture Model (GMM).事实上,GMM 和 k-means 很像,不过 GMM ...