Kubernetes-集群搭建
二、集群搭建
安装所需的软件和工具下载链接,提取码:6yvy
1 准备工作
我们需要搭建一个三个节点的集群,一个harbor用于搭建私有仓库。
master节点物理配置:100G存储,2G内存,4核心CPU
node节点物理配置:100G存储,4G内存,4核心CPU
harbor节点物理配置:100G存储,2G内存,2核心CPU
网络均选择NAT模式
2 网络配置
我们为每个节点分配的网络如下
网段:192.168.142.0
网关:192.168.142.2
master:192.168.142.20
node-1:192.168.142.21
node-2:192.168.142.22
harbor:192.168.142.100
NAT网络配置如下
接下来进行网络配置,使虚拟机能连接到物理机。进入linux网络配置目录:
1 | cd /etc/sysconfig/network-scripts |
2.1 master网络配置
2.2 node-1网络配置
2.3 node-2网络配置
所有的机器配置完后需要重启网络服务
1 | service network restart |
2.4 代理配置
为了后续安装,需要为每台机器配置一下proxy。
修改/etc/profile
,末尾增加以下内容:
1 | http_proxy=http://[代理地址]:[代理地址的端口]/ |
这里的代理地址是本机的ip地址,可以通过ipfonfig
命令查看:
保存后,使配置生效
1 | source /etc/profile |
测试
1 | curl http://toyaml.com:9999/whoami |
可以看到,获取到的IP已经变成了代理服务器的外网IP。
取消代理:
1 | unset http_proxy |
3 正式搭建
3.1 设置主机名
每个节点都要执行
每个节点分别设置为自己的主机名
1 | hostnamectl set-hostname k8s-master # master节点 |
3.2 修改host文件
每个节点都要执行
1 | vi /etc/hosts |
添加如下内容:
1 | 192.168.142.20 k8s-master |
3.3 安装依赖
每个节点都要执行
安装之前,配置一下yum源
1 | $ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 基本源 |
安装依赖
1 | $ yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim |
3.4 设置防火墙为 Iptables 并设置空规则
每个节点都要执行
1 | $ systemctl stop firewalld && systemctl disable firewalld |
这是在学习/测试环境下清空,在生产环境下要自己确定开放的端口。
3.5 关闭虚拟内存和SELINUX
每个节点都要执行
1 | $ swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab |
3.6 针对k8s调整内核参数
每个节点都要执行
1 | $ cat > kubernetes.conf <<EOF |
如果提示:sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录
或者sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录
,解决方法:
临时解决,重启失效:
1 | modprobe br_netfilter |
开机加载上面这个模块:
1 | $ cat > /etc/rc.sysinit << EOF |
3.7 调整系统时区
每个节点都要执行
1 | # 设置系统时区为 中国/上海 |
3.8 关闭系统不需要的服务
每个节点都要执行
1 | systemctl stop postfix && systemctl disable postfix |
3.9 设置日志方案
每个节点都要执行
centos7以后两个日志服务rsyslogd
和systemd journald
,这里选择journald
1 | mkdir /var/log/journal # 持久化保存日志的目录 |
3.10 升级系统内核
每个节点都要执行
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定
1 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm |
重启
1 | reboot |
重启后,输入命令查看内核版本
1 | uname -r |
3.11 kube-proxy开启ipvs的前置条件
每个节点都要执行
1 | modprobe br_netfilter |
如果提示FATAL: Module nf_conntrack_ipv4 not found.
是因为我们升级的时候升级到高版本了,高版本的centos内核nf_conntrack_ipv4被nf_conntrack替换,所以装不了。
解决方法:降级内核到4.44。
手动下载4.44版本内核的rpm包到同一个目录下,然后安装:
1 | yum localinstall -y *.rpm |
查看当前安装的所有linux内核版本:
1 | rpm -qa | grep -i kernel |
设置开机从新内核启动
1 | grub2-set-default 'CentOS Linux (4.4.249-1.el7.elrepo.x86_64) 7 (Core)' |
这里提供一个4.4.249
版本的内核下载地址。
旧版本的内核rpm包不再维护,导致我们下载的是较新版本。另外一个解决方案是:自己下载旧版本的源码包编译打包为rpm包。
3.12 安装Docker
每个节点都要执行
1 | # 安装依赖 |
3.13 安装 Kubeadm (主从配置)
每个节点都要执行
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
3.14 初始化主节点
每个节点都要执行
本地导入镜像压缩包kubeadm-basic.images.tar.gz
,解压
1 | tar -xzvf kubeadm-basic.images.tar.gz |
新建一个shell导入镜像,vim load.sh
1 | !/bin/bash |
添加执行权限并执行:
1 | chmod a+x load.sh |
导入完成后可以查看镜像:
1 | docker images |
接下来在主节点操作
开始初始化kubernetes
1 | # 生成kubeadm的初始配置信息 |
完成后,查看一下日志信息:
1 | vim kubeadm-init.log |
日志提示我们集群已经创建成功,想要加入节点就按照如下步骤操作:
3.15 加入主节点和其他工作节点
在主节点操作
根据日志信息的提示,创建一个.kube
目录
1 | mkdir -p $HOME/.kube |
复制管理员配置文件到.kube/config
目录下
1 | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config |
添加权限
1 | sudo chown $(id -u):$(id -g) $HOME/.kube/config |
配置完成后,查看节点
1 | kubectl get node |
可以查看到节点说明部署成功,但是状态显示notready
,还需要继续部署网络
3.16 部署网络
在主节点操作
创建一个安装目录install-k8s
,把配置文件和日志这些重要文件存放在install-k8s/core/
下
1 | mkdir install-k8s |
接下来部署flannel,下载kube-flannel.yml
1 | cd plugin/flannel/ |
如果不能下载,可以到这个文件所在的github地址,手动下载保存,然后把文件上传到虚拟机上。
创建flannel网络
1 | kubectl create -f kube-flannel.yml |
查看是否创建成功:
1 | kubectl get pod -n kube-system |
此时查看节点运行情况:
1 | kubectl get node |
显示ready
说明已经成功了。
在其他节点操作
接下来将其他节点加入,在初始化主节点的日志文件中vim kubeadm-init.log
,日志的最末尾会提示我们如何添加节点:
我们复制该命令到其他节点执行
1 | kubeadm join 192.168.142.20:6443 --token abcdef.0123456789abcdef \ |
等待一会,再次查看会发现集群部署成功:
4 私有仓库搭建
首先,为harbor虚拟机安装docker,不再赘述。
4.1 配置docker私有仓库地址
在harbor虚拟机中,如果配置一个私有仓库,默认需要https才能push镜像,要解决这个问题需要指定``insecure-registries`
1 | vim /etc/docker/daemon.json |
配置如下
1 | { |
重启docker
1 | systemctl restart docker |
由于后续我们要生成一个假证书,集群的所有节点想访问该仓库,也需要修改配置文件。
4.2 安装docker-compose
为harbor虚拟机安装docker-compose
1 | curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
下载完后,添加可执行权限
1 | chmod +x /usr/local/bin/docker-compose |
测试安装
1 | docker-compose --version |
4.3 安装并配置harbor
官方下载地址:github
下载harbor
1 | wget https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz |
解压
1 | tar -xzf harbor-offline-installer-v1.2.0.tgz |
解压完成后会多出一个harbor
目录,将它移动到/usr/local
目录下
1 | mv harbor /usr/local/ |
配置harbor.cfg
文件(这是1.2.0版本,如果是更高版本需要配置harbor.yml
)
1 | cd /usr/local/harbor/ |
打开之后,需要修改如下字段:
1 | hostname = hub.example.com # 目标的主机名或者完全限定域名 |
保存退出,然后需要创建SSL证书的目录:
1 | mkdir -p /data/cert/ |
4.4 创建 https 证书以及配置相关目录权限
进入证书目录cd /data/cert
1 | # 创建私钥,会让我们创建一个密码 |
进入harbor
目录
1 | cd /usr/local/harbor/ |
如果提示如下错误:
1 | unexpected character "<" in variable name near "<sample_admin@mydomain.com>\nEMAIL_IDENTITY=\nHARBOR_ADMIN_PASSWORD=Harbor12345\nPROJECT_CREATION_RESTRICTION=everyone\nVERIFY_REMOTE_CERT=on\nMAX_JOB_WORKERS=3\nUI_SECRET=1589q70QqYIbniWt\nJOBSERVICE_SECRET=aWyDblUOZc0HHJFC\nTOKEN_EXPIRATION=30\nCFG_EXPIRATION=5\nGODEBUG=netdns=cgo\nADMIRAL_URL=NA\nWITH_NOTARY=False\nWITH_CLAIR=False\nCLAIR_DB_PASSWORD=password\nRESET=false\n" |
构建过程中,如果提示缺少目录,就mkdir创建,重新安装即可。
最后创建成功如图所示:
4.5 为集群节点添加私有仓库的host
为集群所有节点添加私有仓库的host
1 | echo "192.168.142.100 hub.example.com" >> /etc/hosts |
检查harbor的host有没有写
1 | cat /etc/hosts |
如果没写,把它写上,总之保证每个节点以及harbor的hosts文件都是这样的:
1 | 192.168.142.20 k8s-master |
在本地windows物理机的hosts也添加一下仓库地址,以便用浏览器访问。
检查一下harbor是否启动成功:
1 | docker ps -a |
打开浏览器访问:https://hub.example.com/
,就可以访问到如下图页面
我们登录进去,默认用户名是admin,密码是Harbor12345(在harbor.cfg中有写)
接下来验证节点的docker是否能访问到这个仓库,切换到master节点
1 | docker login https://hub.example.com |
docker登录成功。
尝试推送一个镜像到私有仓库:
1 | docker pull ibmcom/helloworld # 我们去官方pull一个helloworld镜像 |
根据提示
为镜像打标签,push上去:
1 | docker tag ibmcom/helloworld hub.example.com/library/helloworld |
刷新一下浏览器,可以看到已经推送上去了。
接下来删除本地的镜像
1 | docker rmi ibmcom/helloworld hub.example.com/library/helloworld |
测试一下k8s的集群能否从私有仓库拉取镜像。
1 | kubectl run nginx-deployment --image=hub.example.com/library/helloworld:latest --port=80 --replicas=1 |
查看是否成功获取
1 | kubectl get pod -o wide |
如图,已经被node-2运行了,说明集群工作正常,可以从私有仓库获取镜像。
至此k8s集群和一个私有仓库就搭建完成了。