最近为了搭建自己的k8s集群,遇到好多问题,今天终于安装成功了。故记录下来,给需要的小伙伴参考。
安装环境:
环境:ubuntu16.04
1个master
3个node
预先准备:
(1)四台ubuntu16.04版本的服务器(也可以是3,5台)
(2)所有节点都是root登录,并在master节点上设置免密登录,让master节点能免密登录到任何节点。至于如何免密登录,请参考我的文章:ubuntu设置免密登录
安装步骤:
(1)安装docker,【在所有节点上执行】
执行下面的脚本
#!/bin/bash
#SET UP THE REPOSITORY
apt-get remove docker docker-engine docker.io
apt-get update
apt-get install -y -q \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
#install docker
apt-get update && apt-get install docker-ce=18.06.0~ce~3-0~ubuntu
可能遇到的问题:安装docker的时候可能会遇到问题,找不到docker-ce这个包
解决方法:apt-get upgrade
查看docker安装是否成功:docker version
(2)安装kubeadm, kubelet,kubectl 【在master节点执行】
a. 下载k8s_ubuntu_deb.zip,这里是将kubeadm, kubelet,kubectl先下载下来本地安装. 下载地址:https://github.com/zoux86/k8s/blob/master/k8s_ubuntu_deb.zip
b.然后在解压后的目录执行下面的命令
#!/bin/bash
apt-get install -y -q socat ebtables ethtool
dpkg -i kubernetes-cni_0.5.1-00_amd64.deb
dpkg -i kubelet_1.8.7-00_amd64.deb
dpkg -i kubectl_1.8.7-00_amd64.deb
dpkg -i kubeadm_1.8.7-00_amd64.deb
systemctl enable kubelet
systemctl start kubelet
(3)提前获取所需要的镜像
由于被墙的原因。这里是提前从dockerhub上下载所需要的镜像,然后tag为google镜像。执行下面的命令:
#!/bin/bash
ufw disable
# 关闭swap,重启后会失效,可加入到启动脚本rc.local里
swapoff -a
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
# pull镜像重新标记tag
images=(kube-scheduler-amd64:v1.8.7 \
kube-apiserver-amd64:v1.8.7 \
kube-proxy-amd64:v1.8.7 \
kube-controller-manager-amd64:v1.8.7
etcd-amd64:3.0.17 \
pause-amd64:3.0 \
k8s-dns-sidecar-amd64:1.14.5 \
k8s-dns-kube-dns-amd64:1.14.5 \
k8s-dns-dnsmasq-nanny-amd64:1.14.5 \
kubernetes-dashboard-amd64:v1.8.1)
for imageName in ${images[@]} ; do
docker pull andylo25/$imageName
docker tag andylo25/$imageName gcr.io/google_containers/$imageName
docker rmi andylo25/$imageName
done
(4)启动集群,master节点
kubeadm init --kubernetes-version=v1.8.7 --pod-network-cidr 10.244.0.0/16
初始化正常后会在最后的地方一个加入集群的提示命令:
如下:
kubeadm join --token 34fb5a.87ec418b32857c65 192.168.129.133:6443 --discovery-token-ca-cert-hash sha256:da4765f5721db7ed2130c265a71e849005f0334aeb821cd05ec9c9020e036919
(5)如果非root用户下想使用kubelet,进行下面的操作
切换到非root用户下,然后执行下面的命令:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
到这一步可以使用 kubectl get pods -n kube-system
查看pod的情况,处理fannel节点不正常外,其他pod都是正常running的.
如果查看不成功,显示拒绝访问或者端口权限问题,在命令行加入这个命令:
export KUBECONFIG=/etc/kubernetes/kubelet.conf
然后在使用kubectl命令。
(6) 安装网络插件
安装cni插件flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
注意:一定要使用v0.9.1。千万不要使用https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml,用这个会有问题,亲测。
这时候kubectl get pods -n kube-system,会发现所有的pod都启动起来了。
(7)向集群中加入node节点 【所有work节点上】
a.确保所有节点都安装了docker
b. 解压k8s_ubuntu_deb.zip,在同级目录下执行下面的脚本
#!/bin/bash
ufw disable
# 关闭swap,重启后会失效,可加入到启动脚本rc.local里
swapoff -a
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf
# 安装k8s相关软件
apt-get install -y -q socat ebtables ethtool
dpkg -i kubernetes-cni_0.5.1-00_amd64.deb
dpkg -i kubelet_1.8.7-00_amd64.deb
dpkg -i kubectl_1.8.7-00_amd64.deb
dpkg -i kubeadm_1.8.7-00_amd64.deb
systemctl enable kubelet
systemctl start kubelet
# pull镜像重新标记tag
images=(kube-proxy-amd64:v1.8.7 \
pause-amd64:3.0 \
kubernetes-dashboard-amd64:1.8.1)
for imageName in ${images[@]} ; do
docker pull andylo25/$imageName
docker tag andylo25/$imageName gcr.io/google_containers/$imageName
docker rmi andylo25/$imageName
done
c. # 执行加入集群命令 【这个不要抄我的,用你主节点输出的join命令】
kubeadm join --token 34fb5a.87ec418b32857c65 192.168.129.133:6443 --discovery-token-ca-cert-hash sha256:da4765f5721db7ed2130c265a71e849005f0334aeb821cd05ec9c9020e036919
等待一段时间,在master上执行:
kubectl get node
kubectl get pods -n kube-system
会发现所有的节点已经加入,并工作正常。
可能遇到的问题:
(1) 如果发现pod都是正常运行的,node是 Ready,SchedulingDisabled 状态
解决方法:kubectl uncordon node-ip
使用uncordon命令解除对node-ip机器的限制