首页 > 其他分享 >K8S 初始化系统和全局变量

K8S 初始化系统和全局变量

时间:2023-01-18 13:00:11浏览次数:57  
标签:初始化 K8S kubernetes kubelet etc systemctl 内核 k8s 全局变量

集群规划

  • k8s-01:172.17.10.51
  • k8s-02:172.17.10.52
  • k8s-03:172.17.10.53

三台机器混合部署本文档的 etcd、master 集群和 woker 集群。

如果没有特殊说明,需要在所有节点上执行本文档的初始化操作

设置主机名

hostnamectl set-hostname k8s-01 # 将 k8s-01 替换为当前主机名

如果 DNS 不支持主机名称解析,还需要在每台机器的 ​​/etc/hosts​​ 文件中添加主机名和 IP 的对应关系:

cat >> /etc/hosts <<EOF
172.17.10.51 k8s-01
172.17.10.52 k8s-02
172.17.10.53 k8s-03
EOF

使用 bash 命令可以生效

添加节点信任关系

本操作只需要在 k8s-01 节点上进行,设置 root 账户可以无密码登录所有节点:

ssh-keygen -t rsa 
ssh-copy-id k8s-01
ssh-copy-id k8s-02
ssh-copy-id k8s-03

更新 PATH 变量

echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
source /root/.bashrc

安装依赖包

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_thresh2=2048
net.ipv4.neigh.default.gc_thresh3=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

设置系统时区

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

标签:初始化,K8S,kubernetes,kubelet,etc,systemctl,内核,k8s,全局变量
From: https://blog.51cto.com/u_15222272/6019207

相关文章

  • k8s 存储卷
     在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。因为Pod是有生命周期的,如果pod不挂载数据......
  • K8S 创建 CA 根证书和秘钥
    前戏为确保安全,​​kubernetes​​​ 系统各组件需要使用 ​​x509​​ 证书对通信进行加密和认证。CA(CertificateAuthority)是自签名的根证书,用来签名后续创建的其......
  • jmeter添加全局变量,跨线程组传递参数
    在软件测试中,当我们想把某个变量值想设置为全局变量,也就是在任何一个线程组都可以使用该变量时,我们就要用到BeanShell取样器,示例如下:1.拿到某个接口的变量值2.通过BeanSh......
  • K8S Operator的开发与使用
    从应用角度考虑,为什么会出现如此多的Operator场景,为什么很多中间件和厂商都会提供基于Operator的部署方案,他的价值是什么?随着时代的发展,企业应用部署环境从传统的物理机->......
  • K8s Etcd备份与恢复
    kubenetes使用Etcd数据库存储集群中的数据,安全起见,一定要备份.kubeadm方式部署:备份ETCDCTL_API=3etcdctlsnapshotsave/opt/etcd.db\--endpoints=https://127.0.......
  • K8s Etcd备份与恢复
    kubenetes使用Etcd数据库存储集群中的数据,安全起见,一定要备份.kubeadm方式部署:1备份ETCDCTL_API=3etcdctlsnapshotsave/opt/etcd.db\--endpoints=https://127.0.0.1......
  • k8s master高可用
    每台master都要部署haproxy,keepalived keepalived配置文件:!ConfigurationFileforkeepalivedglobal_defs{router_idLVS_DEVELscript_userrootenable_s......
  • 数组的初始化
    1.动态初始化: 数据类型 数组名[]=new数据类型[数组中元素个数]; 或 数据类型 []数组名=new数据类型[数组中元素个数];2.静态初始化:   数据类型 ......
  • k8s查看公开的端口
    1、kbgetsvc2,kbdescribesvcdf-kudu-master-service  3,以上kuduweb公开的是31603端口http://192.168.0.69:31603/#/......
  • k8s pod 抓包
    首先安装tcpdump:yuminstalltcpdumpkubectlgetpod-owide查看pod在哪个节点上dockerps查看container的id查看pid:dockerinspect-f{{.State.Pid}}$containeri......