K8S基础知识1---二进制安装

一、K8S集群安装方式:   

kubeadm:自动化安装方式;特点:安装简单,所有节点宕机重启较慢(采用容器管理容器的模式,宿主机宕机重启后先启动容器进程,再启动容器,因此速度较慢),出现故障排查难度大,证书有效期1年故必须每年要升级或获取证书。在VMware中不要使用克隆机创建集群,否则使用过程中出行网卡冲突。
  二进制安装:能清晰认识各组件及其配置,但各组件以进程方式运行,一旦退出则不能自动启动;特点:安装复杂,稳定性更高,重启快速(宿主机宕机重启后直接拉起进程,因此重启速度快),排查故障容易,自定义安装配置使得灵活可控且升级扩容更方便,可深入学习各组件通信;生产环境建议使用。

K8S生产环境安装注意事项:
1)networkManager建议关掉,否则需要修改其配置,不然会出问题。
2)linux内核必须升级至4.18以上,否则docker及K8S会出现各种问题,如:磁盘空间不足,网络突然不通等。升级内核时需要考虑服务器硬件是否支持。
3)docker安装完成后不能出现警告,K8S允许出现部分警告。
4)不要使用带中文的服务器及克隆的虚拟机。
5)K8S二进制安装时各组件版本与etcd版本需对应。
6)宿主机或服务器,K8S service,K8S pod的三个网段不能重复。
7)docker选用19.3版本,该版本经过K8S验证,稳定可靠。
8)新版本kubelet要求linux使用systemd,原因systemV有bug。
9)centOS8没有传入docker的containerD包,需要手动安装。centOS7有该包,无需安装。

 

##########router#############
koolshare原理
    koolshare设置nat模式通过宿主机网卡与外网通信,设置仅主机模式与K8S集群通信。

koolshare安装过程
1、创建win10系统虚拟机;必须设置BIOS(否则无法加载PE系统)、IDE模式(否则无法启动koolshare);网卡2张:仅主机模式+NAT模式;
2、安装前,可调整cpu+mem,以提高安装速度;修改虚拟机内存为4G,加载老毛桃pe系统,启动win10pe;
3、虚拟机挂载软路由koolshare文件:20190419_184043.iso;
4、win10pe读取iso文件,并以管理员身份利用“img写盘工具”将openwrt-koolshare-mod-v2.30-r10402-51ad900e2c-x86-64-combined-squashfs.img写入虚拟机20G空磁盘;
5、关闭虚拟机,调整cpu为1核,mem为1G;设置磁盘启动优先,并重启虚拟机;此时,无法访问koolshare服务;
6、koolshare默认IP为192.168.1.1,则VMware软件仅主机模式网段设置为192.168.1.0/24,静态IP模式;NAT模式设置DHCP模式,网段为192.168.248.0/24;宿主机vmnet1网卡设置IP为:192.168.1.10/24;由于K8S集群使用192.168.0.0/24网段,因此宿主机vmnet1网卡需增加1个IP:192.168.0.10/24;
7、宿主机浏览器登录192.168.1.1,默认密码:koolshare;
8、网络--->接口--->删除WAN6--->保存并应用;
9、网络--->接口--->LAN--->编辑--->物理设置--->查看接口中仅有1块lan接口--->关闭桥接模式,直接使用该仅主机模式的网卡--->保存并应用;
10、网络--->接口--->LAN--->编辑--->基本设置--->协议:静态地址;切换协议;设置网关IP地址为192.168.0.1/24--->保存并应用; 
11、网络--->诊断--->ping www.baidu.com,网络畅通即可;表示可访问国内外网。

koolshare故障排查
问题1:LAN修改IP后,保存失败,无法使用? 
问题描述:“在20秒内确认应用失败,等待回滚...”;
原因分析:强制写入IP后使得原IP失效,新IP生效,
解决方法:稍等几分钟,使用新IP直接登录koolshare即可。

问题2:软路由无法访问外网? 
问题描述:ping: bad address 'www.baidu.com'
原因分析:NAT网卡未选择动态分配IP;
解决方法:设置wan的网段,并选择动态分配IP。

##########router#############



##########K8S-master01#############
K8S-master安装步骤
1、创建centos7虚拟机;
2、安装centos7系统;
×××master01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
3、设置系统IP、网关、DNS等;
BOOTPROTO=none
IPADDR=192.168.0.107
PREFIX=24
GATEWAY=192.168.0.1     #设置为软路由koolshare的地址;
DNS1=192.168.0.1        #设置为软路由koolshare的地址;
×××master02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
BOOTPROTO=none
IPADDR=192.168.0.108
PREFIX=24
GATEWAY=192.168.0.1     #设置为软路由koolshare的地址;
DNS1=192.168.0.1        #设置为软路由koolshare的地址;
×××master03×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
BOOTPROTO=none
IPADDR=192.168.0.109
PREFIX=24
GATEWAY=192.168.0.1     #设置为软路由koolshare的地址;
DNS1=192.168.0.1        #设置为软路由koolshare的地址;
×××node01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
BOOTPROTO=none
IPADDR=192.168.0.110
PREFIX=24
GATEWAY=192.168.0.1     #设置为软路由koolshare的地址;
DNS1=192.168.0.1        #设置为软路由koolshare的地址;
×××node02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
BOOTPROTO=none
IPADDR=192.168.0.111
PREFIX=24
GATEWAY=192.168.0.1     #设置为软路由koolshare的地址;
DNS1=192.168.0.1        #设置为软路由koolshare的地址;
×××node02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
4、xshell连接K8S各节点主机,进行集群部署。
ping baidu.com   #测试K8S各节点是否能通过koolshare访问外网。

×××master01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
hostnamectl set-hostname k8s-master01 #所有节点设置主机名
×××master02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
hostnamectl set-hostname k8s-master02
×××master03×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
hostnamectl set-hostname k8s-master03
×××node01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
hostnamectl set-hostname k8s-node01
×××node02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
hostnamectl set-hostname k8s-node02
×××node02×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

##所有节点配置hosts
echo '
192.168.0.107   k8s-master01
192.168.0.108   k8s-master02
192.168.0.109   k8s-master03
192.168.0.236   k8s-master-lb   #如果不是高可用集群,则该IP为master01的IP;
192.168.0.110  k8s-node01
192.168.0.111  k8s-node02
192.168.0.100   hub.atguigu.com
' >>/etc/hosts
hostname;cat /etc/hosts

##所有节点设置yum源,可指定为公司的yum源;本次采用阿里云的yum源;
cd;mv /etc/yum.repos.d{,.bak.`date +%y%m%d`};mkdir /etc/yum.repos.d/
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
yum clean all;yum makecache fast;yum repolist all

##所有节点安装基础软件
yum -y install wget jq psmisc vim-enhanced net-tools telnet git yum-utils device-mapper-persistent-data lvm2 unzip  #在新主机上首次安装Docker Engine-Community之前,需要设置Docker仓库。yum-utils 提供了yum-config-manager ,并且device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。jq是Linux下面把文本字符串格式化成json格式的工具;psmisc包含进程管理命令;
yum list wget jq psmisc vim-enhanced net-tools telnet git yum-utils device-mapper-persistent-data lvm2 unzip

##所有节点关闭并禁用防火墙,dnsmasq,NetworkManager(centos7需关闭该服务,centos8不需关闭该服务)
systemctl disable --now firewalld;systemctl disable --now iptables;systemctl disable --now dnsmasq;systemctl disable --now NetworkManager
systemctl status firewalld;systemctl status dnsmasq;systemctl status NetworkManager;systemctl status iptables

##所有节点关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled' /etc/selinux/config
getenforce;grep -Ev '^#|^$' /etc/selinux/config

##所有节点关闭虚拟内存,目的:使用kubeadm安装K8S集群时会检测swap是否关闭;如果虚拟内存开启,pod就可能会放在虚拟内存中运行,会大大降低工作效率;生产环境中,K8S集群也要求关闭虚拟内存。
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab   #/ swap /^\(.*\)$表示匹配到swap这行的首尾为任何字符的所有内容。#\1表示在该行的第一个1位置添加#;
# sed -i '/^[^#]*swap/s@^@#@' /etc/fstab      #表示匹配到swap该行若行首字符不为#时,则在行首添加#;

##所有节点设置系统时区
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0                 #将当前UTC时间写入硬件时钟;

##所有节点同步各节点时间,若时间不同步可能引起证书不可用的情况;
yum -y install ntpdate                      #centos7.9及以后版本不再使用该工具;
date;hwclock
ntpdate ntp1.aliyun.com;hwclock --systohc   #同步系统时钟及硬件时钟;
cat <<eof>> /etc/crontab        #若是非root账户,则手动crontab -e添加定期同步时钟任务;
0 10 * * * root /usr/sbin/ntpdate ntp1.aliyun.com #各节点每天早上10:00同步时钟;
10 10 * * * root hwclock --systohc  #各节点每天早上10:10同步时钟;
eof

##所有节点重启依赖时间的服务
systemctl restart rsyslog;systemctl restart crond
systemctl status rsyslog;systemctl status crond

##所有节点安装wlnmp包,WLNMP是一个基于官方源码二次打包的项目,可以在CentOS/RadHat系统上通过yum源快速部署Nginx/Mysql/PHP等常用服务。
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm  
rpm -qa |grep wlnmp

##所有节点设置资源限制;
ulimit -SHn 65535  #临时生效,重启后失效;ulimit用于shell启动进程所占用的资源,可用于修改系统资源限制;
ulimit
cat <<eof>> /etc/security/limits.conf
soft nofile 655360
hard nofile 131072
soft nproc 655350
hard nproc 655350
soft memlock unlimited
hard memlock unlimited
eof
grep -Ev "^#|^$" /etc/security/limits.conf

##所有节点关闭系统不需要的服务
systemctl disable --now postfix
systemctl status postfix

×××master01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
##仅在master-01部署免密登录其他节点;若使用公有云,由于阿里云SLB不允许反向连接(腾讯云不存在该问题),则需要一台云主机专门部署免密钥登录其他nodes的服务;
ssh-keygen -t rsa  #使用ssh-keygen生成私钥和公钥;依次输入"要生成的文件名,输入密码,重复输入密码";此处不要设置密码,否则使用密钥登录其他node需要输入该密码;
cd /root/.ssh/
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i /root/.ssh/id_rsa.pub $i;done #将公钥发送至各node;依次输入"yes及各主机登录密码";
×××master01×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

##所有节点升级系统内核及软件;K8S高版本要求linux内核必须升级4.18版本以上,否则会出现莫名奇妙的问题,如:pod自动重启,POD网络不通,宿主机宕机|夯死等;
yum update -y --exclude=kernel && reboot  #以yum方式升级非内核的所有包;
wget https://mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-5.13.0-1.el7.elrepo.x86_64.rpm  #下载指定版本内核包;
wget https://mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.13.0-1.el7.elrepo.x86_64.rpm #下载指定版本内核工具包;
yum -y localinstall kernel-*  #安装内核所有包;rpm -ivh kernel-ml-*  #安装内核所有包;
# yum remove -y kernel-3.10.0-957.el7.x86_64 #删除多余内核;当/boot剩余容量不足时,必须删除非运行的内核。
rpm -qa |grep kernel            #查看安装的所有内核及其工具包;
grubby --default-kernel         #查看当前默认启动内核;
uname -r                        #查看当前内核;
awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg  #查看内核启动清单及顺序;
grub2-editenv list              #查看清单中保存的启动内核名称;
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg  #设置默认启动entry为0的内核,并将修改的配置写入grub2.cfg;
# sed -i "/s/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g" /etc/default/grub;update-grub #设置默认启动内核的entry为0,并将修改的配置更新至grub2.cfg;
grubby --args="user.namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
grubby --default-kernel  #查看默认启动内核是否修改完成;
reboot      #重启后使内核生效;
uname -r    #查看内核是否生效;

 

####所有节点安装并配置ipvsadm
yum -y install 
conntrack-tools ipvsadm ipset sysstat conntrack libseccomp #libseccomp用于内核调用;conntrack用于跟踪并且记录连接状态;
yum list conntrack-tools ipvsadm ipset sysstat conntrack libseccomp
##加载ipvsadm模块
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   #内核4.18以前使用该命令;
modprobe -- nf_conntrack          #内核4.19以前使用该命令;
eof
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod |grep -e ip_vs -e nf_conntrack
##开启ipvsadm内核功能;内核版本小于4.19时使用nf_conntrack_ipv4;
cat <<eof> /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
eof
systemctl enable --now systemd-modules-load.service
lsmod |grep -e ip_vs -e nf_conntrack #查看ipvs模块是否加载;
##所有节点调整内核参数,除前3条外其他为优化项。
cat <<eof> /etc/sysctl.d/kubernetes.conf 
net.bridge.bridge-nf-call-iptables=1    #前2条为开启网桥模式,必做,否则安装K8S会报错。
net.bridge.bridge-nf-call-ip6tables=1   #前2条为开启网桥模式,必做,否则安装K8S会报错。
net.ipv6.conf.all.disable_ipv6=1        #关闭IPv6,必做,否则安装K8S会报错。???
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.may_detach_mounts=1             
fs.inotify.max_user_instances=8192      #???
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_max_tw_buckets=36000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_orphans=327680
net.ipv4.tcp_orphan_retries=3
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_sync_backlog=16384
net.ipv4.ip_conntrack_max=65536
net.ipv4.tcp_max_sync_backlog=16384
net.ipv4.tcp_timestamps=0
net.core.somaxconn=16384
eof
sysctl --system;ls /proc/sys/net/bridge  #加载模块,使得/proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/bridge/bridge-nf-call-ip6tables文件存在:
reboot #重启系统,以便确认模块是否加载,确保模块一直被加载;
lsmod |grep --color=auto -e ip_vs -e nf_conntrack

 

#所有节点安装docker软件
yum -y install yum-utils device-mapper-persistent-data lvm2   #添加docker的yum源必需组件;
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加docker的yum源;
yum list docker-ce* --showduplicates | sort -r  #查看可安装版本;
yum list containerd.io --showduplicates | sort -r #CentOS预装了containerd.io;yum升级是无法自动升级预装的containerd.io的,需要手动卸载旧版本后安装新版本。
yum -y remove docker* ;yum remove containerd.io                     #卸载旧版本docker所有包;
yum -y install docker-ce-19.03.11-3.el7 docker-ce-cli-19.03.11-3.el7 containerd.io      #安装指定版本dockers,19.03版本经过K8S验证后运行稳定,且K8S 1.23版本不再使用docker;docker-ce依赖于docker-ce-cli、docker-scan-plugin;建议指定docker-ce-cli的版本,以便统一版本。
mkdir /etc/docker
##native.cgroupdriver=systemd表示交由systemd进行cgroup执行隔离,如果使用systemV则存在bug;日志修改为json-file存储类型,大小为100M;
cat <<eof> /etc/docker/daemon.json 
{
    "exec-opts":["native.cgroupdriver=systemd"],
    "log-driver":"json-file",
    "log-opts":{
        "max-size":"100m"
    }
}
eof
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload && systemctl enable --now docker;systemctl status docker
docker version

 

######安装K8S组件
mkdir -p /opt/cni/bin/  ##所有节点创建目录,以便安装K8S插件
##master01安装K8S组件
wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-server-linux-amd64.tar.gz     #master01下载k8S-server;
# wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-node-linux-amd64.tar.gz       #master01下载k8S-node;
# wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-client-linux-amd64.tar.gz    #master01下载k8S-client;
wget https://storage.googleapis.com/etcd/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz                                #master01下载etcd;必须与K8S版本对应;
tar -xzvf kubernetes-server-linux-amd64.tar.gz --strip-components=3 -C /usr/local/bin/ kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}  #master01安装k8s各组件;go语言开放的K8S组件,只需解压程序包且将其放在linux对应的目录下后进行配置即可使用。因此go语言在以后会更加流行。
tar -xzvf etcd-v3.4.13-linux-amd64.tar.gz  --strip-components=1 -C /usr/local/bin/ etcd-v3.4.13-linux-amd64/etcd{,ctl} #master01安装etcd;
##其他master安装K8S组件
MasterNodes="k8s-master02 k8s-master03";WorkNodes="k8s-node01 k8s-node02" #添加临时变量;
##添加永久变量
cat <<eof> /etc/profile   #profile 是某个用户唯一的用来设置环境变量的地方,
MasterNodes="k8s-master02 k8s-master03"
WorkNodes="k8s-node01 k8s-node02"
eof
cat <<eof> /etc/bashrc  #bashrc是专门用来给bash做初始化的,类似文件有shrc,zshrc;
. /etc/profile
eof
##其他节点安装K8S组件
for Node in ${MasterNodes};do echo ${Node};scp /usr/local/bin/kube{ctl,-apiserver,-controller-manager,-scheduler,let,-proxy} ${Node}:/usr/local/bin/;scp /usr/local/bin/etcd*  ${Node}:/usr/local/bin/;done  #其他master节点的K8S组件、etcd;
for Node in ${WorkNodes};do echo ${Node};scp /usr/local/bin/kube{let,-proxy} ${Node}:/usr/local/bin/;done  #其他work节点的K8S组件;
##检查K8S组件是否正常
kubelet --version;kubectl version;kube-apiserver --version;kube-controller-manager --version;kube-scheduler --version;kube-proxy --version;etcdctl version

 

 

  

 

  

 

 

 

 

 

 

  

posted on 2021-07-12 09:45  chalon  阅读(702)  评论(0编辑  收藏  举报