【Kubernetes硬核部署方式kubernetes-the-hard-way】01-基础环境准备
一、基础环境准备
使用二进制方式,手动部署kubernetes高可用集群
注意:所有操作使用root用户执行
1. 服务器说明
1.1. 节点要求
节点数 >=3台
CPU >=2
Memory >=2G
安全组:关闭(允许节点之间任意端口访问,以及ipip隧道协议通讯)
1.2. 环境说明
我们这里使用的是三台centos 8.5的虚拟机,具体信息如下表:
系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
centos-8.5 | 192.168.31.70 | master | >=2 | >=2G | node-1 |
centos-8.5 | 192.168.31.71 | master,worker | >=2 | >=2G | node-2 |
centos-8.5 | 192.168.31.72 | worker | >=2 | >=2G | node-3 |
2. 系统设置(所有节点)
2.1 主机名
主机名必须合法,并且每个节点都不一样(建议命名规范:数字+字母+中划线组合,不要包含其他特殊字符)。
# 查看主机名
$ hostname
# 修改主机名
$ hostnamectl set-hostname <your_hostname>
# 配置host,使主节点之间可以通过hostname互相访问
$ vi /etc/hosts
# <ip> <hostname>
例:
192.168.31.70 node-1
192.168.31.71 node-2
192.168.31.72 node-3
2.2 安装依赖包
# yum源更新
$ yum update -y
# 安装依赖包
$ yum install -y socat conntrack ipvsadm ipset jq sysstat curl iptables libseccomp yum-utils epel-release python39 python3-pip
# 升级pip
$ pip3.9 install --upgrade pip
# 或
$ pip3.9 install -i https://mirrors.aliyun.com/pypi/simple/ pip --upgrade
2.2.1依赖软件下载、安装中常见问题
在 CentOS 8 中使用 yum 命令安装软件时会出现 “错误:为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist“,如下图所示:
问题案例
错误:为仓库 'appstream' 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist
解决方案:
sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
PS:错误提示的原因是CentOS 8 已于2021年12月31日停止官方服务了,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到 https://vault.centos.org。如果你仍然需要运行 CentOS 8,你可以在 /etc/yum.repos.d 中更新一下源。使用 http://vault.centos.org 代替 http://mirror.centos.org 即可。
2.2.2 解决pip升级失败的常见问题
(a)网络连接问题:pip升级过程中可能会出现网络连接问题,导致下载失败。这时可以尝试使用国内镜像源来替换默认的源,例如使用清华大学的镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip --upgrade
或者使用阿里云的镜像源:
pip install -i https://mirrors.aliyun.com/pypi/simple/ pip --upgrade
(b)权限问题:如果在升级pip时出现权限问题,可以尝试使用管理员权限或者在命令前加上sudo
(Unix/Linux系统):
sudo pip install --upgrade pip
(c)pip版本冲突:有时在升级pip时可能会遇到与其他Python软件包产生冲突的情况。这时可以尝试使用pip install –ignore-installed
选项来忽略已安装的包:
pip install --ignore-installed pip --upgrade
(d)使用Python虚拟环境:如果你在使用Python虚拟环境(virtualenv)时遇到pip升级问题,可以尝试进入虚拟环境后再执行pip升级命令:
source <虚拟环境目录>/bin/activate # 激活虚拟环境
pip install --upgrade pip
2.3 关闭防火墙、selinux、swap,重置iptables
# 关闭selinux
$ setenforce 0
$ sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
# 关闭防火墙
$ systemctl stop firewalld && systemctl disable firewalld
# 设置iptables规则
$ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 关闭swap
$ swapoff -a && free –h
# 关闭dnsmasq(否则可能导致容器无法解析域名)
$ service dnsmasq stop && systemctl disable dnsmasq
2.4 k8s参数设置
# 制作配置文件
$ cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
EOF
# 生效文件
$ sysctl -p /etc/sysctl.d/kubernetes.conf
2.4.1 k8s参数设置中常见问题
问题案例:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录
解决方案:
modprobe br_netfilter #加载模块
PS:modprobe -r br_netfilter #卸载模块
2.5 配置免密登录
为了方便文件的copy我们选择一个中转节点(随便一个节点,可以是集群中的也可以是非集群中的),配置好跟其他所有节点的免密登录
# 看看是否已经存在rsa公钥
$ cat ~/.ssh/id_rsa.pub
# 如果不存在就创建一个新的
$ ssh-keygen -t rsa
# 把id_rsa.pub文件内容copy到其他机器的授权文件中
$ cat ~/.ssh/id_rsa.pub
# 在其他节点执行下面命令(包括worker节点)
$ mkdir -p /root/.ssh
$ echo "<file_content>" >> ~/.ssh/authorized_keys
例:
$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC30AywAS7hVe62wqCPfU+o32Zw6TO+BiGuVUpw1LH/OTXXX389dmsYHbqOSQ1UrsNfIFcmoxKZUPLqmIWd6U+f5M0BlMQdAOs8uAMGcdTq1kdeDXrO/cg5BkyNJxL5gQNur+uPdyd2GaTWBe4VTo0CIa4QbAIvOE7H6i4qsO5KVH1cbbIz3suwrFqwfs/SOZH3jathNDjXXhXzmQgIlCBhCpSD8xJ46A+HN850wUW/pa/1tOTi+/pfAesTmHNRYfjSsY3Fj3q5ax0QG+xtZgXq5MNSu59fWP9+d0fnoYDtYF1lSCD+wE3MUTjHhukflLhIrwS2vsSSxNuYXuL1y7bMe/4nDgr3IyMBkCxhOvl5YvQGopbN9DQbiNqQLugM5KQLw+q+jauoVgGwkIfPCrfPrTOAI4DHlZMuIuW+xSVvbd2B5hmJccXYRi9/Gjb9Ivcmb5cD5s+ORINh5VlUadfrmSsT/1a36sfa90xT+//hFcEr7DtPznv8656AFsNQdvc= root@node-1" >> ~/.ssh/authorized_keys
3. 准备k8s软件包
3.1 软件包下载
在刚才生成免密的节点下载好压缩包后,复制到所有节点即可。无法在服务器上下载的文件可以用自己的电脑下载后上传至当前结点,在进行复制分发软件包
master节点组件:kube-apiserver、kube-controller-manager、kube-scheduler、kubectl
worker节点组件:kubelet、kube-proxy
# 设定版本号
$ export VERSION=v1.20.2
# 创建个文件夹放置当前版本软件包
$ mkdir kubernetes-${VERSION} && cd kubernetes-${VERSION}
# 下载master节点组件
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-apiserver
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-controller-manager
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-scheduler
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kubectl
# 下载worker节点组件
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-proxy
$ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kubelet
# 下载etcd组件
$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.10/etcd-v3.5.10-linux-amd64.tar.gz
$ tar -xvf etcd-v3.5.10-linux-amd64.tar.gz
$ mv etcd-v3.5.10-linux-amd64/etcd* .
$ rm -fr etcd-v3.5.10-linux-amd64*
# 统一修改文件权限为可执行
$ chmod +x kube*
3.2 软件包分发
完成下载后,分发文件,将每个节点需要的文件scp过去
# 把master相关组件分发到master节点
$ MASTERS=(node-1 node-2)
for instance in ${MASTERS[@]}; do
scp kube-apiserver kube-controller-manager kube-scheduler kubectl root@${instance}:/usr/local/bin/
done
# 把worker先关组件分发到worker节点
$ WORKERS=(node-2 node-3)
for instance in ${WORKERS[@]}; do
scp kubelet kube-proxy root@${instance}:/usr/local/bin/
done
# 把etcd组件分发到etcd节点
$ ETCDS=(node-1 node-2 node-3)
for instance in ${ETCDS[@]}; do
scp etcd etcdctl root@${instance}:/usr/local/bin/
done