使用kubernetes 搭建集群,因为网络等原因,对于那些初识k8s 的人,是一件很困难的事情,这里记录下整个集群搭建的过程和一些坑。
该文章后续仍在不断的更新修改中, 请移步到原文地址http://www.dmwan.cc/?p=150
一、环境准备,操作系统:centos7.4 。第一个坑就是centos6.8安装阿里源的 kubernetes 会有依赖错误。
ip 地址 | hostname |
192.168.0.11 | k8s-1 |
192.168.0.12 | k8s-2 |
主机名处理,为了防止域名解析出错,这里先修改hostname:
# 写入 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:
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。
这里最大的坑就是兼容性问题,注意最好用centos7。安装方式有两个,一个是自己编译,第二个可以使用阿里的源直接安装rpm 包。
这里使用阿里源安装1.7:
#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 才能很快成功。
这里我写了个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 ,表示安装成功。