转:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/#23镜像版本怎么整

一、环境准备

首先环境还是三台虚拟机,虚拟机地址如下然后每台机器安装好 docker,至于 rpm 安装包版本下面介绍

IP 地址 节点
192.168.1.167 master
192.168.1.189 node1
192.168.1.176 node2

二、说点正经事

2.1、安装包从哪来

官方的文档页面更新并不及时,同时他的 yum 源更新也很慢,再者…那他妈可是 Google 的服务器,能特么连上吗?以前总是在国外服务器使用 yumdownloader 下载,然后 scp 到本地,虽然能解决问题,但是蛋碎一地…最后找到了源头,如下

Kubernetes 编译的各种发行版安装包来源于 Github 上的另一个叫 release 的项目,地址 点这里,把这个项目 clone 下来,由于本人是 Centos 用户,所以进入 rpm 目录,在安装好 docker 的机器上执行那个 docker-build.sh 脚本即可编译 rpm 包,最后会生成到当前目录的 output 目录下,截图如下

2.2、镜像从哪来

对的,没错,gcr.io 就是 Google 的域名,服务器更不用提,所以在进行 kubeadm init 操作时如果不先把这些镜像 load 进去绝对会卡死不动,以下列出了所需镜像,但是版本号根据 rpm 版本不同可能略有不同,具体怎么看下面介绍

镜像名称 版本号
gcr.io/google_containers/kube-discovery-amd64 1.0
gcr.io/google_containers/kubedns-amd64 1.7
gcr.io/google_containers/kube-proxy-amd64 v1.4.1
gcr.io/google_containers/kube-scheduler-amd64 v1.4.1
gcr.io/google_containers/kube-controller-manager-amd64 v1.4.1
gcr.io/google_containers/kube-apiserver-amd64 v1.4.1
gcr.io/google_containers/etcd-amd64 2.2.5
gcr.io/google_containers/kube-dnsmasq-amd64 1.3
gcr.io/google_containers/exechealthz-amd64 1.1
gcr.io/google_containers/pause-amd64 3.0

这些镜像有两种办法可以获取,第一种是利用一台国外的服务器,在上面 pull 下来,然后再 save 成 tar 文件,最后 scp 到本地 load 进去;相对于第一种方式比较坑的是取决于服务器速度,每次搞起来也很蛋疼,第二种方式就是利用 docker hub 做中转,简单的说就是利用 docker hub 的自动构建功能,在 Github 中创建一个 Dockerfile,里面只需要 FROM xxxx 这些 gcr.io 的镜像即可,最后 pull 到本地,然后再 tag 一下

首先创建一个 github 项目,可以直接 fork 我的即可

其中每个 Dockerfile 只需要 FROM 一下即可

最后在 Docker Hub 上创建自动构建项目

最后要手动触发一下,然后 Docker Hub 才会开始给你编译

等待完成即可直接 pull 了

2.3、镜像版本怎么整

上面已经解决了镜像获取问题,但是一大心病就是 “我特么怎么知道是哪个版本的”,为了发扬 “刨根问底” 的精神,先进行一遍 kubeadm init,这时候绝对卡死,此时进入 /etc/kubernetes/manifests 可以看到许多 json 文件,这些文件中定义了需要哪些基础镜像

从上图中基本可以看到 kubeadm init 的时候会拉取哪些基础镜像了,但是还有一些镜像,仍然无法找到,比如kubednspause 等,至于其他的镜像版本,可以从源码中找到,源码位置是 kubernetes/cmd/kubeadm/app/images/images.go 这个文件中,如下所示:

剩余的一些镜像,比如 kube-proxy-amd64kube-discovery-amd64 两个镜像,其中 kube-discovery-amd64 现在一直是 1.0 版本,源码如下所示

kube-proxy-amd64 则是一直跟随基础组件的主版本,也就是说如果从 manifests 中看到 controller 等版本是 v.1.4.4,那么 kube-proxy-amd64 也是这个版本,源码如下

最后根据这些版本去 github 上准备相应的 Dockerfile,在利用 Docker Hub 的自动构建 build 一下,再 pull 下来 tag 成对应的镜像名称即可

三、搭建集群

3.1、主机名处理

经过亲测,节点主机名最好为 xxx.xxx 这种域名格式,否则在某些情况下,POD 中跑的程序使用域名解析时可能出现问题,所以先要处理一下主机名

# 写入 hostname(node 节点后缀改成 .node)
echo "192-168-1-167.master" > /etc/hostname
# 加入 hosts
echo "127.0.0.1 192-168-1-167.master" >> /etc/hosts
# 不重启情况下使内核生效
sysctl kernel.hostname=192-168-1-167.master
# 验证是否修改成功
➜ ~ hostname
192-168-1-167.master

3.2、load 镜像

由于本人已经在 Docker Hub 上处理好了相关镜像,所以直接 pull 下来 tag 一下即可,

images=(kube-proxy-amd64:v1.4.4 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.4.4 kube-controller-manager-amd64:v1.4.4 kube-apiserver-amd64:v1.4.4 etcd-amd64:2.2.5 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.4.1)
for imageName in ${images[@]} ; do
docker pull mritd/$imageName
docker tag mritd/$imageName gcr.io/google_containers/$imageName
docker rmi mritd/$imageName
done

3.3、安装 rpm

rpm 获取办法上文已经提到,可以自己编译,这里我已经编译好并维护了一个 yum 源,直接yum install 即可(懒)

# 添加 yum 源
tee /etc/yum.repos.d/mritd.repo << EOF
[mritdrepo]
name=Mritd Repository
baseurl=https://rpm.mritd.me/centos/7/x86_64
enabled=1
gpgcheck=1
gpgkey=https://mritd.b0.upaiyun.com/keys/rpm.public.key
EOF
# 刷新cache
yum makecache
# 安装
yum install -y kubelet kubectl kubernetes-cni kubeadm

3.4、初始化 master

等会有个坑,kubeadm 等相关 rpm 安装后会生成 /etc/kubernetes 目录,而 kubeadm init 时候又会检测这些目录是否存在,如果存在则停止初始化,所以要先清理一下,以下清理脚本来源于 官方文档 Tear down 部分,该脚本同样适用于初始化失败进行重置

systemctl stop kubelet;
# 注意: 下面这条命令会干掉所有正在运行的 docker 容器,
# 如果要进行重置操作,最好先确定当前运行的所有容器都能干掉(干掉不影响业务),
# 否则的话最好手动删除 kubeadm 创建的相关容器(gcr.io 相关的)
docker rm -f -v $(docker ps -q);
find /var/lib/kubelet | xargs -n 1 findmnt -n -t tmpfs -o TARGET -T | uniq | xargs -r umount -v;
rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;

还有个坑,初始化以前记得一定要启动 kubelet,虽然你 systemctl status kubelet 看着他是启动失败,但是也得启动,否则绝壁卡死

systemctl enable kubelet
systemctl start kubelet

等会等会,还有坑,新版本直接 init 会提示 ebtables not found in system path 错误,所以还得先安装一下这个包在初始化

# 安装 ebtables
yum install -y ebtables

最后见证奇迹的时刻

# 初始化并指定 apiserver 监听地址
kubeadm init --api-advertise-addresses 192.168.1.167

完美截图如下

这里再爆料一个坑,底下的 kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.1.167 这条命令一定保存好,因为后期没法重现的,你们老大再让你添加机器的时候如果没这个你会哭的

3.5、加入 node

上面所有坑大约说的差不多了,直接上命令了

# 处理主机名
echo "192-168-1-189.node" > /etc/hostname
echo "127.0.0.1 192-168-1-189.node" >> /etc/hosts
sysctl kernel.hostname=192-168-1-189.node
# 拉取镜像
images=(kube-proxy-amd64:v1.4.4 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.4.4 kube-controller-manager-amd64:v1.4.4 kube-apiserver-amd64:v1.4.4 etcd-amd64:2.2.5 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.4.1)
for imageName in ${images[@]} ; do
docker pull mritd/$imageName
docker tag mritd/$imageName gcr.io/google_containers/$imageName
docker rmi mritd/$imageName
done
# 装 rpm
tee /etc/yum.repos.d/mritd.repo << EOF
[mritdrepo]
name=Mritd Repository
baseurl=https://rpm.mritd.me/centos/7/x86_64
enabled=1
gpgcheck=1
gpgkey=https://mritd.b0.upaiyun.com/keys/rpm.public.key
EOF
yum makecache
yum install -y kubelet kubectl kubernetes-cni kubeadm ebtables
# 清理目录(没初始化过只需要删目录)
rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
# 启动 kubelet
systemctl enable kubelet
systemctl start kubelet
# 初始化加入集群
kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.1.167

同样完美截图

3.6、部署 weave 网络

再没部署 weave 时,dns 是启动不了的,如下

官方给出的命令是这样的

kubectl create -f https://git.io/weave-kube

本着 “刨根问底挖祖坟” 的精神,先把这个 yaml 搞下来

wget https://git.io/weave-kube -O weave-kube.yaml

然后同样的套路,打开看一下镜像,利用 Docker Hub 做中转,搞下来再 load 进去,然后 create -f就行了

docker pull mritd/weave-kube:1.7.2
docker tag mritd/weave-kube:1.7.2 weaveworks/weave-kube:1.7.2
docker rmi mritd/weave-kube:1.7.2
kubectl create -f weave-kube.yaml

完美截图

3.7、部署 dashboard

dashboard 的命令也跟 weave 的一样,不过有个大坑,默认的 yaml 文件中对于 image 拉取策略的定义是 无论何时都会去拉取镜像,导致即使你 load 进去也无卵用,所以还得先把 yaml 搞下来然后改一下镜像拉取策略,最后再 create -f 即可

wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml -O kubernetes-dashboard.yaml

编辑 yaml 改一下 imagePullPolicy,把 Always 改成 IfNotPresent(本地没有再去拉取) 或者 Never(从不去拉取) 即可

最后再利用 Dokcer Hub 中转,然后创建(实际上 dashboard 已经有了 v1.4.1,我这里已经改了)

kubectl create -f kubernetes-dashboard.yaml

截图如下

通过 describe 命令我们可以查看其暴露出的 NodePoint,然后便可访问

四、其他的一些坑

还有一些其他的坑等着大家去摸索,其中有一个是 DNS 解析错误,表现形式为 POD 内的程序通过域名访问解析不了,cat 一下容器的 /etc/resolv.conf发现指向的 dns 服务器与 kubectl get svc --namespace=kube-system 中的 kube-dsn 地址不符;解决办法就是 编辑节点的 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件,更改 KUBELET_DNS_ARGS 地址为 get svc 中的 kube-dns 地址,然后重启 kubelet 服务,重新杀掉 POD 让 kubernetes 重建即可

其他坑欢迎大家补充

github安装k8s的更多相关文章

  1. Win10 for Docker 安装 K8S

    win 10 docker安装K8S中遇见的一些问题,记录下来方便自己以后避免采坑. 安装步骤: 1.安装Docker for windows.在docker官方下载,然后傻瓜式安装. 安装成功以后再 ...

  2. kubeadm安装K8S单master双节点集群

    宿主机:master:172.16.40.97node1:172.16.40.98node2:172.16.40.99 # 一.k8s初始化环境:(三台宿主机) 关闭防火墙和selinux syste ...

  3. kubespray 一键安装k8s集群

    1. clone代码 git clone https://github.com/kubernetes-incubator/kubespray.git 2. 添加inventory/inventory ...

  4. 最小化安装k8s

    最小化安装k8s Nick_4438 关注 2018.07.11 10:40* 字数 670 阅读 0评论 0喜欢 0 1.前言 之前写过一篇二进制手工安装k8s的文章,过程复杂,搞了多日才安装成功. ...

  5. [k8s]kubespray(ansible)自动化安装k8s集群

    kubespray(ansible)自动化安装k8s集群 https://github.com/kubernetes-incubator/kubespray https://kubernetes.io ...

  6. k8s-离线安装k8s

    1.开始 目标 coreos的igniton.json有很强的可配置性,通过安装时指定集群配置的ignition.json, 安装完成后打开https://{{Master_IP}}:6443/ui直 ...

  7. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  8. 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法

    目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...

  9. 在vultr中安装k8s测试

    vultr 安装k8s *** 如果国内访问 k8s.gcr.io 很慢,或者无法访问 *** 在应用yaml文件创建资源时,将文件中镜像地址进行内容替换即可: 将k8s.gcr.io替换为 regi ...

随机推荐

  1. c++刷题(21/100)树的打印、矩阵覆盖和括号生成

    题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问 ...

  2. POJ 2485 Highways( 最小生成树)

    题目链接 Description The islandnation of Flatopia is perfectly flat. Unfortunately, Flatopia has no publ ...

  3. [转]STL 容器一些底层机制

    1.vector 容器 vector 的数据安排以及操作方式,与 array 非常相似.两者的唯一区别在于空间的运用的灵活性.array 是静态空间,一旦配置了就不能改变,vector 是动态数组.在 ...

  4. 2016.08.02 math(leetcode) 小结

    math(leetcode) 小结 在leetcode中有些知识点(套路) 判断一个数是不是能被某些数整除,可以用 n%x == 0,循环除的话,就将while(n%x == 0)的循环条件设置判断整 ...

  5. Dream------Hadoop--Hadoop HA QJM (Quorum Journal Manager)

    In a typical HA cluster, two separate machines are configured as NameNodes. At any point in time, ex ...

  6. MySQL GTID你知多少【转】

    MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...

  7. JSONArray().fromObject(); 出现org.apache.catalina.core.StandardWrapperValve invoke错误的解决办法

    servlet: public void service(HttpServletRequest request, HttpServletResponse response) throws Servle ...

  8. 数据库-mysql中文显示问题

    一:在mysql 下面查看带中文的记录显示乱码 mysql> select * from role; +----+------+ | id | name | +----+------+ | 1 ...

  9. 缓存数据库-redis(管道)

    一:Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常 ...

  10. python基础--json,pickle和shelve模块

    一.JSON &pickle 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换  字符串必须是双引号,不能是单引号 pickle,用于python特有的类型 和 ...