IP HOSTNAME ROLE
192.168.72.39 k8s-01 master&node
192.168.72.40 k8s-02 master&node
192.168.72.41 k8s-03 master&node
192.168.72.42 k8s-04 node
192.168.72.43 k8s-05 node
  • 注:提前配置静态IP
SERVER VERSION
Kubernetes 1.19.7
Etcd 3.4.12
Docker 19.03.9
Flannel 0.12.0
Linux:~ # cat /etc/os-release
NAME="SLES"
VERSION="12-SP3"
VERSION_ID="12.3"
PRETTY_NAME="SUSE Linux Enterprise Server 12 SP3"
ID="sles"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:12:sp3"
Linux:~ # uname -r
4.4.73-5-default
  • 注:suse 12 sp3默认的内核是4.4.73的,如内核版本小于4.x,则需要升级内核,因为Docker overlay2需要使用kernel 4.x版本

    • 官方文档:对于运行 Linux 内核版本 4.0 或更高版本,或使用 3.10.0-51 及更高版本的 RHEL 或 CentOS 的系统,overlay2是首选的存储驱动程序。
  • k8s-master 的配置不能小于2c2g,k8s-node 可以给1c1g,集群为奇数,所以不能少于3个master,master和node节点可以复用,8G内存玩起来会很憋屈,玩过的都知道(哭唧唧~~~)
  • 本次部署用到的安装包,都已经上传至百度云了(合计379MB),如果有担心不安全,可以在github上下载,就是会很慢
  • 如果没有百度会员的话,还是直接github下载吧,利用迅雷,会快一点
  • 链接:https://pan.baidu.com/s/1r5v1czYb1Bk2t8mDbWB4Bw
  • 提取码:rwuh

0、环境准备

0.0、修改主机名

Linux:~ # hostnamectl set-hostname --static k8s-01

0.1、添加hosts解析

k8s-01:~ # cat >> /etc/hosts <<EOF
192.168.72.39 k8s-01
192.168.72.40 k8s-02
192.168.72.41 k8s-03
192.168.72.42 k8s-04
192.168.72.43 k8s-05
EOF

0.2、配置ssh免密

k8s-01:~ # rpm -qa | grep expect
expect-5.45-18.56.x86_64
"如果没有expect,则执行如下操作(注:需要网络或者本地源)"
k8s-01:~ # zypper in expect
#!/usr/bin/env bash
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
for host in k8s-01 k8s-02 k8s-03 k8s-04 k8s-05
do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${host}
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*Password*\" {send \"123.com\r\"; exp_continue}
\"*Password*\" {send \"123.com\r\";}
}"
done
  • 注:我本机的密码是 123.com ,注意修改成自己本机的密码
  • 后续的操作,最后有脚本,除了0.10、配置脚本参数文件需要自己创建,切记,需要先完成免密hosts文件创建

0.3、发送hosts解析文件到其他节点,并修改hostname

#!/usr/bin/env bash
for host in k8s-01 k8s-02 k8s-03 k8s-04 k8s-05
do
printf "\e[1;34m${host}\e[0m\n"
scp /etc/hosts ${host}:/etc/hosts
ssh root@${host} "hostnamectl set-hostname --static ${host}"
done

0.4、更新PATH变量

"所有的k8s安装相关的文件,都存放在/opt/k8s目录下"
k8s-01:~ # echo 'PATH=$PATH:/opt/k8s/bin' >> /etc/profile
k8s-01:~ # source /etc/profile
k8s-01:~ # echo $PATH
/opt/k8s/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/games

0.5、安装依赖包

k8s-01:~ # zypper in -y ntp ipset iptables curl sysstat wget

0.6、关闭防火墙以及swap分区

k8s-01:~ # systemctl disable SuSEfirewall2.service --now
k8s-01:~ # iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
k8s-01:~ # iptables -P FORWARD ACCEPT
"切记,所有节点都要关闭swap分区,否则kubelet会启动失败"
k8s-01:~ # swapoff -a
k8s-01:~ # sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  • 注:suse默认安装的时候是没有开启selinux的,如果有开启,记得关闭一下

0.7、开启内核模块

k8s-01:~ # modprobe -- ip_vs && \
modprobe -- ip_vs_rr && \
modprobe -- ip_vs_wrr && \
modprobe -- ip_vs_sh && \
modprobe -- nf_conntrack_ipv4 && \
modprobe -- br_netfilter
k8s-01:~ # chmod +x /etc/rc.d/rc.local"

0.8、内核优化

k8s-01:~ # cat > /etc/sysctl.d/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
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
k8s-01:~ # sysctl -p /etc/sysctl.d/kubernetes.conf
  • vm.swappiness=0 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
  • vm.overcommit_memory=1 不检查物理内存是否够用
  • vm.panic_on_oom=0 开启 OOM
  • net.ipv4.tcp_tw_recycle=0 关闭tcp_tw_recycle,否则和NAT冲突,会导致服务不通
  • net.ipv6.conf.all.disable_ipv6=1 关闭 IPV6,防止触发Docker BUG

0.9、创建安装所需目录

"每个节点都需要创建"
#!/usr/bin/env bash
for host in k8s-01 k8s-02 k8s-03 k8s-04 k8s-05
do
printf "\e[1;34m${host}\e[0m\n"
ssh root@${host} "mkdir -p /opt/k8s/{bin,packages,ssl,conf,server} /etc/{kubernetes,etcd}/cert"
done
"最终的目录结构"
k8s-01:~ # tree /opt/k8s/
/opt/k8s/
├── bin
├── conf
├── packages
├── server
└── ssl 5 directories, 0 files
k8s-01:~ # tree /etc/kubernetes/
/etc/kubernetes/
└── cert 1 directory, 0 files
k8s-01:~ # tree /etc/etcd/
/etc/etcd/
└── cert 1 directory, 0 files

0.10、配置脚本参数文件

  • 后续的部署,将直接使用变量进行代替,以减少出错的概率,相关的信息,请修改成自己的环境信息,并分发到所有节点的 /opt/k8s/bin 目录下,文件名称为 k8s-env.sh (可自行定义文件名称,后续的部署记得修改即可)
#!/usr/bin/env bash
# 集群各机器 IP 数组
export NODE_IPS=( 192.168.72.39 192.168.72.40 192.168.72.41 192.168.72.42 192.168.72.43 ) # 集群各 IP 对应的主机名数组
export NODE_NAMES=( k8s-01 k8s-02 k8s-03 k8s-04 k8s-05 ) # 集群MASTER机器 IP 数组
export MASTER_IPS=( 192.168.72.39 192.168.72.40 192.168.72.41 ) # 集群所有的master Ip对应的主机
export MASTER_NAMES=( k8s-01 k8s-02 k8s-03 ) # etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://192.168.72.39:2379,https://192.168.72.40:2379,https://192.168.72.41:2379" # etcd 集群间通信的 IP 和端口
export ETCD_NODES="k8s-01=https://192.168.72.39:2380,k8s-02=https://192.168.72.40:2380,k8s-03=https://192.168.72.41:2380" # etcd 集群所有node ip
export ETCD_IPS=( 192.168.72.39 192.168.72.40 192.168.72.41 ) # 节点间互联网络接口名称
export IFACE="eth0" # etcd 数据目录
export ETCD_DATA_DIR="/opt/k8s/server/etcd/data" # etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
export ETCD_WAL_DIR="/opt/k8s/server/etcd/wal" # kube-apiserver 的反向代理(kube-nginx)地址端口,如果有配置keepalived,可以写VIP
export KUBE_APISERVER="https://192.168.72.39:8443" # k8s 各组件数据目录
export K8S_DIR="/opt/k8s/server/k8s" # 最好使用 当前未用的网段 来定义服务网段和 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=$PATH:/opt/k8s/bin

0.11、环境配置脚本

#!/usr/bin/env bash

cat > /etc/sysctl.d/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
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 cat >> /etc/rc.d/rc.local <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- br_netfilter
EOF for host in k8s-01 k8s-02 k8s-03 k8s-04 k8s-05
do
printf "\e[1;34m${host}\e[0m\n"
scp /etc/hosts ${host}:/etc/hosts
scp /etc/sysctl.d/kubernetes.conf ${host}:/etc/sysctl.d/kubernetes.conf
scp /etc/rc.d/rc.local ${host}:/etc/rc.d/rc.local
ssh root@${host} "hostnamectl set-hostname --static ${host}"
ssh root@${host} "zypper in -y ntp ipset iptables curl sysstat wget"
ssh root@${host} "swapoff -a"
ssh root@${host} "sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
ssh root@${host} "modprobe -- ip_vs && \
modprobe -- ip_vs_rr && \
modprobe -- ip_vs_wrr && \
modprobe -- ip_vs_sh && \
modprobe -- nf_conntrack_ipv4 && \
modprobe -- br_netfilter"
ssh root@${host} "chmod +x /etc/rc.d/rc.local"
ssh root@${host} "sysctl -p /etc/sysctl.d/kubernetes.conf"
ssh root@${host} "systemctl disable SuSEfirewall2.service --now"
ssh root@${host} "iptables -F && iptables -X && \
iptables -F -t nat && iptables -X -t nat && \
iptables -P FORWARD ACCEPT"
ssh root@${host} "echo 'PATH=$PATH:/opt/k8s/bin' >> /etc/profile"
ssh root@${host} "source /etc/profile"
ssh root@${host} "mkdir -p /opt/k8s/{bin,packages,ssl,conf,server} /etc/{kubernetes,etcd}/cert"
done

suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备的更多相关文章

  1. suse 12 二进制部署 Kubernetets 1.19.7 - 第13章 - 部署metrics-server插件

    文章目录 1.13.0.创建metrics-server证书和私钥 1.13.1.生成metrics-server证书和私钥 1.13.2.开启kube-apiserver聚合配置 1.13.3.分发 ...

  2. suse 12 二进制部署 Kubernetets 1.19.7 - 第01章 - 创建CA证书和kubectl集群管理命令

    文章目录 1.kubernetes集群部署 1.0.创建CA证书和秘钥 1.0.0.安装cfssl工具 1.0.1.创建根证书 1.0.2.创建证书签名请求文件 1.0.3.生成CA证书和秘钥 1.0 ...

  3. suse 12 二进制部署 Kubernetets 1.19.7 - 第02章 - 部署etcd集群

    文章目录 1.2.部署etcd集群 1.2.0.下载etcd二进制文件 1.2.1.创建etcd证书和私钥 1.2.2.生成etcd证书和私钥 1.2.3.配置etcd为systemctl管理 1.2 ...

  4. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  5. suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务

    文章目录 1.4.部署docker 1.4.0.下载docker二进制文件 1.4.1.配置docker镜像加速 1.4.2.配置docker为systemctl管理 1.4.3.启动docker服务 ...

  6. suse 12 二进制部署 Kubernetets 1.19.7 - 第05章 - 部署kube-nginx

    文章目录 1.5.部署kube-nginx 1.5.0.下载nginx二进制文件 1.5.1.编译部署nginx 1.5.2.配置nginx.conf 1.5.3.配置nginx为systemctl管 ...

  7. suse 12 二进制部署 Kubernetets 1.19.7 - 第06章 - 部署kube-apiserver组件

    文章目录 1.6.部署kube-apiserver 1.6.0.创建kubernetes证书和私钥 1.6.1.生成kubernetes证书和私钥 1.6.2.创建metrics-server证书和私 ...

  8. suse 12 二进制部署 Kubernetets 1.19.7 - 第07章 - 部署kube-controller-manager组件

    文章目录 1.7.部署kube-controller-manager 1.7.0.创建kube-controller-manager请求证书 1.7.1.生成kube-controller-manag ...

  9. suse 12 二进制部署 Kubernetets 1.19.7 - 第08章 - 部署kube-scheduler组件

    文章目录 1.8.部署kube-scheduler 1.8.0.创建kube-scheduler请求证书 1.8.1.生成kube-scheduler证书和私钥 1.8.2.创建kube-schedu ...

随机推荐

  1. Linux上天之路(九)之文件和文件夹的权限

    主要内容 linux 基本权限 linux特殊权限 linux隐藏权限 linux file ACL 权限 1. Linux的基本权限 使用ls -l filename 命令查看文件或文件夹详细权限 ...

  2. 万级K8s集群背后 etcd 稳定性及性能优化实践

    1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  3. Java 异常分析

    Java 异常分析 本文是对以下内容的分析: Java异常设计 Java 异常分类 Java异常可以告诉什么问题 Java异常处理最佳实践 Java Exception 是为了处理应用程序的异常行为而 ...

  4. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  5. day3 创建数组并完成对数组的操作

    1.实现函数action()初始化数据全0的操作 2.实现函数assignment()利用指针给数组赋值0~9 3.实现函数print()打印数组的每个函数 4.实现函数reverse()完成对数组的 ...

  6. 一网打尽JVM垃圾回收知识体系

    垃圾回收的区域 堆:Java 中绝大多数的对象都存放在堆中,是垃圾回收的重点 方法区:此中的 GC 效率较低,不是重点 由于虚拟机栈的生命周期和线程一致,因此不需要 GC 对象判活 在垃圾收集器对堆进 ...

  7. 【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录

    如题 更新的过程如下: sudo ubuntu-drivers autoinstall sudo reboot 后续准备在recovery模式中尝试删除驱动.

  8. cv::copyMakeBorder()中用0值对齐矩阵,方便后续加速傅里叶变换

    int M = cv::getOptimalDFTSize(mul_result.rows); // 获得最佳DFT尺寸,为2的次方 int N = cv::getOptimalDFTSize(mul ...

  9. vue中$nextTick的使用

    转载 https://www.jb51.net/article/154823.htm  ,写的通俗易懂 在这里我有一个疑问,因为在vue中mounted里面执行后,dom节点是挂载上去了的,所以视图上 ...

  10. java多态instanceof介绍

    1 public static void method(Animal a) {//类型判断 2 a.eat(); 3 if(a instanceof Cat) {//instanceof:用于判断对象 ...