个人博客站—运维鹿:http://www.kervin24.top/
CSDN博客—做个超努力的小奚: https://blog.csdn.net/qq_52914969?type=blog
一、kubernetes介绍
Kubernetes本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行过管理。它的目的就是实现资源管理的自动化,主要提供了以下的主要功能:
-
自我修复:一旦某个容器崩溃,能够在1秒中左右迅速启动新的容器
-
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
-
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
-
负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡
-
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
-
存储编排:可以根据容器自身的需求自动创建存储卷
二、 集群环境搭建
2.1、集群类型
Kubernertes集群大体分为两类:一主多从和多主多从
-
一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合用于测试环境
-
多主多从:多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境
2.2、安装方式
Kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包
-
minikube:一个用于快速搭建单节点kubernetes的工具
-
kubeadm:应该用于快速搭建kubernetes集群的工具
-
二进制包:从官网下载每个组件的二进制包,依次去安装
2.3、环境搭建
2.3、环境搭建1.33版【kubeadm方式】
主机名 | IP | 配置 | 系统发行版 |
---|---|---|---|
master | 192.168.80.10 | 4C2G | CentOS Linux release 7.8 |
node1 | 192.168.80.11 | 4C2G | CentOS Linux release 7.8 |
node2 | 192.168.80.12 | 4C2G | CentOS Linux release 7.8 |
2.3.1、搭建三台虚拟机
搭建k8s,系统发行版需要至少centos7.5,需要预留/var目录下预留≥5G的足够的空间
1 这里采用了阿里云7.8的CentOS-7-x86_64-Minimal-2003.iso链接地址:https://mirrors.aliyun.com/centos-vault/7.8.2003/isos/x86_64/?spm=a2c6h.25603864.0.0.454a60bdb8NRXT2 如果是挂载新iso,利用F2或者F12进BIOS,改光盘驱动安装iso3、更改centos的yum源为阿里云cd /etc/yum.repos.d/mv CentOS-Base.repo CentOS-Base.repo.backupcurl https://mirrors.aliyun.com/repo/Centos-7.repovi CentOS-Base.repo 将curl内容复制进去4、yum install -y wgt 验证成功
2.3.2、主机名解析
主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容# 192.168.80.10 master# 192.168.80.11 node1# 192.168.80.12 node2
2.3.3、时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
#启动chronyd服务[root@master ~]# systemctl start chronyd#设置chronyd服务开机自启[root@master ~]# systemctl enable chronyd#chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了[root@master ~]# date2025年 08月 04日 星期一 17:08:57 CST
2.3.4、禁用iptables和firewalld服务
kubernetes和docker在运动中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
#关闭firewalld服务[root@master ~]# systemctl stop firewalld[root@master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.#关闭iptables服务[root@master ~]# systemctl stop iptablesFailed to stop iptables.service: Unit iptables.service not loaded.
2.3.5、禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
#编辑/etc/selinux/config文件,修改SELINUX的值为disabled#注意修改完毕之后需要重启linux服务SELINUX=disabled
#通过getenforce来命令检查是否生效
2.3.6、禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物
#编辑分区配置文件/etc/fstab,注释掉swap分区一行#注意修改完毕之后需要重启linux服务[root@master ~]# vim /etc/fstab /dev/mapper/centos00-root / xfs defaults 0 0UUID=77663676-1afb-461c-997d-26c7b5e1f096 /boot xfs defaults 0 0#/dev/mapper/centos00-swap swap swap defaults 0 0
理内存使用完之后,将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap,就需要在集群安装过程当中通过明确的参数进行配置说明。
--------------------------------------------
检查是否swap为禁用状态
2.3.7、修改linux的内核参数
#修改linux的内核参数,添加网桥过滤和地址转发功能#编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1#重新加载配置[root@master ~]# sysctl -p#加载网桥过滤模块[root@master ~]# modprobe br_netfilter#查看网桥过滤模块是否加载成功[root@master ~]# lsmod | grep br_netfilterbr_netfilter 22256 0 bridge 151336 1 br_netfilter
2.3.8、配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果需要使用它,需要手动载入ipvs模块
#1 安装ipset和ipvsadm[root@master yum.repos.d]# yum install ipset ipvsadmin -y#2 添加需要加载的模块写入脚本[root@master yum.repos.d]#cat <<EOF > /etc/sysconfig/modules/ipvs.modules#!/bin/bashmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrack_ipv4EOF#3 为脚本文件添加执行权限[root@master modules]# chmod +x /etc/sysconfig/modules/ipvs.modules #4 执行脚本文件[root@master modules]# /bin/bash /etc/sysconfig/modules/ipvs.modules #5 查看对应的模块是否加载成功[root@master modules]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrrnf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
-----------------------------------------------------
执行完以上所有步骤,需要重新启动linux系统
reboot
2.4、安装docker和cri-dockerd
三台都需要安装
2.4.1、安装docker
详见Docker基本管理 - 运维鹿 docker基础教程
1、安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2-------------------------------------yum-utils:提供了yum-config-manager工具。devicemapper:是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。device mapper:存储驱动程序需要device-mapper-persistent-data和lvm2。2、设置阿里云镜像源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3、安装Docker-CE并设置为开机自动启动yum install -y docker-ce docker-ce-cli containerd.io-----------------------------------报错解决:这个报错是container-selinux版本低或者是没安装的原因yum 安装container-selinux 一般的yum源又找不到这个包需要安装epel源 才能yum安装container-selinux然后在安装docker-ce就可以了。########################wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum install epel-releaseyum makecacheyum install container-selinux####################systemctl start docker.servicesystemctl enable docker.service--------------------------------------------------安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。4、配置镜像加速配置修改配置文件/etc/docker/daemon.json(没有时新建该文件)。-------------------{"registry-mirrors": ["https://docker.xuanyuan.me" ,"https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]}---------------------systemctl daemon-reload ###然后重启Docker Daemon。systemctl restart docker
2.4.2、安装cri-dockerd
以下参考实战Kubernetes之快速部署 K8s 集群 v1.28.0-云社区-华为云
kubernetes1.24版本开始不再支持docker
因此,还需要安装cri-dockerd来用于为Docker提供一个能够支持K8S容器运行时标准的工具
#安装cri-dockerd
# 通过 wget 命令获取 cri-dockerd软件
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd-0.3.12-3.el7.x86_64.rpm# 通过 rpm 命令执行安装包
rpm -ivh cri-dockerd-0.3.12-3.el7.x86_64.rpm#安装完成后修改配置文件(/usr/lib/systemd/system/cri-docker.service),
在 “ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://”
这一行增加 “--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9”。#配置文件修改后,重新加载配置并开启 cri-dockerd 服务。
# 加载配置并开启服务
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
2.5、安装kuberbetes组件
三台都需要安装
1、 #编辑/etc/yum.repos.d/kubernetes.repo,添加以下配置
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
EOF2、#安装kubeadm、kubelet和kubect1 (目前最新版本1.28-0)
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0#配置kubernet的cgroup
#编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"3、# 设置 kubelet 自启动
systemctl enable kubelet#在安装kubernetes集群之前,查看所需镜像可以通过下面命令查看
[root@master yum.repos.d]# kubeadm config images list
I0807 22:34:11.171481 4387 version.go:256] remote version is much newer: v1.33.3; falling back to: stable-1.28
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
2.6、集群初始化
2.6.1、Master节点加入K8S集群
下面的操作只需要在master节点上执行
kubeadm init \--apiserver-advertise-address=192.168.80.10 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.28.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16 \--cri-socket=unix:///var/run/cri-dockerd.sock \--ignore-preflight-errors=all相关参数解释:
apiserver-advertise-address:集群广播地址,用 master 节点的内网 IP。
image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
kubernetes-version: K8s 版本,与上面安装的软件版本一致。
service-cidr:集群 Service 网段。
pod-network-cidr:集群 Pod 网段。
cri-socket:指定 cri-socket 接口,我们这里使用 unix:///var/run/cri-dockerd.sock。
执行命令后耐心等待,直到安装完成,会出现以上内容。
其中,在以上返回结果中有 3 条命令需要立即执行,这是用来设置 kubectl 工具的管理员权限,执行之后就可以在 Master 节点上通过终端窗口使用 kubectl 命令。
# 在 Master 节点上执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.6.2、Node节点加入K8S集群
K8s 初始化之后,就可以在其他 2 个工作节点上执行 “kubeadm join” 命令,
因为我们使用了 cri-dockerd ,需要在命令加上 “–cri-socket=unix:///var/run/cri-dockerd.sock” 参数。
在master节点上,可重新生成并获取token和sha256
[root@master /]# kubeadm token create --print-join-command
kubeadm join 192.168.80.10:6443 --token uobpxl.g3wk6xz24ubdw0hi --discovery-token-ca-cert-hash sha256:fe73798d15cf93f4cd1051d85502237505aeddf0d78653a04664e9f4d167c44c# 在两个工作节点上执行
kubeadm join 192.168.80.10:6443 --token uobpxl.g3wk6xz24ubdw0hi \--discovery-token-ca-cert-hash sha256:fe73798d15cf93f4cd1051d85502237505aeddf0d78653a04664e9f4d167c44c \--cri-socket=unix:///var/run/cri-dockerd.sock#在master节点上执行get nodes查看集群节点状态
[root@master /]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 23m v1.28.2
node1 NotReady <none> 26s v1.28.2
node2 NotReady <none> 7s v1.28.2
注意到所有节点的状态都是 “NotReady”,这是由于集群还缺少网络插件,集群的内部网络还没有正常运作。
2.7、安装网络插件calico
kubernetes支持多种网络插件,比如flannel、calico、canal等等,本次选择calico
# 下载 Calico 插件部署文件
wget https://docs.projectcalico.org/manifests/calico.yaml通过vi编辑器修改 “calico.yaml”的4601和4602行
文件中的 “CALICO_IPV4POOL_CIDR” 参数,
需要与前面 “kubeadm init” 命令中的 “–pod-network-cidr” 参数一样(10.244.0.0/16)[root@master opt]# kubectl apply -f calico.yaml
#这里要稍微等一会,calico生效很慢,可以重启服务器尝试
至此,kubernetes集群已经安装成功