Rancher 2.x 快速入门部署 nginx
本文的目的是帮助开发者快速了解 基于 Rancher 的 k8s 管理以及部署工作,我们将介绍 Rancher2.x 的基本使用,目前暂不涉及运维层面,请不要将这个文章中所涉及的内容直接搬运到生产环境,毕竟部署起来和稳定运行时两回事,
k8s 本身部署还是很复杂的,部署起来会碰到很多坑,如果使用 Rancher 那就特别简单了,即使你不去特意学习 k8s 也能部署。
先说一下环境,我们先准备三台虚拟主机,如果有钱的话,也可以买两台服务器,我这里使用的是 17 年生成的小米 Pro 笔记本,I7 处理器,16G 内存,已经满足了试验环境的搭建。
机器 | ip | 配置 | 备注 |
---|---|---|---|
CentOS7 | 192.168.0.199 | 2cpu 4G ram | Rancher |
CentOS7 | 192.168.0.210 | 2cpu 4G ram | Master |
CentOS7 | 192.168.0.211 | 2cpu 4G ram | Node |
这里建议一台机器专门跑 Rancher ,跑 k8s 的节点,最好配4G 以上的内存,要不然会很卡。这三台节点,需要内网可以进行访问。
我们接下来开始准备工作,在每个节点上分别执行下面的命令
#0. 安装必备软件
yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate
#1. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
#2. 关闭 SElinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#3. 关闭 swap
sed -i 's/.*swap.*/#&/' /etc/fstab
#4. 重启
reboot -f
#5. 安装 docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#6. 启动并且设置自启动
systemctl enable docker
systemctl start docker
#7. 配置阿里云代理,这里我隐藏了自己的,这东西免费,自己可以去阿里云进行申请。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 8.编辑时间同步,要不然 etcd 可能会报错,很麻烦
crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
在 rancher 虚拟机上部署单节点 rancher。
# 创建目录
mkdir -p /data/rancher
# 创建 docker 容器
docker run -d --restart=unless-stopped -p 8080:80 -p 8843:443 -v /data/rancher:/var/lib/rancher rancher/rancher:v2.4.5
在这里,我们使用的 rancher 单节点模式,如果是用于生产,请使用高可用的 rancher,要不然 rancher 也是有可能出现故障的。
我这里使用的 2.4.5 版本,这是因为我在工作和学习中使用的都是这个版本,就目前文章截止最新版本应该是已经到了 2.6。
启动时我们需要等待一会。我们可以用 docker logs -f 命令来监控日志输出。
访问https://192.168.0.199:8843/ 即可看到这个页面。
我们设置自己的密码,就会跳转到主页,接下来,我们创建集群。
我们在右下角可以更改系统语言。
接下来,我们点击添加集群。
Rancher 不光可以帮助我们建立新的集群,还可以在已有集群的基础上进行导入。
在这里,我们选择自定义后填写集群名称,直接点击下一步,我们使用默认配置即可。
如果是增加 Master 节点,那么这三个我们都需要勾上。
这里需要注意,复制的时候要把 localhost 改成能够进行通信的 ip。
sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.5 --server https://192.168.0.106:8843 --token 8bgdphz9mk9xbbdkrhvsqh6v5zh9gkc55276w5l7m8xlwkgr8xmz4w --ca-checksum 3db552d02da1618d971233431766d57485777d558395dbba6dc2c185ca3bc1b8 --etcd --controlplane
我们分别添加完成后需要等待片刻,如果中途卡在 etcd 上,可以尝试下面的方法。
docker stop $(docker ps -aq)
docker system prune -f
docker volume rm $(docker volume ls -q)
docker image rm $(docker image ls -q)
rm -rf /etc/ceph \
/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
这块我第一次安装的时候折腾了将近两个小时。
当环境没有问题后,我们来部署一个 nginx,首先我们来创建一个项目
我们可以看到有几个默认的 Project,在这里我们就需要来了解一下什么是 namespace 了。
Namespace 是对一组资源和对象的抽象几何,用来将系统内部的对象划分为不同的项目组或者用户组。常用来隔离不同的用户,比如 k8s 自带的服务一般都运行在 kube-system namespace中。
我们先创建一个项目。
接着再增加一个 namespace,之后在左上角我们就可以进入到自己的项目了。
在这里我们可以创建四个内容:Workloads,Load Balancing, Service Discovery,Volumes。
workloads
工作负载是在 Kubernetes 上运行的应用程序。
在 Kubernetes 中,无论你的负载是由单个组件还是由多个一同工作的组件构成, 你都可以在一组 Pod 中运行它。 在 Kubernetes 中,Pod
代表的是集群上处于运行状态的一组 容器 的集合。
Pod 是所有业务类型的基础,也是 k8s 管理的最小单位,可以理解为它是一个或多个容器的组合。
接下来,我们利用 workloads 来创建 nginx。
在这里我们先使用 NodePort,这代表在所有节点(虚拟机)上开放一个特定的端口,任何发送到该端口的流量都被转发到对应的服务上,端口范围胡思 30000~32767。
当显示 Active 的时候就证明已经部署好了,我们可以到 work 节点查看一下。
访问 ip 查看是否能够访问。
如果说访问不了可以尝试一下解决方案
# 安装 iptables
yum install iptables-services -y
# 关闭 iptables 防火墙
service iptables stop && systemctl disable iptables
# 修改内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效配置
sysctl --system
#设置网桥包 iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 >/proc/sys/net/bridge/bridge-nf-call-ip6tables
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
""" > /etc/sysctl.conf
#生效配置
sysctl -p
#开启ipvs,不开启ipvs将会使用iptables,但是效率低,所以官网推荐需要开通ipvs内核
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs