kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
最近发布的Kubernetes 1.15中,kubeadm对HA集群的配置已经达到beta可用,说明kubeadm距离生产环境中可用的距离越来越近了。
受以下消息影响,决定作一次K8S升级的探索。
漏洞详细信息
- Netflix最近宣布了一项安全公告,该公告确定了几个可能影响HTTP/2协议服务器实现的拒绝服务攻击向量,并发布了8个CVE。[1]
- Go受两个漏洞(CVE-2019-9512和CVE-2019-9514)的影响,因此服务于HTTP/2流量(including / healthz)的Kubernetes组件也会受到影响。[2]
- 这些漏洞允许不受信任的客户端分配无限量的内存,直到服务器崩溃。产品安全委员会已将这组漏洞分配为CVSS评分为7.5 [3]
如何解决漏洞?
Go发布了go1.12.8和go1.11.13版本,我们也发布了使用修补版本的Go构建的以下版本的Kubernetes。
- Kubernetes v1.15.3 - go1.12.9
- Kubernetes v1.14.6 - go1.12.9
- Kubernetes v1.13.10 - go1.11.13
升级到上面列出的Kubernetes修补版本。
本文档以kubernetes 1.14.6作为升级目标。由于kubeadm历来是手工下载升级,籍由此次机会,顺便更改证书过期时间,并手工编译成二进制文件。
一,生成编译镜像
1,Dockerfile内容(注意,一定要下载go1.12.9以后版本,才修复了漏洞):
FROM centos:centos7.6.1811 MAINTAINER 4k ENV GOROOT /usr/local/go ENV GOPATH /usr/local/gopath ENV PATH /usr/local/go/bin:$PATH RUN yum install rpm-build which where rsync gcc gcc-c++ automake autoconf libtool make -y \ && curl -L https://studygolang.com/dl/golang/go1.12.9.linux-amd64.tar.gz | tar zxvf - -C /usr/local
2,生成镜像
docker build –t harbor.xxx.cn/4k/build-k8s:centos-7.6-go-1.12.9-k8s-1.14.6 .
二,下载github源码
Github下载地址(注意linux下载tar.gz包,不要下载zip包):
wget https://github.com/kubernetes/kubernetes/releases/download/v1.14.6/kubernetes.tar.gz
三,镜像挂载目录
1,运行docker run 命令,将生成的镜像和下载的源码解压挂载
docker run -it --rm –v \ /build-k8s/kubernetes-1.14.6:/usr/local/gopath/src/k8s.io/kubernetes \ harbor.xxx.cn/build-k8s:centos-7.6-go-1.12.9-k8s-1.14.6
四,编译二进制
1,进入容器,在k8s项目根目录下运行如下命令,编译Kubeadm
KUBE_BUILD_PLATFORMS=linux/amd64 make all WHAT=cmd/kubeadm GOFLAGS=-v GOGCFLAGS="-N -l"
五,kubeadm二进制验证
1,运行命令进行验证
./kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"archive", BuildDate:"2019-09-05T02:41:12Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
2,将此kubeadm二进制下载保存,用于将来升级。
六,kubeadm修改记录(证书100年过期)
1,kubernetes-1.14.6\staging\src\k8s.io\client-go\util\cert\cert.go
2,kubernetes-1.14.6\cmd\kubeadm\app\util\pkiutil\pki_helpers.go