一、准备环境

准备如下表所示服务器

hostname

规格(最小)

镜像

kubernetes版本

master01

2U4G

centos 7.6

v1.18.8

master02

2U4G

centos 7.6

v1.18.8

master03

2U4G

centos 7.6

v1.18.8

node01

2U4G

centos 7.6

v1.18.8

···

···

···

···

二、高可用架构

采用kubeadm方式搭建高可用k8s集群,k8s集群的高可用实际是k8s各核心组件的高可用,这里使用主备模式,架构如下:

高可用架构技术社区 高可用部署_高可用架构技术社区


主备模式高可用架构说明:

核心组件

高可用模式

高可用实现方式

apiserver

主备

keepalived

controller-manager

主备

leader election

scheduler

主备

leader election

etcd

集群

kubeadm

apiserver 通过keepalived实现高可用,当某个节点故障时触发keepalived vip 转移;
controller-manager k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个controller-manager组件运行;
scheduler k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个scheduler组件运行;
etcd 通过运行kubeadm方式自动创建集群来实现高可用,部署的节点数为奇数,3节点方式最多容忍一台机器宕机。

三、安装前准备工作

# 关闭SELINUX并禁用
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 关闭swap分区并禁用
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 关闭防火墙并禁用
systemctl disable firewalld && systemctl stop firewalld

# 设置网卡1信息(内网网卡)设置IP、子网掩码即可(千万别配网关否则无法上网)
vim /etc/sysconfig/network-scripts/ifcfg-ens33

# 设置网卡2信息,使其能正常上网(外网网卡)需要填写IP、子网掩码、网关、DNS
vim /etc/sysconfig/network-scripts/ifcfg-ens34

# 分别在各节点设置系统主机名
hostnamectl  set-hostname  k8s-master01
hostnamectl  set-hostname  k8s-master02
hostnamectl  set-hostname  k8s-master03
hostnamectl  set-hostname  k8s-node01

# 修改hosts文件hosts文件的相互解析
cat >>/etc/hosts<<EOF
192.168.60.21 k8s-master01
192.168.60.22 k8s-master02
192.168.60.23 k8s-master03
192.168.60.24 k8s-node01
EOF

# 配置yum源(公网&光盘)
mkdir /etc/yum.repos.d/backup && mv /etc/yum.repos.d/* /etc/yum.repos.d/backup
curl http://mirrors.aliyun.com/repo/Centos-7.repo >> /etc/yum.repos.d/centos-7.repo
yum clean all && yum makecache

# 设置防火墙为iptables并设置空规则
yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables  &&  iptables -F  &&  service iptables save
# 确认是否正确执行
cat /etc/sysconfig/iptables
 
# 安装依赖包
yum -y install conntrack ntpdate ntp ipvsadm ipset sysstat libseccomp wget vim net-tools git vim

# 关闭系统不需要服务(邮件服务)
systemctl stop postfix && systemctl disable postfix

# 调整系统时区
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog crond

# 设置rsyslogd和systemd-journal
(主要是日志会记录两份,一份syslog,一份rsyslogd,占用存储和计算性能,所以设置日志存储位置,方便查阅和管理,不转发syslog)
# 创建持久化保存日志的目录
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
# 写入配置信息至/etc/systemd/journald.conf.d/99-prophet.conf文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
# 重启systemd-journald服务
systemctl restart systemd-journald
 
# 升级系统内核为4.4 
# CentOS 7.x系统自带的3.10.x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定,因此需要将内核版本升级至4.4版本来保证docker、kubernetes的稳定运行
# 查询当前内核版本
uname -r
# 提前下载内核rpm包,将其导入操作系统内
yum -y install kernel-lt-4.4.222-1.el7.elrepo.x86_64.rpm
注意:安装完成后检查/boot/grub2/grub.cfg中对应内核menuentry中是否包含initrd16配置,如果没有,再安装一次!
# 确认内核版本
cat /boot/grub2/grub.cfg | grep 4.4
 
# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.222-1.el7.elrepo.x86_64) 7 (Core)'

# 重启操作系统
shutdown -r now

# 配置转发功能(若此步骤不执行,在加载/etc/sysctl.d/kubernetes.conf文件时会报文件不存在) (kube-proxy开启ipvs的前置条件,启用br_netfilter内核模块(防火墙的底层调度))
modprobe br_netfilter
lsmod | grep br
 
#### 若查询不出结果,则需要安装bridge-utils.x86_64后重新加载
# yum -y install bridge-utils.x86_64
# modprobe bridge && 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 && /bin/bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
 
# 调整内核参数
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
EOF
# 重新加载配置文件
sysctl -p /etc/sysctl.d/kubernetes.conf

####其他选项:
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
net.netfilter.nf_conntrack_max=2310720

# 重启操作系统
shutdown -r now

四、master节点免密登录设置

# 创建密钥文件(仅需在master01上执行即可)
ssh-keygen -t rsa
# 发送给另外两个节点
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.60.22
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.60.23

# 测试
ssh 192.168.60.22
ssh k8s-master03

# 此时,master01可以免密直接登录另外两个节点

五、安装容器运行时docker

# 安装依赖
yum -y install yum-utils device-mapper-persistent-data lvm2

# 添加阿里云的docker-ce镜像库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 查询可安装的docker版本信息 
yum list docker-ce --showduplicates | sort -r
 
# 安装最新版的docker-ce
yum -y install docker-ce

# 创建目录/etc/docker
mkdir /etc/docker

# 配置 daemon.json文件(需要修改)
# Cgroup Driver为systemd;日志文件类型为json文件,大小为100M;镜像仓库地址
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": ["镜像仓库地址"]
}
EOF
 
# 创建/etc/systemd/system/docker.service.d目录
mkdir -p /etc/systemd/system/docker.service.d

# 重启docker服务
systemctl daemon-reload && systemctl start docker && systemctl enable docker

# 验证docker
docker info

六、keepalived安装

注意事项:

  1. 配置文件中的global_defs --> router_id可自定义,但不能一样;
  2. vrrp_instance --> priority 必须不一样,哪个是主值就越大;
  3. vrrp_instance --> virtual_router_id 必须一致,可自定义。
# 安装keepalived(所有master节点均需安装)
yum -y install keepalived

master01配置

more /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master01
}
vrrp_instance VI_1 {
    state MASTER 
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.60.20
    }
}

master02配置

more /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master02
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens33
    virtual_router_id 50
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.60.20
    }
}

master03配置

more /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   router_id master03
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens33
    virtual_router_id 50
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.60.20
    }
}
# 启动keepalived并设置开机自启
systemctl enable keepalived  &&  systemctl start keepalived

七、安装kubernetes

# 查询可安装版本
yum list kubelet --showduplicates | sort -r

# 安装kubeadm、kubectl、kubelet
yum install -y kubeadm-1.18.8 kubectl-1.18.8 kubelet-1.18.8
# 设置kubelet开机自启
systemctl enable kubelet

# 查询当前kubernetes版本初始化所需镜像
kubeadm config images list --kubernetes-version=v1.18.8

# 将镜像pull下来
docker pull $image
···
# 生成初始化yaml配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
# 修改yaml配置文件
vim kubeadm-config.yaml
	localAPIEndpoint:
        advertiseAddress: 192.168.11.31(master服务器IP)
    kubernetesVersion: v1.15.1(版本修改为v1.15.10)
	networking:
      podSubnet: "10.244.0.0/16"(新增该行,信息必须是这样)
      serviceSubnet: 10.96.0.0/12
    (以下全为新增项)
---	
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs
 
# 初始化
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
 
# 创建初始化文件保存目录
mkdir -p /usr/local/kubernetes/init
# 将kubeadm-config.yaml、kubeadm-init.log文件剪切至/usr/local/kubernetes/init
mv kubeadm-config.yaml kubeadm-init.log /usr/local/kubernetes/init
# 执行上述图片(初始化后的反馈结果)中的三条命令

待更新···