前置条件
安装一个纯净的centos7,并且固定IP(教程自己网上搜,很简单),并且确认网络畅通哦!接下来所有的事情都交给脚本。
开始安装
两个执行脚本kubernetes-init-1.sh
,kubernetes-init-2.sh
,按照顺序执行即可。
这边解释一下为什么分成两个脚本而不是一个脚本。因为第一个脚本执行会更新内核,需要重启让内核生效。然后才能执行第二个脚本,其中第二个脚本会自动安装docker
、kubernetes
和它所需要的扁平化网络flannel
。
kubernetes-init-1.sh 如下:
#!/bin/sh
is_centos7=$(hostnamectl | grep centos:7)
# 是否是centos7
if [ -z "$is_centos7" ]; then
echo "当前系统不是Centos:7,脚本无法执行操作"
exit 1
fi
if [ `whoami` != "root" ]; then
echo '本脚本只能是能root账户执行'
exit 1
fi
echo "====================下载net-tools工具===================="
yum install -y net-tools
echo "====================设置主机===================="
echo -n "输入主机名:"
read hostname
host_ip=$(ifconfig | grep -A 1 ens33 | awk '/inet/ {print $2}')
echo $hostname $host_ip >> /etc/hosts
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp vim net-tools wget git bind-utils lrzsz zip unzip
systemctl stop firewalld && systemctl disable firewalld && yum install -y iptables-services && systemctl start iptables && systemctl enable iptables
iptables -F
service iptables save
swapoff -a && sed -i '/swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
cat > kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1 # 开启ip4网桥模式
net.bridge.bridge-nf-call-ip6tables=1 # 开启ip6网桥模式
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁用 swap 空间,只有当前系统OOM时才允许使用
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1 # 开启ip6协议
net.netfilter.nf_conntrack_max=2310720
EOF
mv kubernetes.conf /etc/sysctl.d/kubernetes.conf
# 从kubernetes.conf中加载系统参数,不指定的话回默认去读取/etc/sysctl.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
systemctl stop postfix && systemctl disable postfix
# 持久化目录
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间
SystemMaxUse=10G
# 单日志文件最大
SystemMaxFileSize=200M
# 日志保存时间
MaxRetentionSec=2week
# 不将日志文件转发到syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
echo "--------------------开始更新内核--------------------"
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
kernel_version=$(yum --enablerepo=elrepo-kernel install -y kernel-lt | grep -o [0-9].*\.elrepo.[X,x]86_64)
if [ -z '$kernel_version' ]; then
echo '更新内核失败,请手动更新内核后重启'
exit 1
fi
kernel_version="CenteOS Linux ("$kernel_version") 7 (Core)"
echo '最新版本更新的内核是:'$kernel_version
grub2-set-default "$kernel_version"
while true
do
echo -n "内核更新完成,是否立即重启重启?(y/n):"
read need_reboot
if [ "$need_reboot"x = "y"x ]; then
reboot
break
fi
if [ "$need_reboot"x = "n"x ]; then
echo '请自行重启,重启后内核才会升级成功!'
exit 1
fi
echo '只能输入y或者n'
continue
done
kubernetes-init-2.sh 如下:
#!/bin/sh
is_centos7=$(hostnamectl | grep centos:7)
# 是否是centos7
if [ -z "$is_centos7" ]; then
echo "当前系统不是Centos:7,脚本无法执行操作"
exit 1
fi
if [ `whoami` != "root" ]; then
echo '本脚本只能是能root账户执行'
exit 1
fi
cd ~
echo '--------------------加载ipvs需要引用的内核模块--------------------'
# 加载内核模块中的br_netfilter
modprobe br_netfilter
# 引导ipvs需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 引导模块后输出,看模块是否成功引导
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 使用阿里的源
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
echo '--------------------安装docker--------------------'
# 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"exec-opts":["native.cgroupdrivers=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
sed -i 's/fd:\/\/ --containerd=\/run\/containerd\/containerd.sock/tcp:\/\/0.0.0.0:2375 -H unix:\/\/var\/run\/docker.sock/' /usr/lib/systemd/system/docker.service
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
echo '--------------------安装kubernetes 1.17.0--------------------'
yum install -y kubeadm-1.17.0 kubectl-1.17.0 kubelet-1.17.0 && systemctl enable kubelet
# 导出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm-config.yaml
cat >> ./kubeadm-config.yaml << EOF
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
EOF
host_ip=$(ifconfig | grep -A 1 ens33 | awk '/inet/ {print $2}')
sed -i "s/advertiseAddress:.*/advertiseAddress: $host_ip/" ./kubeadm-config.yaml
sed -i "s/imageRepository:.*/imageRepository: registry.aliyuncs.com\/google_containers/" ./kubeadm-config.yaml
sed -i '/serviceSubnet/a\ podSubnet: 10.244.0.0/16' ./kubeadm-config.yaml
echo '--------------------开始拉取kubernetes所需镜像---------------------'
kubeadm config images pull --config kubeadm-config.yaml
echo '--------------------初始化kubernetes master--------------------'
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo '--------------------开始部署flannel--------------------'
cd ~ && mkdir install-k8s && mv kubeadm-config.yaml kubeadm-init.log ~/install-k8s && cd ~/install-k8s && mkdir core && mv * core/
cd ~/install-k8s && mkdir plugin && cd ./plugin && mkdir flannel && cd ./flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sed -i 's/quay.io\/coreos\/flannel:*/quay.io\/coreos\/flannel:v0.12.0-amd64/' /usr/local/install-k8s/plugin/flannel/kube-flannel.yml
kubectl create -f kube-flannel.yml
cd ~ && mv install-k8s /usr/local/
后续说明
当你执行完两个脚本后,使用如下命令查看节点是否准备好:
[root@kubernetes-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 3d9h v1.17.0
如果STATUS
等于NotReady
,应该是flannel
还在安装当中。部署flannel
需要拉取quay.io/coreos/flannel
这个docker镜像。镜像属于外网,拉取会很慢甚至是失败,这样你的STATUS
会一直等于NotReady
。
输入如下的命令查看flannel的部署情况:
[root@kubernetes-master ~]# kubectl describe pod $(kubectl get pod -n kube-system | awk '/kube-flannel/ {print $1}') -n kube-system
输出结果拉到最下面,如果一直显示镜像拉去中,可以手动导入镜像。下载quay.io/coreos/flannel:v0.12.0-amd64
版本的docker镜像。
flannel的docker镜像文件链接: https://pan.baidu.com/s/1x9bN9w20QTucmUBOhjLspA 提取码: 8zqw
下载好镜像后,进入镜像文件所在的目录,执行如下命令
docker load -i flannel_v0.12.0-amd64.tar
此时再查看node节点的状态,如果变为Ready
,表示安装成功!
初始日志文件
kubernetes master的初始化日志文件被脚本保存到/usr/local/install-k8s/core
目录下。后续需要这个文件,从节点才能加入kubernetes集群。
# 查看kubernetes master初始化日志
[root@kubernetes-master core]# cat /usr/local/install-k8s/core/kubeadm-init.log
此时一个单节点的kubernetes安装完毕,如果需要加入集群,从节点需要按照日志文件中最后的提示操作即可。