使用kubernetes 搭建集群,由于网络等缘由,对于那些初识k8s 的人,是一件很困难的事情,这里记录下整个集群搭建的过程和一些坑。node
该文章后续仍在不断的更新修改中, 请移步到原文地址http://www.dmwan.cc/?p=150linux
1、环境准备,操做系统:centos7.4 。第一个坑就是centos6.8安装阿里源的 kubernetes 会有依赖错误。git
ip 地址 | hostname |
192.168.0.11 | k8s-1 |
192.168.0.12 | k8s-2 |
主机名处理,为了防止域名解析出错,这里先修改hostname:docker
# 写入 hostname(node 节点后缀改为 .node) echo "k8s-1" > /etc/hostname # 加入 hosts echo "192.168.0.11 k8s-1" >> /etc/hosts echo "192.168.0.12 k8s-2" >> /etc/hosts # 不重启状况下使内核生效 sysctl kernel.hostname=k8s-1
而后,关闭防火墙和SE:shell
vi /etc/selinux/config disabled setenforce 0 systemctl disable firewalld systemctl stop firewalld systemctl disable iptables # 若是错误,yum install -y iptables systemctl stop iptables yum install -y ebtables sysctl net.bridge.bridge-nf-call-iptables=1
第二步,安装 kubernetes。centos
这里最大的坑就是兼容性问题,注意最好用centos7。安装方式有两个,一个是本身编译,第二个能够使用阿里的源直接安装rpm 包。api
这里使用阿里源安装1.7:bash
#docker yum源 cat >> /etc/yum.repos.d/docker.repo <<EOF [docker-repo] name=Docker Repository baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7 enabled=1 gpgcheck=0 EOF #kubernetes yum源 cat >> /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF
安装docker 和 kubernetes,正常安装,这里应该不会报依赖错误。网络
yum install -y docker-engine-1.12.6-1.el7.centos.x86_64; yum install -y kubernetes-cni-0.5.1-0.x86_64 kubelet-1.7.2-0.x86_64 kubectl-1.7.2-0.x86_64 kubeadm-1.7.2-0.x86_64
第三步,拉取kubeadm 的依赖镜像。这个步骤原本能够省略的,可是国内网络环境缘由,直接kubeadm init ,k8s 会本身去源站拉镜像,会hang 死,直接将对应版本 镜像先拉到本地,这样init 才能很快成功。app
这里我写了个shell 脚本,从我我的的docker hub 去拉取这些镜像,而后tag name :
images=(kube-proxy-amd64:v1.7.2 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.7.2 kube-controller-manager-amd64:v1.7.2 kube-apiserver-amd64:v1.7.2 etcd-amd64:3.0.17 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.6.1 k8s-dns-sidecar-amd64:1.14.4 ) for imageName in ${images[@]} ; do docker pull caucyming/$imageName docker tag caucyming/$imageName gcr.io/google_containers/$imageName docker rmi caucyming/$imageName done docker pull caucyming/weave-kube:2.3.0 docker tag caucyming/weave-kube:2.3.0 weaveworks/weave-kube:2.3.0 docker rmi caucyming/weave-kube:2.3.0 docker pull caucyming/weave-npc:2.3.0 docker tag caucyming/weave-npc:2.3.0 weaveworks/weave-npc:2.3.0 docker rmi caucyming/weave-npc:2.3.0
这里为何是这些镜像和这些镜像的版本,参看/etc/kubernetes/manifests 下的yaml 文件,kubeadm 就是不断 kubectl create 这些文件,要是版本不对,就去源站拉。
由于网络问题,caucyming 是我我的的docker hub 帐号,我经过在docker hub 上建立自动构建,由docker hub 去帮我从源站拉取,我直接从docker hub pull 镜像,就不会出现卡死的问题了,固然,也能够不这么作,直接全局代理,可是这样仍是更快点。为了稳定,也能够使用本身的docker hub去自动构建,这个操做比较简单。
weave 的版本,这里提一下,这里对应yaml 文件是wave-kube-1.6。这里下面会提到,版本不对,会致使dns 镜像起不来。
第四步,初始化:
systemctl enable kubelet systemctl start kubelet kubeadm init --kubernetes-version=v1.7.2 # 这里还能够指定其余参数,能够参考help
这里提一下,若是这里init 失败,或者机器重启,须要reset kubeadm,不然,识别到容器和/etc/kubernetes 等目录,会致使init 失败。
重启的话,直接:
kubeadm reset
到这一步,等1min 左右,若是正常,就会显示下面这条token了,这条token很重要,后期集群加机器要依赖这token:
kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.0.11:6443
若是运气很差,会永远卡死在这,这里的错,很是多,特别是上面有任何一个版本依赖不对,都会卡死。那如何查看问题出在哪里?能够经过journalctl 查看。有几个错我第一次安装的时候遇到过,cni初始化的问题,网上帖子一大堆,还有端口不对的问题,还有一堆 链接被拒绝的问题,保证版本对,防火墙关了,通常仍是能正常经过的:
journalctl -xeu kubelet
第五步,部署dns ,安装weave 网络
网络方案不少,有weave 和 flanneld等,这里选择weave,这里注意wave-kube 的版本与前面的image 的版本要求是一致的。
kubectl apply -f https://git.io/weave-kube-1.6
这里安装成功的话,执行下面命令,查看全部namespace 的pod 能发现 dns 的三个插件都能running。
kubectl get pods -o wide --all-namespaces
若是发现哪一个pod 是异常的,能够describe 查看event 和log ,基本能debug 出问题在哪里。
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE kube-system etcd-izwz9ap4sedl64wboiyh6cz 1/1 Running 0 55m 172.18.214.46 izwz9ap4sedl64wboiyh6cz kube-system kube-apiserver-izwz9ap4sedl64wboiyh6cz 1/1 Running 0 54m 172.18.214.46 izwz9ap4sedl64wboiyh6cz kube-system kube-controller-manager-izwz9ap4sedl64wboiyh6cz 1/1 Running 0 55m 172.18.214.46 izwz9ap4sedl64wboiyh6cz kube-system kube-dns-3913472980-l8ghd 3/3 Running 0 55m 10.32.0.2 izwz9ap4sedl64wboiyh6cz kube-system kube-proxy-n5332 1/1 Running 0 55m 172.18.214.46 izwz9ap4sedl64wboiyh6cz kube-system kube-scheduler-izwz9ap4sedl64wboiyh6cz 1/1 Running 0 54m 172.18.214.46 izwz9ap4sedl64wboiyh6cz kube-system weave-net-l86wx 2/2 Running 0 48m 172.18.214.46 izwz9ap4sedl64wboiyh6cz
这里能够使用命令查pod 的异常信息,namespace 要指定,不然不能查看系统pod:
kubectl --namespace kube-system logs kube-dns-3913472980-l8ghd
第六步,k8s-2加入master:
非master节点,安装k8s 和 proxy ,pause 的image,而后join。
kubeadm join --token=b17964.5d8a3c14e99cf6aa 192.168.0.11:6443
设置配置文件路径的环境变量:
export KUBECONFIG=/etc/kubernetes/kubelet.conf
稍后,查看Node的运行状况:
kubectl get nodes NAME STATUS AGE VERSION izwz9972b5w4h8a4f1h9z7z Ready 2h v1.6.4 izwz9ap4sedl64wboiyh6cz Ready 4h v1.6.4
两个节点都ready ,表示安装成功。