kubernetes-v1.20.8二进制安装(一)-环境准备
后续部署章节都为有以下步骤(一般都在OPS服务器操作)
- 下载安装包并解压相关文件至对应目录(角色目录)
- 生成多个配置文件, 启动文件
- 分发对应目录至对应角色节点中
- 修改各个节点配置文件不同地方(如编写脚本可使用ansible template进行处理)
- 启动服务
- 验证服务
1. 主机配置
当前环境为 阿里云ESC环境 系统版本为: Alibaba Cloud Linux release 3 (Soaring Falcon)
内核版本为: 5.4.123-1.el7.elrepo.x86_64
用户都为 root, 密码统一为: "123123" (示例)
当前环境与本地虚拟机搭建差异不大.
IP地址 | 主机名 | 角色 |
---|---|---|
10.0.0.100 | ops.k8s-host.com | OPS |
10.0.0.10 | master01.k8s-host.com | master01 |
10.0.0.20 | master02.k8s-host.com | master02 |
10.0.0.30 | master03.k8s-host.com | master03 |
10.0.0.40 | node01.k8s-host.com | node01 |
10.0.0.50 | node02.k8s-host.com | node02 |
10.0.0.200 | islb.k8s-host.com | 内网SLB |
内网SLB实现kube-apiserver高可用, 如在本地环境中,可将此IP地址指向其中一台master主机
大量的操作都在OPS服务器执行,然后再复制到各个节点中,在节点中执行会进行标注,如没标注,即在ops操作.
如有命令显示结果,会在命令前添加$
符号来区别命令和输出
2. 环境初始化
2.1. 修改节点主机名
所有节点
# 10.0.0.100 (ops)
hostnamectl set-hostnamectl ops.k8s-host.com
# 10.0.0.10 (master)
hostnamectl set-hostnamectl master01.k8s-host.com
# 10.0.0.40 (node)
hostnamectl set-hostnamectl node01.k8s-host.com
2.2. 添加主机解析/etc/hosts
所有节点
配置中以角色来做区分,方便后续编写安装脚本和管理脚本, 针对不同角色做不同动作
如有DNS服务,可在DNS服务配置相关主机解析
当前使用阿里云私网SLB,让kubelet和kube-proxy指向SLB,而controller-manger和scheduer组件需要指向自身,即127.0.0.1,为什么呢?
在想通过私网SLB做apiserver的负载均衡高可用的时候,发现阿里云文档中说明: 私网SLB代理的后端服务器不能充当客户端,即controller-manger和scheduer组件在访问SLB-apiserver指向自身IP的时候,会提示超时。
如果不想写入/etc/hosts
文件,可以购买云的服务, 比如阿里云提供了PrivateZone
服务(收费), 提供内网DNS解析. 或者自建DNS使用
# master
cat >> /etc/hosts<<EOF
10.0.0.100 ops.k8s-host.com
10.0.0.10 master01.k8s-host.com etcd01.k8s-host.com
10.0.0.20 master02.k8s-host.com etcd02.k8s-host.com
10.0.0.30 master03.k8s-host.com etcd03.k8s-host.com
10.0.0.40 node01.k8s-host.com
10.0.0.50 node02.k8s-host.com
127.0.0.1 islb.k8s-host.com
EOF
# node ops
cat >> /etc/hosts<<EOF
10.0.0.100 ops.k8s-host.com
10.0.0.10 master01.k8s-host.com etcd01.k8s-host.com
10.0.0.20 master02.k8s-host.com etcd02.k8s-host.com
10.0.0.30 master03.k8s-host.com etcd03.k8s-host.com
10.0.0.40 node01.k8s-host.com
10.0.0.50 node02.k8s-host.com
10.0.0.200 islb.k8s-host.com
EOF
- master与node节点的
islb.k8s-host.com
不同, 是因为master的controller-manager
和scheduler
服务都与apiserver
为同一台服务器,所以直接指向127.0.0.1
即可
2.3. 关闭Selinux
所有节点
关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied
:
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/enforcing/disabled/g' /etc/selinux/config
2.4. 关闭swap交换分区
所有节点
关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为false 关闭 swap 检查):
# 临时关闭
swapoff -a
# 永久关闭
sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab
2.5. 关闭不必要的服务
所有节点
关闭防火墙,清理防火墙规则,设置默认转发策略
systemctl stop firewalld && systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
2.6. 升级内核
所有节点 慎重操作
Centos7.x自带的3.10x内核存在一些Bug 可升级内核版本为5.4版本或者更高版本
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查/boot/grub2/grub.cfg 中对应内核menuentry中是否包含initrd16配置,如果没有,请再安一次
yum --enablerepo=elrepo-kernel install -y kernel-lt
$ grep "initrd16" /boot/grub2/grub.cfg
initrd16 /initramfs-5.4.130-1.el7.elrepo.x86_64.img
initrd16 /initramfs-3.10.0-1062.el7.x86_64.img
initrd16 /initramfs-0-rescue-2056da6206244d8ca1a1324b82c8dd9e.im
# 设置开机从新内核启动,注意修改内核版本
grub2-set-default "Centos Linux (5.4.130-1.el7.elrepo.x86_64) 7 (Core)"
# 重启(谨慎操作)
reboot
$ uname -r
5.4.129-1.el7.elrepo.x86_64
2.7. 设置系统内核参数
所有节点
# 加载模块
modprobe br_netfilter
cat > /etc/sysctl.d/kubernetes.conf << EOF
# kubernetes
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
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
EOF
# 运行
sysctl -p /etc/sysctl.d/kubernetes.conf
2.8. 基础依赖安装
所有节点
# 基础安装
yum -y install vim wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils ipvsadm
# kubectl命令行自动补全(bash-completion) (可选)
yum -y install bash-completion
2.9. 开启IPVS前置条件
node节点
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
# /bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
cat /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.10. 设置主机之间免密钥
OPS操作
# 生成密钥对
ssh-keygen
$ ll /root/.shh/
total 12
-rw------- 1 root root 0 Aug 13 17:31 authorized_keys
-rw------- 1 root root 3243 Aug 17 18:00 id_rsa
-rw-r--r-- 1 root root 742 Aug 17 18:00 id_rsa.pub
-rw-r--r-- 1 root root 185 Aug 17 18:03 known_hosts
执行命令, 输入统一的登录密码
hosts=(mater01 master02 master03 node01 node02 node03)
domain="k8s-host.com"
# 依次输入密码
for host in ${hosts[*]}
do
ssh-copy-id root@${host}.${domain}
done
测试
2.11. 创建kubernetes相关工作目录
OPS操作
KUBERNETES_HOME='/opt/software/kubernetes'
mkdir -p ${KUBERNETES_HOME}/{bin,certs,master,node,script,tools,yaml}
mkdir -p ${KUBERNETES_HOME}/master/{bin,certs,config,kubeconfig,service}
mkdir -p ${KUBERNETES_HOME}/node/{bin,certs,config,kubeconfig,service}
- ${KUBERNETES_HOME} kubernetes ops管理目录
- tools 安装包存放目录
- bin OPS相关的二进制文件存放目录
- certs 证书存放目录
- yaml 资源yaml文件存放目录
- master master节点所需文件存放目录(包括etcd服务所需文件)
- node node节点所需文件存放目录
master和node操作
KUBERNETES_HOME='/opt/software/kubernetes'
mkdir -p ${KUBERNETES_HOME}/{bin,certs,config,kubeconfig,service}
2.12. 环境变量设置
所有节点
如OPS节点即是master也是ops,那么请将master的kubernetes目录(/opt/software/kubernets
) 和 ops的kubernets目录(/opt/software/kubernetes_ops
)区分开来, 通过添加有效的环境变量. 防止有冲突
cat >> /etc/profile<<EOF
# kubernetes
export KUBERNETES_HOME="/opt/software/kubernetes"
export PATH=${PATH}:${KUBERNETES_HOME}/bin
EOF
source /etc/profile
最后请再次重启所有节点, 测试以上环境初始化是否成功
3. 搭建证书环境
以下都在OPS操作
3.1. 下载cfssl相关二进制
当前cfssl最新版本为 1.6.0
cfssl_version="1.6.0"
cd /opt/software/kubernetes/bin/
wget https://github.com/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssl_${cfssl_version}_linux_amd64 -O cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssljson_${cfssl_version}_linux_amd64 -O cfssl-json
wget https://github.com/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssl-certinfo_${cfssl_version}_linux_amd64 -O cfssl-certinfo
chmod +x /opt/software/kubernetes/bin/cfssl*
3.2. 生成ca证书
ca-csr.json
cat > /opt/software/kubernetes/certs/ca-csr.json<<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "GuangZhou",
"L": "TianHe",
"O": "k8s",
"OU": "ops"
}
],
"ca": {
"expiry": "175200h"
}
}
EOF
-
CN 浏览器使用该字段验证网站是否合法,一般写域名
-
C: Country 国家
-
ST State 州,省
-
L Locality 地区 城市
-
O Oraganizetion Name 组织名称 公司名称
-
OU Oraganizetion Unit Name 组织单位名称 公司部门
-
expiry 过期时间
ca-config.json
cat > /opt/software/kubernetes/certs/ca-config.json<<EOF
{
"signing": {
"default": {
"expiry": "175200h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "175200h"
}
}
}
}
EOF
生成ca证书文件
cd /opt/software/kubernetes/certs/
cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
$ ll ca*
-rw-r--r-- 1 root root 1001 6月 7 17:12 ca.csr
-rw-r--r-- 1 root root 334 6月 7 17:11 ca-csr.json
-rw------- 1 root root 1679 6月 7 17:12 ca-key.pem
-rw-r--r-- 1 root root 1363 6月 7 17:12 ca.pem
复制至master对应目录中, 后续服务要用
cp ca.pem ca-key.pem /opt/software/kubernetes/master/certs/
cp ca.pem ca-key.pem /opt/software/kubernetes/node/certs/