🐰 安装kubernetes

# 安装kubernetes 使用rancher的方式去安装kubernetes ## 配置防火墙 每个节点都要运行一下,防火墙可以直接关闭或者是多开一些端口 selinux可以直接关闭,不然会遇到初始化配置中sshd重启失败的错误 ```shell # 关闭swap swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab #需重启 临时关闭使用swapoff -a # 关闭selinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 防火墙设置 # 开放防火墙端口(选择一) firewall-cmd --zone=public --add-port=1-65535/tcp --permanent firewall-cmd --zone=public --add-port=1-65535/udp --permanent firewall-cmd --reload # 关闭防火墙(选择二) systemctl stop firewalld.service systemctl disable firewalld.service ``` ## 同步时间 ntp需要在各个节点上安装,使用rpm进行安装 ``` # 上传ntp安装包 tar -vxf ntp.tar cd ntp rpm -ivh *.rpm --force --nodeps ``` 安装完成之后要配置ntp 从节点上: ``` vi /etc/ntp.conf ----------------------------- 注释掉以下内容 # server 0.centos.pool.ntp.org iburst # server 1.centos.pool.ntp.org iburst # server 2.centos.pool.ntp.org iburst # server 3.centos.pool.ntp.org iburst 补充以下内容 restrict -4 default kod notrap nomodify restrict -6 default kod notrap nomodify server ntp-server-ipaddress ##请根据实际情况配置 fudge ntp-server-ipaddress stratum 8 ------------------------------- ``` 主节点上: ``` vi /etc/ntp.conf ----------------------------- restrict -4 default kod notrap nomodify restrict -6 default kod notrap nomodify server 127.127.1.0 #同步本机服务器时间 fudge 127.127.1.0 stratum 8 注释掉以下内容 # server 0.centos.pool.ntp.org iburst # server 1.centos.pool.ntp.org iburst # server 2.centos.pool.ntp.org iburst # server 3.centos.pool.ntp.org iburst ----------------------------- ``` 每台节点上: ``` service ntpd restart systemctl disable chronyd.service systemctl enable ntpd.service ntpstat ntpdate -u ntp-server-ipaddress ``` 注释掉的内容是默认和公共的时间对齐,修改为向主节点对齐。主节点使用`127.127.1.0`这个特殊的地址对齐。 ## 安装docker 上传docker安装包,执行docker-install.sh脚本 ## 创建非root用户并且配置ssh key 创建非root用户 ```shell # 创建rancher用户 useradd rancher passwd rancher ``` 创建完成或已存在非root用户使用以下命令授权运行docker ```shell # 授权运行docker gpasswd -a rancher docker systemctl restart docker ``` 配置ssh key,主节点分发公钥给其他节点 ```shell # 生成密钥对 ssh-keygen # 分发公钥,实现免密登录 ssh-copy-id rancher@master ssh-copy-id rancher@node1 ssh-copy-id rancher@node2 ``` >i ssh-copy-id所做的事情是将当前用户的公钥添加到远程主机的authorized_keys文件中 **免密登录不等于SSH私钥通讯** **rke使用SSH私钥在各个节点上进行通讯,上面分发的是公钥,rke用不了** **下面说的是免密登录的另一种形式,也是rke采用的形式** 要想使用rke进行安装,需要 - 将其他节点的私钥复制到master节点上 - 将其他节点的公钥添加到该节点的authorized_keys文件中 - 修改.ssh文件夹的权限为700,私钥的权限为600 >i 600的权限指只有User用户可读写,其余用户不可读;700表示只有User可以读写以及执行。 或者将其他节点的密钥放置在nginx节点 ```sh #除nginx节点外,全部运行以下命令 ssh-keygen cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #将所有节点的id_rsa重命名后上传至nginx节点 #修改所有节点上ssh相关文件的权限 chmod 700 .ssh chmod 600 authorized_keys ``` 总结一下 有两种方法: - 主节点存放从节点的私钥已达到免密登录的目的。 - 主节点发放公钥到远程主机达到免密登录的目的。 第一种安全,但是复杂,需要配置权限。 主节点在root用户下生成秘钥对 从节点在rancher用户下生成秘钥对 由于配置的时候将一台主机既当做了主节点又当做了从节点(有rke的那一台,从这台电脑开始安装),所以这台主机要生成两个秘钥对,一个在root用户,一个在rancher用户,root用户要可以ssh访问rancher。 我曾经让各个从节点之间可以互相访问,遇到了无法解决的问题,最终是删除.ssh文件夹重新开始解决的... 配置成功与否的验证: ``` # 在master的root用户下运行 # id_rsa_node1文件是node1 rancher用户下的私钥,拷贝过去的 ssh -i id_rsa_node1 rancher@node1 ``` ## 安装kubernetes 其实是安装了rancher ### 私有 Docker 镜像安装 在所有节点上传已经准备好的rancher镜像资源包,执行镜像导入命令: ```sh docker load -i ~/rancher-images.tar.gz ``` ### 安装 RKE 上传rke_linux-amd64,并赋予执行权限 ```shell chmod +x ~/rke_liunx-amd64 mv rke_linux-amd64 /usr/local/bin/rke ``` ### 创建 RKE 配置文件 ```yaml nodes: - address: 10.215.49.91 user: rancher role: ["controlplane", "etcd", "worker"] ssh_key_path: /root/id_rsa_master port: 2333 - address: 10.215.49.92 user: rancher role: ["controlplane", "etcd", "worker"] ssh_key_path: /root/id_rsa_node2 port: 2333 - address: 10.215.49.90 user: rancher role: ["controlplane", "etcd", "worker"] ssh_key_path: /root/id_rsa_node1 port: 2333 private_registries: - url: reg.hdec.com user: admin password: admin is_default: true services: kube-api: service_node_port_range: 1-65535 ``` ### 执行 RKE ```shell rke up --config ./rancher-cluster.yml # 第一次执行会稍微慢点,如果出现错误就在运行一遍以下命令 #目录可能不存在,创建目录mkdir -p /opt/rke/etcd-snapshots rke up --update-only --config ./rancher-cluster.yml ``` 此步易出错,健康检查失败可以尝试在nginx节点运行下面命令,然后重新执行安装命令 ```shell docker rm -f $(docker ps -aq); docker volume rm $(docker volume ls -q); rm -rf /etc/cni \ /etc/kubernetes \ /opt/cni \ /opt/rke \ /run/secrets/kubernetes.io \ /run/calico \ /run/flannel \ /var/lib/calico \ /var/lib/etcd \ /var/lib/cni \ /var/lib/kubelet \ /var/lib/rancher/rke/log \ /var/log/containers \ /var/log/pods \ /var/run/calico for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done rm -f /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db systemctl restart containerd systemctl restart docker rke up --config ./rancher-cluster.yml ```