脚本自动化安装kubernetes1.7 master

前置条件

安装一个纯净的centos7,并且固定IP(教程自己网上搜,很简单),并且确认网络畅通哦!接下来所有的事情都交给脚本。

开始安装

两个执行脚本kubernetes-init-1.shkubernetes-init-2.sh,按照顺序执行即可。
这边解释一下为什么分成两个脚本而不是一个脚本。因为第一个脚本执行会更新内核,需要重启让内核生效。然后才能执行第二个脚本,其中第二个脚本会自动安装dockerkubernetes和它所需要的扁平化网络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安装完毕,如果需要加入集群,从节点需要按照日志文件中最后的提示操作即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值