使用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 ,表示安裝成功。