suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备

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 )
# 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://127.0.0.1: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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
Linux Perl
suse 12 二进制部署 Kubernetets 1.19.7 - 第12章 - 部署dashboard插件
suse 12 二进制部署 Kubernetets 1.19.7 - 第12章 - 部署dashboard插件
44 0
|
Kubernetes 应用服务中间件 Linux
suse 12 二进制部署 Kubernetets 1.19.7 - 第05章 - 部署kube-nginx
suse 12 二进制部署 Kubernetets 1.19.7 - 第05章 - 部署kube-nginx
53 0
|
2月前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
424 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
1月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
46 0
|
6月前
|
Kubernetes 应用服务中间件 网络安全
CentOS7上二进制部署Kubernetes高可用集群(v1.18版本)
CentOS7上二进制部署Kubernetes高可用集群(v1.18版本)
365 0
|
Linux API Docker
suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
59 0
|
Kubernetes 前端开发 安全
suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件
suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件
51 0
|
Linux Docker 容器
suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务
suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务
58 0
|
Linux
suse 12 二进制部署 Kubernetets 1.19.7 - 第11章 - 部署coredns组件
suse 12 二进制部署 Kubernetets 1.19.7 - 第11章 - 部署coredns组件
70 0
|
存储 Kubernetes 固态存储
suse 12 二进制部署 Kubernetets 1.19.7 - 第02章 - 部署etcd集群
suse 12 二进制部署 Kubernetets 1.19.7 - 第02章 - 部署etcd集群
64 0
下一篇
无影云桌面