最近,领导让我重新搞k8s,我想后台服务进入了调试阶段,没多少新的功能添加了,就决定重新部署。k8s版本更新太快了,最新稳定的版本是1.11.2,以前部署的是1.9版本,现在要使用最新的版本部署。
不过,第一步下载安装包就没法正常进行了,因为众所周知的原因,对于一些外面的网站是无法正常访问的。在下班路上,突发奇想,可以尝试用dockerhub做中转,将下载的压缩包放到docker镜像里,然后再拉取镜像,这样就可以达到目的了。于是利用周末时间研究一下。
问题
k8s下载页面为:https://github.com/kubernetes/kubernetes/releases。但是提供下载的kubernetes.tar.gz只是下载真正安装包的脚本而已,运行脚本才会下载安装包。而真正安装包在CHANGELOG-1.11.md里面给出了下载地址。以本文为例,地址为:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1112。
以server端为例,下载地址为:https://dl.k8s.io/v1.11.1/kubernetes-server-linux-amd64.tar.gz,实际为https://storage.googleapis.com/kubernetes-release/release/v1.11.1/kubernetes-server-linux-amd64.tar.gz,无论是哪个,都无法正常下载。
原理
dockerhub服务器位于国外,能访问google相关的网站,而其支持Dockerfile自动构建,因此使用ubuntu基础镜像,再用wget下载压缩包,如果成功,压缩包就在docker镜像里面了,然后用docker pull命令拉取下来,运行容器,就能拿到压缩了。
下面给出实现方式。
实现
首先,编写Dockerfile,内容如下:
FROM ubuntu:16.04
LABEL maintainer Late Lee(li@latelee.org)
RUN apt-get update || true && \
apt-get install -y \
curl wget \
pkg-config && \
rm -rf /var/lib/dpkg/info/* /var/lib/apt/lists/*
RUN wget -c https://storage.googleapis.com/kubernetes-release/release/v1.11.2/kubernetes-server-linux-amd64.tar.gz
RUN wget -c https://storage.googleapis.com/kubernetes-release/release/v1.11.2/kubernetes-client-linux-amd64.tar.gz
RUN wget -c https://storage.googleapis.com/kubernetes-release/release/v1.11.2/kubernetes-node-linux-arm64.tar.gz
CMD ["/bin/bash"]
内容十分简单,安装wget,然后用wget下载,默认情况下,文件下载到根目录,即“/”目录。
将Dockerfile提交到github上,然后在hub.docker创建自动构建项目,关联Dockerfile后,手动构建,再次提交Dockefile进行自动构建,等待其完成。
验证
本文构建成功的镜像地址为:https://hub.docker.com/r/latelee/k8s/。已经构建成功,下面拉取这个镜像。
$ docker pull latelee/k8s:1.11.2
Using default tag: latest
latest: Pulling from latelee/ubuntu-google
3b37166ec614: Pull complete
504facff238f: Pull complete
ebbcacd28e10: Pull complete
c7fb3351ecad: Pull complete
2e3debadcbf7: Pull complete
95389de21fec: Pull complete
07837e23aeae: Pull complete
6c17d9f343d5: Pull complete
f04501ba251e: Pull complete
Digest: sha256:47550e700d17c586763e25759938847308f855367924dc5a3cc5e76c03f172a1
Status: Downloaded newer image for latelee/k8s:1.11.2
再运行这个镜像:
$ docker run -it -v /home:/home --rm latelee/k8s:1.11.2 bash
root@8fa1786a1f5a:/# ls
bin etc kubernetes-node-linux-arm64.tar.gz lib64 opt run sys var
boot home kubernetes-server-linux-amd64.tar.gz media proc sbin tmp
dev kubernetes-client-linux-amd64.tar.gz lib mnt root srv usr
拷贝这些镜像到宿主机目录,然后退出。
root@8fa1786a1f5a:/# cp *.gz /home/latelee/docker/k8s/kubernetes
kubernetes/ kubernetes.tar.gz
root@8fa1786a1f5a:/# cp *.gz /home/latelee/docker/k8s/
root@8fa1786a1f5a:/# exit
exit
为了验证其准确性,托关系找网友帮忙下载,然后进行md5sum校验,结果如下:
latelee@ubuntu:~/docker/k8s$ md5sum kubernetes-server-linux-amd64.tar.gz
89fa567b0e20bb2ac952512a985419fe kubernetes-server-linux-amd64.tar.gz
latelee@ubuntu:~/docker/k8s$ md5sum other/kubernetes-server-linux-amd64.tar.gz
89fa567b0e20bb2ac952512a985419fe other/kubernetes-server-linux-amd64.tar.gz
md5一致,说明方法可行。
扩展
github可免费托管代码,其提供github pages功能,可以构建自己的网站,如果拥有自己的域名,可以将域名通过CNAME指向github,这样不需要购买主机。再利用jekyll或hexo,使用markdown写博客,然后提交到github上,通过CI将自动生成网站文章。
travis CI作为免费的CI网站,与github结合,达到CICD的目的,通过personal key或ssh密钥,可以访问github或自己主机。
dockerhub可免费托管自己的镜像,其与github或bitbucket可以很好结合,这样,就可以使用github托管Dockerfile文件,配置正确后,每次更新github,都会自动构建镜像。dockerhub服务器位于国外,可以正常访问google。
以上,都与github有密切关系,这些都是公开的,任何人可访问,因此,涉密的内容不可上传。原则坚持涉密不上网,上网不涉密。
小结
接触了docker将近一年,发现视野开阔了很多,思路也活跃了不少,很多东西应用docker后十分方便简单。另外现在有很多网站提供PaaS或SaaS服务。如果能好好利用,则会让自己技能大大提升。
隔了几天的PS:过后使用浏览器和wget下载文中的文件,能正常下载。因此,本文的方法仅供参考。
李迟 2018.9.9 周日上午