准备好虚拟机并安装好OS

  • 安装虚拟机软件,如:virtual box
  • 安装一台或多台机器,操作系统 CentOS7.x-86_x64

准备单台虚拟机CentOS7.x-86_x64

先复制出来一台,目的是安装相关的二进制文件,如Docker/kubeadm/kubelet等。这些文件无论是在master节点还是worker节点都是需要安装的,这样是为了节省时间和步骤。

在这里插入图片描述

配置单机物理环境

配置双网卡

配置NAT访问和hostonly网卡,目的是访问外网和固定本地ip

  • nat网卡
    在这里插入图片描述

  • host-only网络
    在这里插入图片描述

配置cpu、内存、disk

硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置单机软件环境

启动并登陆CentOS7.x-86_x64系统

在这里插入图片描述

规划并配置网络

可以看到host-only的网段为 192.168.56.1/24

在这里插入图片描述

这里计划k8s使用的网段ip为 192.168.56.190到192.168.56.200
这里先配置为静态ip192.168.56.190

cd /etc/sysconfig/network-scripts/
vi ifcfg-enp0s8

更改为:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s8
UUID=884cc662-d278-4620-b821-57a07890a135
DEVICE=enp0s8
# ONBOOT=no
IPV6_PRIVACY=no


BOOTPROTO=static
IPADDR=192.168.56.190
NETMASK=255.255.255.0
# GATEWAY=192.168.56.255
# DNS1=192.168.241.2
ONBOOT=yes

然后再重启网络服务

systemctl restart network

配置免密登陆

sshpass -p 111111 ssh-copy-id -o  StrictHostKeyChecking=no  root@192.168.56.190

在这里插入图片描述

关闭交换内存

swapoff -a

固化配置,不开机启动
如果不固化这个配置,在安装完k8s,再重启os时,kubelet组件开启自启会失败。

# 将文件中的/dev/mapper/centos-swap swap swap defaults 0 0这一行注释掉
vi /etc/fstab

输入命令,若swap那一行输出为0,则说明已经关闭。
在这里插入图片描述

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
iptables -F

关闭selinux

# 修改配置文件,禁止开机启动
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 停止当前运行
setenforce 0

配置docker源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

配置阿里k8s的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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

导入gpgkey文件

wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import yum-key.gpg
rpm --import rpm-package-key.gpg

确定要安装的各个软件版本

这里主要是指用的到docker、chrony、kubeadm、kubectl、kubelet、kubernetes-cni

重置yum缓存

yum clear all
yum makecache

通过假安装命令,查看各个的版本
yum install docker-ce chrony kubeadm kubectl kubelet kubernetes-cni
在这里插入图片描述

看到版本后,输入n 取消安装
在这里插入图片描述

由上面的版本信息,确定它们最近的偶数版本则为最近的稳定版本

软件当前版本期望的最新稳定版本
chrony3.4-1.el73.4
docker-ce3:20.10.8-3.el720.10.8
kubeadm1.22.1-01.20.8
kubectl1.22.1-01.20.8
kubelet1.22.1-01.20.8
kubernetes-cni0.8.7-00.8.6

安装相关最新稳定版软件包及依赖

yum install docker-ce-20.10.8 chrony-3.4 kubeadm-1.20.8 kubectl-1.20.8 kubelet-1.20.8 kubernetes-cni-0.8.6

这里发现有的软件包回到了奇数版本,由于依赖关系,也没好的办法,输入y 继续即可
在这里插入图片描述

安装并配置时钟源

参考链接:https://blog.51cto.com/qiuyue/2344678

vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10


# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
allow 192.168.56.1/24

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
systemctl restart chronyd
systemctl enable chronyd
# 查看时间同步源状态
chronyc sourcestats -v

启动docker服务并设置开机自启

systemctl restart docker
systemctl enable docker

设置kubelet服务开机自启

这是因为k8s每个node在重启后,是依靠kubelet重新拉起k8s状态的,并且kubeadmin在初始化机器时,也会进行这个配置检查

systemctl enable kubelet

修改/etc/sysctl.conf文件,将桥接的IPv4/6流量传递到iptables的链:

vi /etc/sysctl.conf
# 如果有,则修改
# 如果没有,添加如下行到/etc/sysctl.conf配置文件:
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1


# 触发配置生效
sysctl -p

到这一步为止,基础配置和二进制包已经准备就绪,可以保存当前系统快照,以便后面启动多台master和work节点。

部署第一台k8s node,即首台master节点

复制出一台虚拟机当作master节点

在这里插入图片描述

配置master1节点的ip

# 更改master的ip 为 192.168.56.191
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
# 重启网络
systemctl restart network

配置免密登陆

sshpass -p 111111 ssh-copy-id -o  StrictHostKeyChecking=no  root@192.168.56.191

配置master1节点的hostname

# 设置完hostname后,注销再重新登陆,即可看到新的hostname
hostnamectl set-hostname master1

初始化Kubernetes Master1

先确定kubeadm的版本
在这里插入图片描述

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

kubeadm init \
--apiserver-advertise-address=192.168.56.191 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.8 \
--service-cidr=10.2.0.0/16 \
--pod-network-cidr=10.3.0.0/16

在这里插入图片描述

可以看到,最后有成功字样。

安装kubectl配置文件

在这里插入图片描述
根据初始化的成功提示,配置kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

配置完成后,就可以使用kubectl命令了
在这里插入图片描述

安装cni网络插件

在上一步的最后,可以发现master的节点处于NotReady的状态,查看节点的状态,发现 network plugin is not ready: cni config uninitialized
在这里插入图片描述

此时需要安装网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

安装完网络插件后,master1显示为Ready

首个master节点完成配置

在这里插入图片描述

增加worker节点

复制出一台虚拟机当worker节点

在这里插入图片描述

初始化worker节点,如ip、hostname等

配置ip

在这里插入图片描述

配置hostname

在这里插入图片描述

配置免密登陆

在这里插入图片描述

worker节点加入集群

按照kubeadmin init最后的提示,将其它机器加入节点,获取
或者在在master节点上执行kubeadm token create --print-join-command 命令获取token值也可以
如果加入过程中有报错,根据报错提示,来解决,不同问题不同分析
如在此次加入过程中,提示系统某个设置没有开启,使用命令开启即可:echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

# 例如:
kubeadm join 192.168.56.191:6443 --token n5v2e2.5zq6ravyafltnzm6 --discovery-token-ca-cert-hash sha256:8e9529c91431e141ab6b90ef42a43960223292e815c1ac923c6b9a5f9e4a27c1

在这里插入图片描述

可以在master节点上,查看到集群所有node的状态

如图,所有节点已经ready了

在这里插入图片描述

增加master节点

配置好一台虚拟机,然后执行以下步骤,以master节点的身份加入集群

获取control-plane certificate key

在k8s集群的master节点执行如下命令,获取certificate key

kubeadm init phase upload-certs --upload-certs

在这里插入图片描述

获取api-server token值

kubeadm token create --print-join-command

在这里插入图片描述

拼接master加入的命令,并在准备好的机器上执行

kubeadm join 192.168.56.191:6443 --token djr77x.xacbkl6jnyrmdyiz     --discovery-token-ca-cert-hash sha256:ddfce5533209184220fb9a7172a071b9e05a0d9651e9c9a3402b2bb0b026c390 --apiserver-advertise-address 192.168.56.193  --certificate-key 2a0023d83c1917503010f1126090ff455e12e76dfd0642db5999029074f95eab

在这里插入图片描述

生成kubectl配置文件

mkdir -p $HOME/.kube
# 将第一台节点上的配置文件拷过来
sudo scp 192.168.65.191:/etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

检查节点状态

在这里插入图片描述

扩容k8s集群

扩容机器

参考上面步骤即可

  • 按照增加worker节点的步骤增加worker节点
  • 按照增加master节点的步骤增加master节点
    在这里插入图片描述

扩容服务

  • 在扩容好worker机器后,一般不会影响使用
  • 在扩容好master机器后,可以看到,etcd、api-server、kube-controller、kube-scheduler都还是单点服务,没有HA
  • coredns在调度到其它master节点时,也会有Running不到正常的状态

具体解决步骤,见文章扩容单机k8s服务到多个master节点
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐