首页 > 其他分享 >kubernetes 1.20二进制安装部署

kubernetes 1.20二进制安装部署

时间:2023-02-13 11:25:05浏览次数:31  
标签:k8s kubernetes 二进制 cfssl 192.168 ipvs etcd 1.20 id

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

相关文章