1. 服务器资源规划
服务器名称 | ip地址 | 部署服务 |
k8s-master1 | 192.168.3.112 | apiserver,controller-manager,scheduler kubelet,kube-proxy,docker,etcd,haproxy,keepalived |
k8s-master2 | 192.168.3.113 | apiserver,controller-manager,scheduler kubelet,kube-proxy,docker,etcd,haproxy,keepalived |
k8s-master3 | 192.168.3.114 | apiserver,controller-manager,scheduler kubelet,kube-proxy,docker,etcd,haproxy,keepalived |
k8s-node1 | 192.168.3.118 | kubelet,kube-proxy,docker |
k8s-node2 | 192.168.3.119 | kubelet,kube-proxy,docker |
VIP | 192.168.3.115 |
2. 软件版本
软件名 | 版本 |
os | centos7.5 |
docker | 20.10.7 |
kubernetes | 1.20.15 |
etcd | 3.4.9 |
3. 初始化(所有节点)
#安装基础软件
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlibdevel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
#修改主机名
hostnamectl set-hostname k8s-master1 && bash hostnamectl set-hostname k8s-master2 && bash hostnamectl set-hostname k8s-master3 && bash hostnamectl set-hostname k8s-node1 && bash hostnamectl set-hostname k8s-node2 && bash
#修改hosts文件
cat >> /etc/hosts <<EOF 192.168.3.112 k8s-master1 192.168.3.113 k8s-master2 192.168.3.114 k8s-master3 192.168.3.118 k8s-node1 192.168.3.119 k8s-node2 EOF
#配置主机免秘钥登录
ssh-keygen ssh-copy-id -i id_rsa.pub -p 62222 [email protected] ssh-copy-id -i id_rsa.pub -p 62222 [email protected] ssh-copy-id -i id_rsa.pub -p 62222 [email protected] ssh-copy-id -i id_rsa.pub -p 62222 [email protected] ssh-copy-id -i id_rsa.pub -p 62222 [email protected]
#关闭交换分区
# 临时关闭 swapoff -a # 永久关闭 vi /etc/fstab 删除swap那一行 # 关闭原因 Swap 是交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用姜欢分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装 k8s 的时候可以指定--ignore-preflight-errors=Swap 来解决。
#修改主机内核参数
# 加载模块,开启内核转发功能 modprobe br_netfilter echo "modprobe br_netfilter" >> /etc/profile cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf #net.ipv4.ip_forward 是数据包转发: 出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。 要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数net.ipv4.ip_forward。这个参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,则说明 IP 转发功能已经打开。
#关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0
#配置时间同步
*/10 * * * * ntpdate ntp1.aliyun.com > /dev/null 2>&1 &
#开启ipvs
# 每次开机都会加载这些模块 (EOF前面反斜杠是防止变量替换用的) cat > /etc/sysconfig/modules/ipvs.modules << \EOF #!/bin/bash ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" for kernel_module in ${ipvs_modules}; do /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 if [ 0 -eq 0 ]; then /sbin/modprobe ${kernel_module} fi done EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules # 查看模块是否被加载上 lsmod | grep ip_vs ip_vs_ftp 13079 0 nf_nat 26583 1 ip_vs_ftp ip_vs_sed 12519 0 ip_vs_nq 12516 0 ip_vs_sh 12688 0 ip_vs_dh 12688 0 # 问题 1:ipvs 是什么? ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux 内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。 # 问题 2:ipvs 和 iptable 对比分析 kube-proxy 支持 iptables 和 ipvs 两种模式, 在 kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现出来,从而提高 service 的服务性能。那么 ipvs 模式和 iptables 模式之间有哪些差异呢? 1、ipvs 为大型集群提供了更好的可扩展性和性能 2、ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等) 3、ipvs 支持服务器健康检查和连接重试等功能
4. 生成自签CA-在其中一台master节点上操作
#准备cfssl工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl mv cfssljson_linux-amd64 /usr/local/bin/cfssljson mv cfssl-certinfo_linux-amd64/usr/local/bin/cfssl-certinfo
#建立工作目录
mkdir -p ~/TLS/{etcd,k8s} cd ~/TLS/etcd
#创建ca请求文件
cat > ca-csr.json <<EOF
{ "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "system" } ] }
EOF
注: CN:Common Name(公用名称),kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法; 对于 SSL 证书,一般为网站域名 对于代码签名证书则为申请单位名称 对于客户端证书则为证书申请者的姓名。 O:Organization(单位名称),kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group); 对于 SSL 证书,一般为网站域名 对于代码签名证书则为申请单位名称 对于客户端单位证书则为证书申请者所在单位名称。 L 字段:所在城市 S 字段:所在省份 C 字段:只能是国家字母缩写,如中国:CN
#生成CA
cfssl gencert -initca ca-csr.json | cfssljson -bare ca # 生成ca.pem和ca-key.pem文件
#创建CA证书配置文件
cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "876000h" }, "profiles": { "kubernetes": { "expiry": "876000h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF
5.部署etcd集群
#创建etcd证书请求文件 etcd-csr.json
cat > etcd-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.3.112", "192.168.3.113", "192.168.3.114", "192.168.3.115", "192.168.3.125" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF
注: 上述文件hosts字段中IP为所有etcd节点的集群内部通信IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。
标签:k8s,kubernetes,二进制,cfssl,192.168,ipvs,etcd,1.20,id From: https://www.cnblogs.com/luxueyue/p/17115655.html