1. 程式人生 > 實用技巧 >centos7升級核心

centos7升級核心

安裝依賴包

yum install -y epel-release
yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
  • 本文件的 kube-proxy 使用 ipvs 模式,ipvsadm 為 ipvs 的管理工具;
  • etcd 叢集各機器需要時間同步,chrony 用於系統時間同步;

關閉防火牆

關閉防火牆,清理防火牆規則,設定預設轉發策略:

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

關閉 swap 分割槽

關閉 swap 分割槽,否則kubelet 會啟動失敗(可以設定 kubelet 啟動引數 --fail-swap-on 為 false 關閉 swap 檢查):

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

關閉 SELinux

關閉 SELinux,否則 kubelet 掛載目錄時可能報錯Permission denied

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

優化核心引數

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
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh1=2048
net.ipv4.neigh.default.gc_thresh1=4096
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
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
  • 關閉 tcp_tw_recycle,否則與 NAT 衝突,可能導致服務不通;

設定系統時區

timedatectl set-timezone Asia/Shanghai

設定系統時鐘同步

systemctl enable chronyd
systemctl start chronyd

檢視同步狀態:

timedatectl status

輸出:

System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
  • System clock synchronized: yes
    ,表示時鐘已同步;
  • NTP service: active,表示開啟了時鐘同步服務;
# 將當前的 UTC 時間寫入硬體時鐘
timedatectl set-local-rtc 0

# 重啟依賴於系統時間的服務
systemctl restart rsyslog 
systemctl restart crond

關閉無關的服務

systemctl stop postfix && systemctl disable postfix

建立相關目錄

建立目錄:

mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

分發叢集配置引數指令碼

後續使用的環境變數都定義在檔案environment.sh中,請根據自己的機器、網路情況修改。然後拷貝到所有節點:

source environment.sh # 先修改
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp environment.sh root@${node_ip}:/opt/k8s/bin/
    ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  done

升級核心

CentOS 7.x 系統自帶的 3.10.x 核心存在一些 Bugs,導致執行的 Docker、Kubernetes 不穩定,例如:

  1. 高版本的 docker(1.13 以後) 啟用了 3.10 kernel 實驗支援的 kernel memory account 功能(無法關閉),當節點壓力大如頻繁啟動和停止容器時會導致 cgroup memory leak;
  2. 網路裝置引用計數洩漏,會導致類似於報錯:"kernel:unregister_netdevice: waiting for eth0 to become free. Usage count = 1";

解決方案如下:

  1. 升級核心到 4.4.X 以上;
  2. 或者,手動編譯核心,disable CONFIG_MEMCG_KMEM 特性;
  3. 或者,安裝修復了該問題的 Docker 18.09.1 及以上的版本。但由於 kubelet 也會設定 kmem(它 vendor 了 runc),所以需要重新編譯 kubelet 並指定 GOFLAGS="-tags=nokmem";
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"

這裡採用升級核心的解決辦法:

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安裝完成後檢查 /boot/grub2/grub.cfg 中對應核心 menuentry 中是否包含 initrd16 配置,如果沒有,再安裝一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 設定開機從新核心啟動
grub2-set-default 0

重啟機器:

sync
reboot