目录
VirtualBox 准备虚拟机环境
软件和系统准备
下载CentOS 7.X镜像
centos 7.9
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2009.iso
centos 7.6(推荐,可以避免虚拟机配置网络时出现问题)
https://mirrors.aliyun.com/centos-vault/7.6.1810/isos/x86_64/CentOS-7-x86_64-Everything-1810.iso
建议下载7.6版本
下载VirtualBox
VirtualBox 6.1.18
https://download.virtualbox.org/virtualbox/6.1.18/VirtualBox-6.1.18-142142-Win.exe
安装VirtualBox和创建CentOS 7.6虚拟机
ViratualBox安装
1、选好安装地方。
2、下一步就行了。
3、过程中需要安装虚拟网卡,这里需要允许。
VirtualBox创建虚拟机安装CentOS
1、创建的时候名字编上号,后面需要三台虚拟机,不编号后面就不好区分,用以弄混。这里先创建一台,后面用复制来创建其他两台虚拟机。
2、创建虚拟机的时候,给出至少2个G的内存。
3、创建好后启动,选择下载好的镜像。
4、选择镜像后就是一些安装工作。
配置网络
这里选择NAT 网络和仅主机(Host Only)网络。“NAT 网络”用来访问外网,“仅主机(Host Only)网络”用来虚拟主机之间、虚拟主机和宿主机之间通信。
NAT网络也可以用“桥接网卡”代替,但是对于多网卡的用户,比如有无线网和有线网的电脑。如果后面切换了上网方式,需要重新配置网络。
NAT网络用DHCP的方式获取IP,仅主机(Host Only)网络用固定IP的方式以供其他虚拟机和宿主机访问。
配置“仅主机(Host Only)网络”(如果使用了NAT 网络并且访问外网不通的情况下需要配置“NAT 网络”)
1、启用一个连接方式为“仅主机(Host Only)网络”的网卡,记下网卡MAC地址,在虚拟机设置->网络->网卡n(仅主机(Host Only)网络)
2、第二步,打开虚拟机,输入ip add或者ifconfig,ifconfig可能会没有安装。利用前面两个命令查看虚拟机的IP地址。虚拟机的“仅主机(Host Only)网络”的IP地址段在安装virtual box安装的那个虚拟网卡上看。这一步的意义在于可以先用ssh工具连上虚拟机,这样操作更加方便。“NAT 网络”在Virtual Box的管理->全局设定->网络。
2.1、仅主机(Host Only)网络查看方式
可以看到红圈的192.168.56.1就是虚拟网卡的网关地址,那虚拟机中192.168.56开头的就是host only的网卡的IP地址,我们在宿主机可以用这个地址来连接虚拟机。
2.2、NAT 网络设置和查看方式。
3、利用ssh工具连上虚拟机后,如果ifconfig工具没有装上,先把ifconfig装上。如果没有公网,比如** ping baidu.com **的时候ping不通,这是改虚拟机"NAT 网络"这张网卡的配置在虚拟机中有问题,这里需要在后面的步骤把该网卡也配置上。
sudo yum install net-tools -y
装上过后用ifconfig查看ip地址,网卡的名字,和网卡的mac地址,后期好确认是否修改成功。
4、进入到虚拟机的**/etc/sysconfig/network-scripts**
cd /etc/sysconfig/network-scripts
这里一般会有一个文件名为**ifcfg-**开头的文件(上面两个镜像一般是文件名为ifcfg-enp0s3),可以使用这个文件作为其中一个网卡的配置文件,再创建一个网卡配置文件,一般为ifcfg-enp0s8(ifcfg-必须,后面的名字随意取)。
vim ifcfg-enp0s8
添加配置文件,下面是模板
TYPE=Ethernet
HWADDR=08:00:27:d9:7d:47#改为上面复制的网卡的mac地址,nat网络和host only都需要配置。
BOOTPROTO=static#如果是host only的,这里用static,如果是NAT 网络,可以使用dhcp。static表示固定网络,dhcp为从IP池中获取。
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8#这里注意,不同网卡配置名字不一样
UUID=b6dca412-c3cb-426d-b4d2-45c1374efa4c#这里用uuidgen生成
DEVICE=enp0s8#这里注意,不同网卡配置名字不一样
ONBOOT=yes#开机启动,这里注意,初始化进系统的时候,有一个默认的ifcfg-xxx,这里是没有开启的,所以将这里改成yes
NETMASK=255.255.255.0
GATEWAY=192.168.56.1 #网关地址,为上面虚拟网卡中的地址
IPADDR=192.168.56.152#固定的IP地址,由网关和掩码决定,一般用255.255.255.0做掩码,只修改ip地址的最后一位
6、重启network,systemctl restart network。如果启动失败,journalctl -xe查看错误原因,如果错误原因是UUID不符合规范,用uuidgen生成新的UUID。
uuidgen enp0s8 #这里的enp0s8为上面网卡配置文件的DEVICE的值
生成后重新放到配置文中,重复第6步。
注意:这里必须把网络配置通过,能访问公网和宿主机与虚拟机间能连通,特别是宿主机和虚拟机,虚拟机和虚拟机之间。
7、如果上面的配置生效,这里可能ssh工具会和虚拟机之间断开,这是因为新配置的host only的配置已经生效,切换ip为配置的静态ip地址即可。这里开始复制创建好的这个虚拟机,复制2个出来,复制好后在另外的两个虚拟主机重复第5和第6步。
这里可能出现复制后的主机在经过第5和第6步后,配置不生效,网络依然不通的问题,这个时候删除掉这个虚拟机,重新复制一遍(最笨的办法)。
确认是否上述问题的办法
nmcli connection show
查看网卡配置文件中的device的值是否和UUID的值对的上。如果对不上,并且在下面会多没有连接的connection。而这个没连接connection的UUID才是你网卡配置文件中的UUID。这个时候就可以按照上面的办法尝试了。
安装k8s(Kubeadm)
CentOS的系统初始化
初始化环境
1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2、关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
3、关闭 swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
4、设置主机名,方便查看。
hostnamectl set-hostname <hostname>
5、添加master和node节点添加hosts
cat >> /etc/hosts << EOF
192.168.56.100 master_100
192.168.56.101 node_101
192.168.56.101 node_102
EOF
6、将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #生效
7、时间同步,这里注意,本地安装虚拟机的,建议每次打开虚拟机都执行一次同步时间的命令。因为本地休眠或者关机后,时间就不会更新了。
yum install ntpdate -y
ntpdate time.windows.com #每次打开虚拟机都执行一次这个
安装Docker/kubeadm/kubelet(master节点和node节点都要执行)
1、安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version
2、设置docker镜像地址,registry-mirrors后面的为阿里云的docker镜像地址,建议自己申请一个
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://hrblko1e.mirror.aliyuncs.com"]
}
EOF
3、添加阿里云 kubernetes的YUM 软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4、安装 kubeadm, kubelet 和 kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
部署master节点(只在master执行)
1、初始化k8s master,去除下面的\,并且将命令放在一行。apiserver-advertise-address为master的ip地址,service-cidr和pod-network-cidr为虚拟的docker内网,需要和虚拟机实际内网地址网段不同
kubeadm init \
--apiserver-advertise-address=192.168.56.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
master节点init后后出现一个node用来join到master的命令,里面包含了token等信息,但是这个有效期只有24小时,需要重新获取重新输入以下命令
kubeadm token create --print-join-command
2、指定阿里云镜像仓库地址,下面的命令是将配置文件放到k8s的默认配置文件地址,k8s会在这个文件夹内查找配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看配置文件是否生效,不报错就是配置文件没问题
kubectl get nodes
部署node节点(只在node节点执行)
1、将node节点join到master节点,复制上面master在init时打印出来的join命令
kubeadm join 192.168.56.100:6443 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
上面的token只有24小时的有效时间,如果后面节点超过了token有效期想要加入master,需要重新获取token。
2、查看node节点有无加入到master节点,下面命令在master机器执行
kubectl get nodes
这个命令会看到node节点已加入到master节点,但是他的状态时NotReady,下面会安装网络插件。
安装网络插件(master节点执行)
1、安装网络插件,下面的文件可能无法在国内下载
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
可以使用其他方法下载下来,然后使用
kubectl apply -f 本地文件地址
2、查看是否成功
kubectl get pods -n kube-system
可以看到name为kube-flannel-ds开头的,status为running的,即为成功。如果有不是running,可能node节点正在下载。
3、查看node节点状态,如果为ready,即node节点的网络插件也下载完成,如果状态不是ready,稍等一下,下载比较慢。
kubectl get nodes
测试整个集群
1、master节点执行安装nginx
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
在最后一个命令会出现node节点的nginx的状态,访问node节点的ip加端口就可以访问到nginx