k8s-demo集群搭建详细步骤03-02:升级Linux内核,优化内核参数,并安装Docker

641 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

一、完善虚拟机模板,为K8s运行环境做准备

1、升级Linux内核

CentOS 7.x 系统自带的3.10.x内核存在Bugs,导致运行的Docker不稳定,解决方案是升级内核到4.4.X以上

[root@128CentOS7 ~]# uname -a
Linux 128CentOS7 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@128CentOS7 ~]# uname -sr
Linux 3.10.0-1160.el7.x86_64
[root@128CentOS7 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
获取http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
警告:/var/tmp/rpm-tmp.u3KKYx: 头V4 DSA/SHA1 Signature, 密钥 ID baadae52: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]
[root@128CentOS7 ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt
已加载插件:fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
... ... ... ... ...
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : kernel-lt-5.4.188-1.el7.elrepo.x86_64                1/1
  验证中      : kernel-lt-5.4.188-1.el7.elrepo.x86_64                1/1

已安装:
  kernel-lt.x86_64 0:5.4.188-1.el7.elrepo

完毕!
[root@128CentOS7 ~]# grub2-set-default 0
[root@128CentOS7 ~]# sync
[root@128CentOS7 ~]# uname -sr
Linux 5.4.188-1.el7.elrepo.x86_64
[root@128CentOS7 ~]#

kernel-lt 和 kernel-ml 二者的区别:
kernel-ml软件包是根据Linux Kernel Archives的主线稳定分支提供的源构建的。 内核配置基于默认的RHEL-7配置,并根据需要启用了添加的功能。 这些软件包有意命名为kernel-ml,以免与RHEL-7内核发生冲突,因此,它们可以与常规内核一起安装和更新。
kernel-lt包是从Linux Kernel Archives提供的源代码构建的,就像kernel-ml软件包一样。 不同之处在于kernel-lt基于长期支持分支,而kernel-ml基于主线稳定分支。

3、配置yum源(阿里云)

[root@128CentOS7 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@128CentOS7 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2523  100  2523    0     0    948      0  0:00:02  0:00:02 --:--:--   948
[root@128CentOS7 ~]# yum clean all
已加载插件:fastestmirror
正在清理软件源: base elrepo extras updates
Cleaning up list of fastest mirrors
Other repos take up 11 M of disk space (use --verbose for details)
[root@128CentOS7 yum.repos.d]# yum makecache
已加载插件:fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
... ... ... ... ... ... ...
base                       | 3.6 kB  00:00:00
elrepo                     | 3.0 kB  00:00:00
extras                     | 2.9 kB  00:00:00
updates                    | 2.9 kB  00:00:00
元数据缓存已建立
[root@128CentOS7 ~]# yum upgrade
[root@128CentOS7 ~]# yum update

4、安装依赖包

[root@128CentOS7 ~]# yum install -y epel-release
[root@128CentOS7 ~]# yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat 
[root@128CentOS7 ~]# yum install -y libseccomp wget socat git

5、设置开机自动加载 IPVS 模块(/etc/modules-load.d/kubernetes.conf)

[root@128CentOS7 ~]# cat >> /etc/modules-load.d/kubernetes.conf <<EOF
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_pe_sip
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr
nf_conntrack
overlay
br_netfilter
EOF

4.19 内核将nf_conntrack_ipv4 更名为 nf_conntrack,之前版本请用 nf_conntrack_ipv4 或者不开启 IPVS,使用 iptables 模式

  • 设置开机加载
[root@128CentOS7 ~]# systemctl enable systemd-modules-load.service
[root@128CentOS7 ~]# reboot
  • 重启后,检查ipvs模块是否加载
[root@128CentOS7 ~]# lsmod | grep -e ip_vs -e nf_conntrack
nf_conntrack_ipv4      15053  6
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_wrr              12697  0
ip_vs_wlc              12519  0
ip_vs_sh               12688  0
ip_vs_sed              12519  0
ip_vs_rr               12600  0
ip_vs_pe_sip           12740  0
nf_conntrack_sip       33780  1 ip_vs_pe_sip
ip_vs_nq               12516  0
ip_vs_lc               12516  0
ip_vs_lblcr            12922  0
ip_vs_lblc             12819  0
ip_vs_ftp              13079  0
nf_nat                 26583  3 ip_vs_ftp,nf_nat_ipv4,nf_nat_ipv6
ip_vs_dh               12688  0
ip_vs                 145458  24 ip_vs_dh,ip_vs_lc,ip_vs_nq,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_vs_lblcr,ip_vs_lblc
nf_conntrack          139264  8 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_sip,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
[root@128CentOS7 ~]#

6、关闭防火墙、SWAP分区及SELinux

  • 关闭防火墙,清理防火墙规则,设置默认转发策略
[root@128CentOS7 ~]# systemctl stop firewalld
[root@128CentOS7 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@128CentOS7 ~]# iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
[root@128CentOS7 ~]# iptables -P FORWARD ACCEPT
  • 关闭swap分区,否则kubelet会启动失败,也可以设置kubelet启动参数 --fail-swap-on为false关闭swap检查
[root@128CentOS7 ~]# swapoff -a
[root@128CentOS7 ~]# cp /etc/fstab /etc/fstab.backup
[root@128CentOS7 ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
[root@128CentOS7 ~]# diff /etc/fstab /etc/fstab.backup
11c11
< #/dev/mapper/centos-swap swap                    swap    defaults        0 0
---
> /dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@128CentOS7 ~]#
  • 关闭 SELinux,否则 kubelet 挂载目录时可能报错Permission denied
[root@128CentOS7 ~]# setenforce 0
[root@128CentOS7 ~]# cp /etc/selinux/config /etc/selinux/config.backup
[root@128CentOS7 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@128CentOS7 ~]# diff /etc/selinux/config /etc/selinux/config.backup
7c7
< SELINUX=disabled
---
> SELINUX=enforcing
[root@128CentOS7 ~]# sestatus -v
SELinux status:                 disabled
[root@128CentOS7 ~]# getenforce
Disabled
[root@128CentOS7 ~]# 
  • 查看SELinux状态:getenforce 或 sestatus

7、优化内核参数

[root@128CentOS7 ~]# cat > /etc/sysctl.d/sysctl.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
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
EOF
[root@128CentOS7 ~]# sysctl -p /etc/sysctl.d/sysctl.conf

4.12之前版本内核需要关闭 tcp_tw_recycle,否则与NAT冲突,可能导致服务不通,即在上面文件中添加一行 net.ipv4.tcp_tw_recycle=0 4.12版本内核开始不存在这个问题

8、关闭无关的服务

[root@128CentOS7 ~]# systemctl stop postfix && systemctl disable postfix

9、设置系统时区、时钟同步

[root@128CentOS7 ~]# timedatectl set-timezone Asia/Shanghai
[root@128CentOS7 ~]# systemctl enable chronyd
[root@128CentOS7 ~]# systemctl start chronyd

二、安装Docker

1、卸载旧版本(如果安装过旧版本的话)

[root@128CentOS7 ~]# rpm -qa | grep docker
[root@128CentOS7 ~]# yum remove docker docker-common docker-selinux docker-engine
[root@128CentOS7 ~]# rm -rf /var/lib/docker

2、安装Docker依赖的软件包

[root@128CentOS7 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  • yum-util提供yum-config-manager功能
  • 另外两个是devicemapper驱动依赖

3、设置Docker的yum源

[root@128CentOS7 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@128CentOS7 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 这里使用的是阿里云镜像

4、安装Docker的稳定版本

  • 更新yum缓存
  • 查看所有仓库中所有docker版本
  • 选择特定版本安装
[root@128CentOS7 ~]# yum clean all
[root@128CentOS7 ~]# yum makecache fast
[root@128CentOS7 ~]# yum list docker-ce --showduplicates | sort -r
[root@128CentOS7 ~]# yum install -y docker-ce-20.10.9-3.el7.x86_64

5、配置Docker镜像加速:/etc/docker/daemon.json

[root@128CentOS7 ~]# vi /etc/docker/daemon.json
{
    "storage-driver": "overlay2",
    "registry-mirrors":[ "https://h7p1ls20.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ],
    "max-concurrent-downloads": 20,
    "max-concurrent-uploads": 5
}

6、设置开机启动

[root@128CentOS7 ~]# systemctl start  docker
[root@128CentOS7 ~]# systemctl enable docker

7、验证Docker是否安装成功

[root@128CentOS7 ~]# docker version
[root@128CentOS7 ~]# docker info
[root@128CentOS7 ~]# docker -h

8、复制镜像仓库harbor.demo证书,并验证

[root@128CentOS7 ~]# scp root@harbor.demo:/etc/docker/certs.d/harbor.demo/*  /etc/docker/certs.d/harbor.demo/
[root@128CentOS7 ~]# systemctl restart docker
[root@128CentOS7 ~]# docker login harbor.demo
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root:718@master1 ~]#
  • 确保后续克隆的每台虚拟机都可以成功登录harbor.demo 并顺利拉取镜像

参考: clodfisher.github.io/2018/09/nf_…


  • 先用起来,通过操作实践认识kubernetes(k8s),积累多了自然就理解了
  • 把理解的知识分享出来,自造福田,自得福缘
  • 追求简单,容易使人理解,知识的上下文也是知识的一部分,例如版本,时间等
  • 欢迎留言交流,也可以提出问题,一般在周末回复和完善文档
  • Jason@vip.qq.com 2022-3-30