🐰 安装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
```