K8s安装
准备阶段
机器配置
!!!除了对master的操作,前面的操作均需在每一台虚拟机进行
机器:4台机器(看实体机配置,实在不行准备两台到三台,其中一台作为master机器,管理其他node机器)
参数:2核1线程,2G内存,20G硬盘
系统:CentOS 7
- 为每台虚拟机修改主机名,使用
hostnamectl set-hostname 需要设置主机名
,用于区分不同的虚拟机。 - 为每台机器配置静态IP:
- 修改配置时建议将原本的文件备份保存,配置出错可以通过备份文件恢复(这个备份方法直接cv原来文件内容到实体机文件都可)
- 静态IP设置方法
在/etc/sysconfig/network-scripts/ifcfg-ens33修改如下
# 将BOOTPROTO从dhcp改为static或none
BOOTPROTO="static"
# 若没有ONBOOT添加
ONBOOT="yes"
# 下面的都需要添加,如果在桥接模式下ip地址要和实体机相同网段,网关要和实体机网关相同。如果是nat则和nat网段相同。我这里用192.168.*.*代替要配置的,记得改(一定要注意IP地址和网关)
IPADDR="192.168.*.*"
PREFIX="24"
GATEWAY="192.168.*.*"
#DNS服务器可以只配置一个,当然也可以配置两个
DNS1="114.114.114.114"
DNS2="8.8.8.8"
- 配置完成之后使用
systemctl restart network
刷新服务,并使用ping
命令进行测试能否连接外网,能够连接则配置成功
- 关闭每台虚拟机防火墙和seLinux,防止干扰k8s运行,最好清除iptables规则
# 关闭防火墙并且设置开机不启动
systemctl stop firewalld
systemctl disable firewalld
# 关闭seLinux,getenforce是获取seLinux的状态
# 没有设置过seLinux一般getenforce查询结果为Enforcing,需设置为disable关闭
getenforce
# 直接修改文件,改为SELINUX=disabled,重启之后生效
vim /etc/selinux/config
# 清除iptables规则
iptables -F
- 关闭交换分区(k8s1.8版本以上要求必须关闭)以提升性能
# 临时关闭
swapoff -a
# 修改/etc/fstab文件永久关闭,将文件中/dev/mapper/centos-swap swap行注释即可,也可以直接运行下面这条命令
sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab
- 升级所有软件
yum update -y
(不必要,可跳过) - 安装一些软件(非必要,可不做)
yum install -y device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxm12-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 telnet ipvsadm npdate
- 互相配置ssh免密通道(这一步也没必要,配置步骤博主会写另一篇博客)
- 修改/etc/hosts文件
# 直接运行下面的命令,记得将IP地址修改为自己机器的IP地址,主机名字也换成自己的
cat >> /etc/hosts << EOF
192.168.*.* k8smaster
192.168.*.* k8snode1
192.168.*.* k8snode2
192.168.*.* k8snode3
EOF
- 加载模块br_netfilter(和网络通信有关)
# 临时加载
modprobe br_netfilter
# 永久加载,创建文件,在文件中写入模块名字br_netfilter
vim /etc/modules-load.d/k8s.conf
systemctl restart systemd-modules-load.service
#代替命令,也需要运行systemctl这条命令
cat >> /etc/modules-load.d/k8s.conf << EOF
> br_netfilter
> EOF
- 修改内核参数以满足k8s的运行需求,运行下面的命令
cat <<EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
# 重新加载系统参数配置,让上面的修改生效
sysctl -p
安装docker
由于在2022年k8s的1.24版本更新中已经完全放弃了docker作为容器运行时软件,想要继续使用docker作为容器运行时软件,只能安装1.23以下的版本,然后k8s1.23版本支持的最新docker是20.10。
安装docker命令:
#安装工具包
yum install -y yum-utils
# 使用工具包自动下载docker,这是官方的源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#可以使用阿里云镜像替换官方源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 指定版本安装docker
yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io
# 开启docker服务
systemctl start docker
# 设置开机启动
systemctl enable docker
# 配置Docker使用systemd作为默认Cgroup驱动,配置之后需要重启docker
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker
安装k8s
- 添加k8s yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
- 安装kubeadm,kubelet,kubectl(指定版本)
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
- 设置kubelet开机自启动
systemctl enable kubelet
- 安装CoreDNS容器(k8s集群运行时需要CoreDNS提供DNS解析服务)
# 拉取镜像
docker pull coredns/coredns:1.8.4
# 将镜像改名
docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
master节点初始化
以下操作在master节点进行
- 使用
kubeadm init
命令进行初始化,运行下面的命令之后等待命令跑完
# 记得改变IP,只要改第一行的IP地址,一般改为master节点地址
kubeadm init \
--apiserver-advertise-address=192.168.*.* \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
#--pod-network-cidr=192.168.0.0/16
- –pod-network-cidr有两个值,打算使用calico网络插件时,最好使用192.168.0.0/16,然后打算使用flannel网络插件时最好使用10.244.0.0/16
- 出现下面的提示结果代表初始化成功了
- 初始化成功之后,通过提示结果在节点机器运行
kubeadm join
部分的命令加入节点
- 节点加入成功之后的结果
- 初始化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 get node
命令查看节点状态
- 到这里发现所有节点为NotReady状态,这是因为完成互通还需要安装CNI(Container Networking Interface)网络插件
安装网络插件
CNI 全称是“Container Networking Interface”,即容器网络接口,它提供了一种标准的插件机制,用于连接容器到底层网络中。CNI 插件是一种可执行程序,它将实现容器网络连接的一些逻辑打包在一起,允许容器使用不同的网络模型,并提供了一组网络抽象接口。在 Kubernetes 等容器编排平台中,CNI 插件被广泛使用来实现容器网络。
CNI 插件可以由第三方厂商开发和维护,因此,可以选择最适合自己的插件。CNI 插件通常运行在主机上,并由容器运行时调用,例如 Docker、rkt 等。当容器需要连接到主机网络时,CNI 插件将会为其创建必要的网络接口和路由规则。
一些常用的 CNI 插件包括:
- Flannel:一个简单易用的网络解决方案,支持多种部署模式。
- Calico:一个高度可扩展的容器网络方案,旨在为大规模生产环境提供网络和安全性。
- Weave Net:一个分布式的容器网络方案,具有良好的可扩展性和高度自动化的管理。
- Cilium:一个基于 eBPF 的容器网络和安全解决方案,提供强大的流量控制和安全性。
安装命令(只要在master节点运行)
flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
calico
# 这两条命令不一样,别看错了
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/custom-resources.yaml
# 查看部署进度
watch kubectl get pods -n calico-system
一般这里执行会卡住,这两条
kubectl create -f
命令要先去外网下载相关的yaml文件,需要挂代理(有时在虚拟机用wget命令也能下载下来),但是虚拟机不好代理,可以在实体机上将yaml文件(迅雷等软件可以下载)下载下来再使用xftp等软件传给虚拟机,然后执行下列命令kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml
安装完之后,再运行kubectl get node
查看(一般要等一下,不会立马就改变状态)
到这里安装完成,每个步骤博主都亲测可用,如果有问题,欢迎大家在评论区讨论。
小试牛刀
走完上面的步骤就安装完成k8s了,可以玩一玩k8s的命令,下面是一个用命令建立pod的小例子
kubectl create deployment k8s-nginx --image=nginx -r 3
命令的含义就不解释了。。。。。
kubectl get pod -o wide
可以查看结果: