二进制安装K8s - part1
环境初始化
节点规划
k8s-master-01
10.0.0.91
172.16.0.91
k8s-master-02
10.0.0.92
172.16.0.92
k8s-master-03
10.0.0.93
172.16.0.93
k8s-node-01
10.0.0.94
172.16.0.94
k8s-node-02
10.0.0.95
172.16.0.95
k8s-master-vip(虚拟节点)
10.0.0.96
172.16.0.96
修改hosts
cat >> /etc/hosts <<EOF
172.16.0.91 k8s-master-01
172.16.0.92 k8s-master-02
172.16.0.93 k8s-master-03
172.16.0.94 k8s-node-01
172.16.0.95 k8s-node-02
172.16.0.96 k8s-master-vip
EOF
集群各节点免密登录
yum install sshpass -y
ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_k8s_cluster -q
for ip_k8s_cluster in k8s-master-01 k8s-master-02 k8s-master-03 k8s-node-01 k8s-node-02
do
sshpass -p "CentOS7.." ssh-copy-id -i ~/.ssh/id_k8s_cluster.pub -o StrictHostKeyChecking=no root@$ip_k8s_cluster
done
关闭SeLinux
# 永久关闭
sed -i 's#enforcing#disabled#g' /etc/sysconfig/selinux
# 零时关闭
setenforce 0
关闭 swap 分区
swapoff -a
sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet
配置国内 YUM 源
mv -f /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
# 更新系统(不更新内核)
yum update -y --exclud=kernel*
升级系统内核版本
curl -o ./kernel-lt.el7.elrepo.x86_64.rpm https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-5.4.87-1.el7.elrepo.x86_64.rpm
curl -o ./kernel-lt-devel.el7.elrepo.x86_64.rpm https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.87-1.el7.elrepo.x86_64.rpm
yum localinstall -y /kernel/kernel-lt*
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --default-kernel
reboot
安装 ipvs
yum install -y conntrack-tools ipvsadm ipset conntrack libseccomp
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_fo 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 [ $? -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
内核参数优化
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_watches = 89100
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system
安装基础软件
yum install wget expect vim net-tools ntp bash-completion ipvsadm ipset jq iptables conntrack sysstat libseccomp -y
关闭防火墙
systemctl disable --now firewalld
安装 Docker
安装Docker同步集群时间
yum install ntp -y
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
ntpdate time2.aliyun.com
# 写入定时任务
*/1 * * * * ntpdate time2.aliyun.com > /dev/null 2>&1
集群证书
安装 cfssl 证书生成工具
# 下载,可能会出现网站无法连接的情况
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
cd /server/tools/cfssl
# 设置执行权限
chmod +x cfssljson_linux-amd64
chmod +x cfssl_linux-amd64
# 移动到/usr/local/bin
mv cfssljson_linux-amd64 cfssljson
mv cfssl_linux-amd64 cfssl
mv cfssljson cfssl /usr/local/bin
创建集群根证书
mkdir -p /opt/cert/ca
cat > /opt/cert/ca/ca-config.json <<EOF
{
"signing":{
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
EOF
# 证书参数详解
# 1. default 是默认策略,指定证书默认有效期是 1 年
# 2. profiles 是定义使用场景,这里只是 kubernetes,其实可以定义多个场景,分别指定不同的过期时间,使用场 景等参数,后续签名证书时使用某个 profile;
# 3. signing: 表示该证书可用于签名其它证书,生成的 ca.pem 证书
# 4. server auth: 表示 client 可以用该 CA 对 server 提供的证书进行校验;
# 5. client auth: 表示 server 可以用该 CA 对 client 提供的证书进行验证。
创建根 CA 证书签名请求文件
cat > /opt/cert/ca/ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai"
}]
}
EOF
# 证书详解
# C 国家
# ST 省
# L 城市
# O 组织
# OU 组织别名
生成证书
cd /opt/cert/ca/
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
# 参数详解
# gencert 生成新的 key(密钥)和签名证书
# --initca 初始化一个新 CA 证书
部署 Etcd 集群
Etcd 集群规划
Etcd-01
172.16.0.91
Etcd-02
172.16.0.92
Etcd-03
172.16.0.93
创建 Etcd 证书
mkdir -p /opt/cert/etcd
cd /opt/cert/etcd
cat > etcd-csr.json << EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"172.16.0.91",
"172.16.0.92",
"172.16.0.93",
"172.16.0.94",
"172.16.0.95"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai"
}
]
}
EOF
生成证书
cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
# 参数详解
# gencert 生成新的 key(密钥)和签名证书
# -initca 初始化一个新 ca
# -ca-key 指明 ca 的证书
# -config 指明 ca 的私钥文件
# -profile 指明请求证书的 json 文件
# -ca 与 config 中的 profile 对应,是指根据 config 中的 profile 段来生成证书的相关信息
分发证书
# 分发证书(此处分发到3个主节点上)
for ip in k8s-master-01 k8s-master-02 k8s-master-03
do
ssh -i ~/.ssh/id_k8s_cluster root@${ip} "mkdir -pv /etc/etcd/ssl"
scp -i ~/.ssh/id_k8s_cluster ../ca/ca*.pem root@${ip}:/etc/etcd/ssl
scp -i ~/.ssh/id_k8s_cluster ./etcd*.pem root@${ip}:/etc/etcd/ssl
done
# 查看分发结果
for ip in k8s-master-01 k8s-master-02 k8s-master-03
do
ssh -i ~/.ssh/id_k8s_cluster root@${ip} "hostname;ls -l /etc/etcd/ssl;echo"
done
部署Etcd
# 下载 Etcd 安装包
mkdir -p /server/tools
cd /server/tools
# wget https://mirrors.huaweicloud.com/etcd/v3.4.14/etcd-v3.4.14-linux-amd64.tar.gz
wget https://mirrors.huaweicloud.com/etcd/v3.3.24/etcd-v3.3.24-linux-amd64.tar.gz
# 解压
tar xf etcd-v3.3.24-linux-amd64.tar.gz
# 分发至其他节点
for ip in k8s-master-01 k8s-master-02 k8s-master-03
do
scp -i ~/.ssh/id_k8s_cluster ./etcd-v3.3.24-linux-amd64/etcd* root@$ip:/usr/local/bin/
done
查看 Etcd 安装是否成功
# 查看 Etcd 安装结果
for ip in k8s-master-01 k8s-master-02 k8s-master-03
do
ssh -i ~/.ssh/id_k8s_cluster root@${ip} "hostname;/usr/local/bin/etcd --version;echo"
done
注册 Etcd 服务
# 在三台节点上执行
mkdir -pv /etc/kubernetes/conf/etcd
ETCD_NAME=`hostname`
INTERNAL_IP=`hostname -i`
INITIAL_CLUSTER=k8s-master-01=https://172.16.0.91:2380,k8s-master-02=https://172.16.0.92:2380,k8s-master-03=https://172.16.0.93:2380
cat << EOF | sudo tee /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd \\
--name ${ETCD_NAME} \\
--cert-file=/etc/etcd/ssl/etcd.pem \\
--key-file=/etc/etcd/ssl/etcd-key.pem \\
--peer-cert-file=/etc/etcd/ssl/etcd.pem \\
--peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
--trusted-ca-file=/etc/etcd/ssl/ca.pem \\
--peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \\
--peer-client-cert-auth \\
--client-cert-auth \\
--initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\
--listen-peer-urls https://${INTERNAL_IP}:2380 \\
--listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\
--advertise-client-urls https://${INTERNAL_IP}:2379 \\
--initial-cluster-token etcd-cluster \\
--initial-cluster ${INITIAL_CLUSTER} \\
--initial-cluster-state new \\
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
配置项详解
name
节点名称
data-dir
指定节点的数据存储目录
listen-peer-urls
与集群其它成员之间的通信地址
listen-client-urls
监听本地端口,对外提供服务的地址
initial-advertise-peer-urls
通告给集群其它节点,本地的对等 URL 地址
advertise-client-urls
客户端 URL,用于通告集群的其余部分信息
initial-cluster
集群中的所有信息节点
initial-cluster-token
集群的 token,整个集群中保持一致
initial-cluster-state
初始化集群状态,默认为 new
--cert-file
客户端与服务器之间 TLS 证书文件的路径
--key-file
客户端与服务器之间 TLS 密钥文件的路径
--peer-cert-file
对等服务器 TLS 证书文件的路径
--peer-key-file
对等服务器 TLS 密钥文件的路径
--trusted-ca-file
签名 client 证书的 CA 证书,用于验证 client 证书
--peer-trusted-ca-file
签名对等服务器证书的 CA 证书
--trusted-ca-file
签名 client 证书的 CA 证书,用于验证 client 证书
--peer-trusted-ca-file
签名对等服务器证书的 CA 证书
启动 Etcd
# 在三台节点上执行
systemctl enable --now etcd
systemctl status etcd
测试 Etcd 集群
# 方式1
ETCDCTL_API=3 etcdctl \
--cacert=/etc/etcd/ssl/etcd.pem \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints="https://172.16.0.91:2379,https://172.16.0.92:2379,https://172.16.0.93:2379" \
endpoint status --write-out='table'
# 方式2
ETCDCTL_API=3 etcdctl \
--cacert=/etc/etcd/ssl/etcd.pem \
--cert=/etc/etcd/ssl/etcd.pem \
--key=/etc/etcd/ssl/etcd-key.pem \
--endpoints="https://172.16.0.91:2379,https://172.16.0.92:2379,https://172.16.0.93:2379" \
member list --write-out='table'
Last updated