一、前言
根据10来天研讨网上关于K8s集群的教程,结合手上的硬件配置及实操经验,做个汇总,力求每个指令都说明其作用,知其然知其所以然。仅供参考,主要还是给自己做个笔记。本身就是喜新厌旧的主,后续会持续更新。
最近更新日期:2021-09-16。
二、硬件环境
没有用物理机或虚拟机,生产环境是全套阿里云服务、测试环境主要是华为云服务。当前主要以华为云为例。
服务器都是ECS,阿里云默认勾选购买弹性公网IP,华为云不绑定购买,根据需要另外购买。个人现在认为是否只需要购买两个弹性公网IP即可,一个绑定Master节点,所有暴露端口通过Ingress Nginx反向代理实现,此弹性公网IP固定不解绑;另一个根据实际需要绑定需要运程登录的Worker节点。
阿里云和华为云的ECS都有创建镜像功能,可选择创建整机镜像、系统盘镜像、数据盘镜像 等。一是为了备份,随时可根据情况还原;二是可以在购买ECS扩容时,直接用镜像预装,快速部署。目前发数据盘暂时不知道可以用于做什么,那就先创建系统盘镜像,毕竟这些私有镜像都是收费的。
生产环境下MySQL是用阿里云RDS,测试环境下尝试K8s部署MySQL。文件存储目前是用阿里云OSS和七牛云,所以感觉数据盘看情况挂载,具体就不细说了。
三、软件环境
ECS均选用CentOS 8系统,以下命令均以此系统为准,因为CentOS版本不同,相关指令都有变更,跟参考的教程用的CentOS 7的某些指令就完全不同。
基础示例是用3台ECS服务器,一台是配置成Master节点,另外两台是配置成Worker节点,通过云服务商的虚拟专有网络组成Kubernetes集群。
主机名 | IP | 操作系统 | 角色 |
seak8s-master | 192.168.0.10 | CentOS 8 | Master节点 |
seak8s-node01 | 192.168.0.21 | CentOS 8 | Worker节点 |
seak8s-node02 | 192.168.0.22 | CentOS 8 | Worker节点 |
以下各类节点安装的相关软件。
1、Master节点ECS服务器安装软件
软件名称 | 软件版本 | 暴露端口 | 配置文件 | 功能备注 |
docker | 20.10.8 | /etc/docker/daemon.json | ||
kubelet | 组件工具 | |||
kube-apiserver | 组件工具 | |||
kube-controller-manager | 组件工具 | |||
kube-proxy | 组件工具 | |||
kube-schduler | 组件工具 | |||
etcd | ||||
flannel |
2、 Worker节点ECS服务器安装软件
软件名称 | 软件版本 | 暴露端口 | 配置文件 | 功能备注 |
docker | 20.10.8 | /etc/docker/daemon.json | ||
kubelet | 组件工具 | |||
kube-proxy | 组件工具 | |||
flannel |
四、初始化服务器
无论是阿里云还是华为云ECS服务器都选的是用公共CentOS 8镜像,版本各有不同就不详细比较了。
以下均默认使用root远程登录ECS服务器,命令就省略“sudo”了,根据自身情况添加即可。ECS服务器在加入虚拟专有网络就会自动设置固定内网IP,在这就不再述手动设置方法,总之要设置各个节点的IP为固定IP。
1、升级系统已安装软件到最新版本
升级所有包同时也升级软件和系统内核指令:yum update -y
就是喜欢更新到最新版本的感觉,第一次更新时间略长,安心等待就行。更新完成后可以执行以下两个指令。
查看CentOS系统的当前版本指令:cat /etc/redhat-release
<输出>
CentOS Linux release 8.4.2105
查看CentOS系统的当前内核指令:uname -r
<输出>
4.18.0-240.10.1.el8_3.x86_64
在现在配置Master节点经验发现执行此命令会报错,提示安装了两个版本的kubelet,也是无语了,现计划安装一个软件就执行一下这个指令看看会不会报错,定位问题。
2、清理环境
其实使用公共镜像安装ECS服务器,此部分代码无需执行。
清除Kubernetes指令:
df -h|grep kubelet |awk -F % ‘{print $2}’|xargs umount
rm /var/lib/kubelet/* -rf
rm /etc/kubernetes/* -rf
rm /var/lib/rancher/* -rf
rm /var/lib/etcd/* -rf
rm /var/lib/cni/* -rf
iptables重置nat上网指令:iptables -F && iptables -t nat -F
删除flannel所生成的vxlan设备指令:ip link del flannel.1
docker查看所有容器并删除指令:docker ps -a|awk ‘{print $1}’|xargs docker rm -f
docker查看所有(持久化)数据并删除指令:docker volume ls|awk ‘{print $2}’|xargs docker volume rm
执行以上指令会有报错,看清楚都明白可以忽略。
3、系统配置
3.1、安装依赖包
安装依赖包指令:yum install -y yum-utils device-mapper-persistent-data lvm2 lrzsz conntrack ipvsadm ipset iptables iptables-services curl sysstat libseccomp wget vim net-tools git jq tc
3.2、配置yum源
删除之前可能安装过yum源的残留指令:rm -rfv /etc/yum.repos.d/*
在此选用阿里云的yum源,可打开链接http://mirrors.aliyun.com/repo/挑选适合自己的版本。
添加yum源指令:curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
添加后,可用以下两个指令查看yum源。同时也可以执行一下升级所有包同时也升级软件和系统内核指令,一般会有更新。
查看当前可用yum源指令:yum repolist
查看所有yum源指令:yum repolist all
3.3、安装EPEL
EPEL,即Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包,包括但不限于Red Hat Enterprise Linux (RHEL), CentOS and Scientific Linux (SL), Oracle Enterprise Linux (OEL)。EPEL是社区强烈打造的免费开源发行软件包版本库。
针对系统架构选择相应的类型:http://dl.fedoraproject.org/pub/epel/,在此选择x86_64的相应包。
下载EPEL包指令:wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
安装EPEL包指令:rpm -ivh epel-release-latest-8.noarch.rpm
为了保险起见可执行以下指令,3.2安装完yum源后也是一样。
清理yum缓存和重建yum缓存指令:yum clean all && yum makecache
不过很多人的经验都是可以不执行上一条指令的,感觉yum缓存会自动更新。
3.4、关闭防火墙
关闭防火墙和设置开机禁用防火墙指令:systemctl stop firewalld && systemctl disable firewalld
检查防火墙状态指令:systemctl status firewalld
3.5、关闭SELinux
安全增强型Linux(Security-Enhanced Linux)简称SELinux,它是一个Linux内核模块,也是Linux的一个安全子系统。SELinux主要由美国国家安全局开发。2.6及以上版本的Linux内核都已经集成了SELinux模块。
临时关闭SELinux指令:setenforce 0
永久关闭SELinux指令:sed -i ‘s/enforcing/disable/’ /etc/selinux/config
3.6、关闭swap交换分区
临时关闭swap交换分区指令:swapoff -a
永久关闭swap交换分区指令:sed -ri ‘s/.swap./#&/’ /etc/fstab
关闭后检查是否关闭swap交换分区,若swap行出现的全部是0,则代表已经关闭。
查看Linux内存使用情况指令:free -m 或 free -h
3.7、检查系统时区
ECS服务器一般已经设置好系统时区,我们还是循例检查一下。
查看当前系统时区指令:timedatectl
3.8、设置日志系统
在CentOS 7以后,因为引导方式改为了system.d,使用systemd-journald来做日志中心库,使用rsyslog来做日志持久化,使用logrotate来做日志文件轮转。
systemd-journald守护进程提供一种改进的日志管理服务,可以收集来自内核,启动过程的早期阶段,标准输出,系统日志,以及守护进程启动和运行期间的错误的消息。它将这些消息写到一个结构化的事件日志中,默认情况下不在重新启动之间保留。现更改默认为systemd journald,只保留一个日志的保存方式。
创建保存日志的目录指令: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 # 最大占用空间10G
SystemMaxFileSize=200M # 单日志文件最大200M
MaxRetentionSec=2week # 日志保存时间2周
ForwardToSyslog=no # 不将日志转发到syslog
EOF
重启systemd journald的指令:systemctl restart systemd-journald
3.9、配置主机名称以及配置名称解析
根据自身Kubernetes集群的计划配置主机名称以及配置名称解析。
配置主机名为seak8s-master指令:hostnamectl set-hostname seak8s-master
主机名seak8s-master根据自身需要调整。
查看本机的主机名指令:hostname
打开名称解析配置文件指令:vim /etc/hosts
然后将所有的节点服务的IP和名称加入进去,如:192.168.0.10 seak8s-master 。
3.10、配置iptables
iptables也叫netfilter,是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,他的功能十分强大,使用也非常灵活,可以对流入、流出、流经服务器的数据包进行精细的控制。但在CentOS 7以后已经被阉割掉了,需要自行安装,在此3.1、安装依赖包时已安装。
启动iptables和设置开机启动iptables指令:systemctl start iptables && systemctl enable iptables
清除(filter表)中所有规则指令:iptables -F
保存iptables配置指令:service iptables save
保存iptables配置后必须重启iptables。
重启iptables指令:systemctl restart iptables
查看iptables运行状态指令:systemctl status iptables
4、安装Docker
4.1、添加稳定版仓库
在此选择的是阿里云的Docker仓库。
添加指定yum仓库指令:yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果完全按本文所描述操作,执行上一条指令会提示“Repository extras is listed more than once in the configuration”即相关仓库已存在,无需操作此步骤。
更新yum缓存指令:yum makecache
4.2、安装docker-ce
查看选择docker-ce各版本指令:yum list docker-ce –showduplicates|sort -r
安装指定版本的docker-ce指令:yum install docker-ce-20.10.8-3.el8 -y
安装最新版本的docker-ce指令:yum install docker-ce -y
以上两条指令按自身实际情况选择执行,在此选择安装最新版本的docker-ce。
检查是否安装成功,查看Docker版本指令:docker version
4.3、配置daemon.json
Docker安装后默认没有daemon.json这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json。
创建Docker配置存放目录指令:mkdir /etc/docker
创建Docker配置文件指令:cat > /etc/docker/daemon.json <<EOF
{
“exec-opts”: [“native.cgroupdriver=systemd”], # 让docker与k8s中cgroupdriver保持一致
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“registry-mirrors”: [“https://hlusxtb4.mirror.aliyuncs.com”],
“insecure-registries”: [“192.168.0.10”]
}
EOF
重新加载Docker配置参数指令:systemctl daemon-reload
启动Docker服务和设置开机启动Docker服务指令:systemctl start docker && systemctl enable docker
daemon.json配置参数简介:
一级参数 | 二级参数 | 说明 | 示例值 |
exec-opts | 运行时执行选项。 | [“native.cgroupdriver=systemd”] | |
log-driver | 容器日志驱动程序,默认为:json-file。 | “json-file” | |
log-opts | 容器日志配置参数 | ||
max-size | 滚动前日志的最大大小。一个正整数加上一个代表测量单位(k,m或g)的修饰符。默认为-1(无限制)。 | “100m” | |
max-file | 可以存在的最大日志文件数量。如果滚动日志会创建多余文件,则会删除最旧的文件。只有在设置了max-size时才有效。一个正整数。默认为1。 | “3” | |
labels | 在启动Docker守护进程时适用。守护进程接受的日志相关标签的逗号分隔列表。用于高级日志标记选项。 | “production_status,geo” | |
env | 在启动Docker守护进程时适用。此守护程序接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标记选项。 | “os,customer” | |
env-regex | 与env类似且兼容。一个正则表达式来匹配与日志相关的环境变量。用于高级日志标记选项。 | “^(os” | |
registry-mirrors | 私库加速地址 | [“https://hlusxtb4.mirror.aliyuncs.com”] | |
insecure-registries | 镜像仓库地址 | [“192.168.0.10”] |
引用:
《全网最全的搭建Kubernetes准备工作配置》:https://blog.csdn.net/qq_37840993/article/details/114396787
《局域网使用kubeadm安装k8s》:https://blog.csdn.net/zhaikaiyun/article/details/104273974
《基于Centos8.1 部署 kubernetes 1.20.2》:https://blog.csdn.net/tongzidane/article/details/113942942
《CentOS8安装Kubernetes1.20.2集群》:https://blog.csdn.net/weixin_38920945/article/details/113728463
《Centos 7/8 日志管理》:https://www.cnblogs.com/vincenshen/p/12441492.html
基于原文略有调整,如有不对之处还请指正。