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-managerscheduler服务都与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/

4. 参考链接

证书含义解析

kubernetes安装参考

kubernetes全面文档

posted @ 2021-08-19 10:59  风吹蛋生丶  阅读(380)  评论(1编辑  收藏  举报