风凉需暖心

导航

2. 环境初始化

环境初始化

  1. 修改主机名称,修改DNS解析,对应主机名和IP

(1) 修改主机名

[root@localhost ~]# hostnamectl set-hostname k8s-node01

(2) 修改DNS解析/etc/hosts文件

[root@localhost ~]# cat >> /etc/hosts << EOF

  192.168.124.24 k8s-master01

  192.168.124.26 k8s-master02

  192.168.124.27 k8s-master03

  192.168.124.24 k8s-etcd01

  192.168.124.26 k8s-etcd02

  192.168.124.27 k8s-etcd03

  192.168.124.29 k8s-node01

  192.168.124.30 k8s-node02

  192.168.124.31 k8s-node03

  EOF

  1. 添加docker用户

[root@localhost ~]# useradd -m docker

  1. 无密码ssh信任关系

本篇部署文档所有操作都是在k8s-master01节点上执行,然后远程分发文件到其他节点机器上并远程执行命令,所以需要添加该节点到其它节点的ssh信任关系。

[root@k8s-master01 ~]# ssh-keygen -t rsa

[root@k8s-master01 ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master01

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master02

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-master03

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-node01

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-node02

[root@k8s-master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@k8s-node03

 

以上信任关系设置后,最好手动验证下本节点能否正常无密登陆其他节点

  1. 更新PATH变量,将可执行文件目录添加到PATH环境变量中

将可执行文件目录添加到PATH环境变量中

[root@localhost ~]# echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc

[root@localhost ~]# source /root/.bashrc

  1. 安装依赖包

[root@localhost ~]# yum install -y epel-release

[root@localhost ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget lsof telnet vim wget lrzsz net-tools

  1. 更新系统并重启

[root@localhost ~]# yum -y update && reboot

  1. 关闭不必要的服务,防火墙

[root@k8s-master01 ~]# systemctl stop postfix && systemctl disable postfix

[root@k8s-master01 ~]# systemctl stop firewalld

[root@k8s-master01 ~]# systemctl disable firewalld

[root@k8s-master01 ~]# iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat

[root@k8s-master01 ~]# iptables -P FORWARD ACCEPT

[root@k8s-master01 ~]# firewall-cmd --state

 

  1. 关闭selinux,不然挂在目录时可能报错Permission denied

[root@k8s-node02 ~]# setenforce 0

[root@k8s-node02 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

  1. 关闭swap分区

[root@k8s-master01 ~]# swapoff -a

[root@k8s-master01 ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

  1. 关闭dnsmasq

linux系统开启了dnsmasq(GUI 环境),将系统DNS Server设置为 127.0.0.1,这会导致docker容器无法解析域名,需要关闭它 (centos7系统可能默认没有安装这个服务)

[root@k8s-node01 ~]# systemctl stop dnsmasq

[root@k8s-node01 ~]# systemctl disable dnsmasq

  1. 加载内核模块

[root@k8s-master01 ~]# modprobe ip_vs_rr

[root@k8s-master01 ~]# modprobe br_netfilter

  1. 优化内核参数

[root@k8s-master01 ~]# cat > 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  #由于tcp_tw_recyclekubernetesNAT冲突,必须关闭!否则会导致服务不通。

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  #关闭不使用的ipv6协议栈,防止触发docker BUG.

net.netfilter.nf_conntrack_max=2310720

EOF

     

[root@k8s-master01 ~]# cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf

[root@k8s-master01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf

     

这里需要注意:

必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;

关闭 IPV6,防止触发 docker BUG

  1. 设置系统时区

# 调整系统 TimeZone

[root@k8s-master01 ~]# timedatectl set-timezone Asia/Shanghai

     

# 将当前的 UTC 时间写入硬件时钟

[root@k8s-master01 ~]# timedatectl set-local-rtc 0

     

# 重启依赖于系统时间的服务

[root@k8s-master01 ~]# systemctl restart rsyslog

[root@k8s-master01 ~]# systemctl restart crond

  1. 设置rsyslogd systemd journald (每台节点机都要操作)

systemd journald Centos 7 缺省的日志记录工具,它记录了所有系统、内核、Service Unit 的日志。相比 systemdjournald 记录的日志有如下优势:

-> 可以记录到内存或文件系统;(默认记录到内存,对应的位置为 /run/log/jounal)

-> 可以限制占用的磁盘空间、保证磁盘剩余空间;

-> 可以限制日志文件大小、保存的时间;

-> journald 默认将日志转发给 rsyslog,这会导致日志写了多份,/var/log/messages 中包含了太多无关日志,不方便后续查看,同时也影响系统性能。

     

[root@k8s-master01 ~]# mkdir /var/log/journal           #持久化保存日志的目录

[root@k8s-master01 ~]# mkdir /etc/systemd/journald.conf.d

[root@k8s-master01 ~]# 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
[root@k8s-master01 ~]# systemctl restart systemd-journald

 

  1. 创建k8s相关目录 (每台节点机都要操作)

[root@k8s-master01 ~]# mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

  1. 升级内核 (每台节点机都要操作)

CentOS 7.x系统自带的3.10.x内核存在一些Bugs,导致运行的DockerKubernetes不稳定,例如:

-> 高版本的 docker(1.13 以后) 启用了3.10 kernel实验支持的kernel memory account功能(无法关闭),当节点压力大如频繁启动和停止容器时会导致 cgroup memory leak

-> 网络设备引用计数泄漏,会导致类似于报错:"kernel:unregister_netdevice: waiting for eth0 to become free. Usage count = 1";

解决方案如下:

-> 升级内核到 4.4.X 以上;

-> 或者,手动编译内核,disable CONFIG_MEMCG_KMEM 特性;

-> 或者安装修复了该问题的 Docker 18.09.1 及以上的版本。但由于 kubelet 也会设置 kmem(它 vendor runc),所以需要重新编译 kubelet 并指定 GOFLAGS="-tags=nokmem"

     

这里升级内核方法:

[root@k8s-master01 ~]# uname  -r

3.10.0-1160.31.1.el7.x86_64     

[root@k8s-master01~]#rpm -Uvh

http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

     

安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!

[root@k8s-master01 ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt

     

设置开机从新内核启动

[root@k8s-master01 ~]# grub2-set-default 0

     

重启机器

[root@k8s-master01 ~]# init 6

安装内核源文件(在升级完内核并重启机器后执行,也可以不用执行这一步。可选):

[root@k8s-master01 ~]# yum --enablerepo=elrepo-kernel install kernel-lt-devel-$(uname -r) kernel-lt-headers-$(uname -r)

     

[root@k8s-master01 ~]# uname -r

4.4.180-2.el7.elrepo.x86_64

     

=========================================================

或者也可以采用下面升级内核的方法:

# git clone --branch v1.14.1 --single-branch --depth 1 https://github.com/kubernetes/kubernetes

# cd kubernetes

# KUBE_GIT_VERSION=v1.14.1 ./build/run.sh make kubelet GOFLAGS="-tags=nokmem"

# init 6

=========================================================

     

  1. 关闭NUMA

[root@k8s-master01 ~]# cp /etc/default/grub{,.bak}

[root@k8s-master01 ~]# vim /etc/default/grub   

.........

GRUB_CMDLINE_LINUX="...... numa=off"      # 即添加"numa=0ff"内容

     

重新生成 grub2 配置文件:

# cp /boot/grub2/grub.cfg{,.bak}

# grub2-mkconfig -o /boot/grub2/grub.cfg

 

  1. 变量脚本文件(这一步很关键)

[root@k8s-master01 ~]# vim /opt/k8s/bin/environment.sh

#!/usr/bin/bash

    

# 生成 EncryptionConfig 所需的加密 key

export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

    

# 集群中所有节点机器IP数组(master,node,etcd节点)

export NODE_ALL_IPS=(192.168.124.24 192.168.124.26 192.168.124.27 192.168.124.29 192.168.124.30 192.168.124.31)

# 集群中所有节点IP对应的主机名数组

export NODE_ALL_NAMES=(k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-node03)

   

# 集群中所有master节点集群IP数组

export NODE_MASTER_IPS=(192.168.124.24 192.168.124.26 192.168.124.27)

# 集群中master节点IP对应的主机名数组

export NODE_MASTER_NAMES=(k8s-master01 k8s-master02 k8s-master03)

   

# 集群中所有node节点集群IP数组

export NODE_NODE_IPS=(192.168.124.29 192.168.124.30 192.168.124.31)

# 集群中node节点IP对应的主机名数组

export NODE_NODE_NAMES=(k8s-node01 k8s-node02 k8s-node03)

   

# 集群中所有etcd节点集群IP数组

export NODE_ETCD_IPS=(192.168.124.24 192.168.124.26 192.168.124.27)

# 集群中etcd节点IP对应的主机名数组(这里是和master三节点机器共用)

export NODE_ETCD_NAMES=(k8s-etcd01 k8s-etcd02 k8s-etcd03)

   

# etcd 集群服务地址列表

export ETCD_ENDPOINTS="https://192.168.124.24:2379,https://192.168.124.26:2379,https://192.168.124.27:2379"

    

# etcd 集群间通信的 IP 和端口

export ETCD_NODES="k8s-etcd01=https://192.168.124.24:2380,k8s-etcd02=https://192.168.124.26:2380,k8s-etcd03=https://192.168.124.27:2380"

    

# kube-apiserver 的反向代理(地址端口.这里也就是nginx代理层的VIP地址

export KUBE_APISERVER="https://192.168.124.250:8443"

    

# 节点间互联网络接口名称. 这里我所有的centos7节点机的网卡设备是ens192,而不是eth0

export IFACE="eth0"

    

# etcd 数据目录

export ETCD_DATA_DIR="/data/k8s/etcd/data"

    

# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区

export ETCD_WAL_DIR="/data/k8s/etcd/wal"

    

# k8s 各组件数据目录

export K8S_DIR="/data/k8s/k8s"

    

# docker 数据目录

export DOCKER_DIR="/data/k8s/docker"

    

## 以下参数一般不需要修改

    

# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成

BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"

    

# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段

    

# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)

SERVICE_CIDR="10.254.0.0/16"

    

# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)

CLUSTER_CIDR="172.30.0.0/16"

    

# 服务端口范围 (NodePort Range)

export NODE_PORT_RANGE="30000-32767"

    

# flanneld 网络配置前缀

export FLANNEL_ETCD_PREFIX="/kubernetes/network"

    

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)

export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

    

# 集群 DNS 服务 IP (SERVICE_CIDR 中预分配)

export CLUSTER_DNS_SVC_IP="10.254.0.2"

    

# 集群 DNS 域名(末尾不带点号)

export CLUSTER_DNS_DOMAIN="cluster.local"

    

# 将二进制目录 /opt/k8s/bin 加到 PATH

export PATH=/opt/k8s/bin:$PATH

 

posted on 2021-06-23 18:53  风凉需暖心  阅读(223)  评论(0编辑  收藏  举报