CentOS7.9安装单节点k8s教程
将kubeadm join那一段用一个文本文档记下,后面node节点执行加入就是依靠这一条指令。不指定版本默认就是当前最新版本。不指定版本默认就是当前最新版本。不指定版本默认就是当前最新版本。
·
1、内核版本要求
- Kubernetes 1.23+ 需要内核3.10.0-1160及以上,否则无法安装和运行。
- 这是因为最新的Kubernetes启用了新的内核特性,需要相应版本的内核支持。
- 对于CentOS 7,其默认内核版本为3.10.x,比较老旧,无法满足新版本Kubernetes的需求。
Kubernetes单节点环境准备
IP | docker version | cri-dockerd | k8s(Kubernetes) | 内核 | centos | CPU/内存 | hostname |
---|---|---|---|---|---|---|---|
39.99.151.239 | 25.0.3 | v0.3.4 | v1.28.0 | 3.10.0-1160.92.1.el7.x86_64 | 7.9 | 2核(vCPU) 2GiB | master |
- 设置主机名 #并添加到/etc/hosts里 39.99.151.239:
hostnamectl set-hostname master bash
#vim /etc/hosts
39.99.151.239 master
关闭swap
#临时加永久
临时
swapoff -a
永久
vim进入fstab把这行加#号注释掉
vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
关闭防火墙 Selinux
#临时加永久
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
复制
配置NTP时间同步服务
yum -y install ntp
#安装ntp软件包。
systemctl enable ntpd
#设置ntp服务开机自启。
systemctl start ntpd
#启动ntp服务。
ntpdate -u cn.pool.ntp.org
#从公共ntp服务器同步一次时间。
hwclock --systohc
#将系统时间同步到硬件时钟。
timedatectl set-timezone Asia/Shanghai
#设置系统时区为上海。
内核升级(最新)
不指定版本默认就是当前最新版本
#CentOS 7 上安装最新版本 kernel-ml 内核的过程:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#导入 elrepo 源的 GPG 公钥,用于验证软件包的签名。
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
#安装 elrepo 源的 rpm 包,添加 elrepo 源。
yum --enablerepo=elrepo-kernel install kernel-ml -y
#启用 elrepo 源,并安装 kernel-ml 内核包。
sed -i s/saved/0/g /etc/default/grub
#编辑 /etc/default/grub 文件,设置开机从新内核启动。
grub2-mkconfig -o /boot/grub2/grub.cfg
#更新 grub 配置。
reboot
#重启系统,以使用新的内核启动。
#总结:
#该命令的作用是添加 elrepo 源、安装最新的 kernel-ml 内核包,并更新 grub 引导来使用该内核,从而升级系统的 Linux 内核。
docker安装
不指定版本默认就是当前最新版本
#CentOS 7 系统的 yum 源替换为阿里云的镜像源。
#yum update 来更新系统,-y 自动确认。
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum -y update
#首先卸载已安装的Docker
#如果你的操作系统没有安装过Docker就不需要执行卸载命令
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#建立仓库
## 安装Docker所需要的一些工具包
sudo yum install -y yum-utils
## 建立Docker yum仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#使用yum安装了最新版本的Docker CE社区版、命令行工具包及containerd.io容器运行时,完成了Docker CE的安装。
sudo yum -y install docker-ce docker-ce-cli containerd.io
#配置加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://pho7vcn8.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com"
]
}
EOF
#重新加载系统管理守护进程,从而读取新的配置文件。
sudo systemctl daemon-reload
#开机自启并启动Docker
sudo systemctl enable docker --now
#测试 Docker 是否安装正常
sudo docker run hello-world
安装cri-dockerd
最新版本
#到GitHub自行手动下载并上传到服务器
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
#用rpm安装
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
#重载系统守护进程→设置cri-dockerd自启动→启动cri-dockerd
systemctl daemon-reload
systemctl enable cri-docker.socket cri-docker --now
安装Kubernetes(k8s)
不指定版本默认就是当前最新版本
#安装kubectl
#kubectl是kubernetes的命令行工具,是操作、检查集群的重要组件。这里通过 curl 方式来安装 kubectl最新发行版
#通过命令行下载
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
#下载校验文件,验证 kubectl 的可执行文件。
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
#安装 kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
#测试安装是否成功和安装的版本,安装成功会返回一个WARNING,这是正常的,只要版本输出是正确的就说明kubectl安装成功
kubectl version --client
#安装kubeadm
#安装 kubeadm、kubelet 和 kubectl,配置yum文件,因为国内无法直接访问google,这里需要将官网中的google的源改为国内源,以阿里云为例:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
#执行安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#设置kubelet自启动
systemctl enable kubelet --now
下载runc
#安装runc,这是Kubernetes必须要的运行环境。
#到GitHub自行手动下载并上传到服务器
https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
#安装runc,检查是否安装成功
sudo install -m 755 runc.amd64 /usr/local/bin/runc
runc -v
#runc是符合OCI(开放容器 Initiative)标准的容器运行时,也可以看作是docker容器运行时的内核组件。runc提供了直接使用操作系统接口创建和运行容器的功能。
#runc的主要特征包括:
#- 它是轻量级的,只负责运行容器中的进程,不包括镜像管理、容器网络等高级功能。
#- 它可以直接通过OCI标准接口管理容器,不依赖于docker daemon。
#- 它主要用于嵌入到其他系统中,为其提供容器运行能力,如Docker、Kubernetes。
#- runc直接调用Linux内核namespace、cgroup、capabilities等接口创建容器。
#- runc可以跨平台工作,支持主流操作系统。
#- runc允许您自定义容器的配置并直接运行容器,适合自动化的容器处理。
#- runc的设计简单和专注,有利于安全审计和理解。
#总结而言,runc可以看作是实现OCI标准的简单而专注的容器运行时内核,它为其他容器系统提供了直接操作容器的基础工具。Docker和Kubernetes都使用了runc来运行容器实例。
修改配置文件
# vim到/usr/lib/systemd/system/cri-docker.service里修改 找到第10行ExecStart=
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
#这段配置是修改 cri-docker 系统服务的启动参数,主要作用是:
#设置 Kubernetes 使用的容器网络插件为 CNI (Container Network Interface)
#通过 --network-plugin=cni 参数指定网络插件类型为 CNI。这是 Kubernetes 默认的网络模型,需要安装额外的 CNI 插件比如 Calico、Flannel 等来提供 Pod 网络。
#设置 pause 镜像
#通过 --pod-infra-container-image 指定 pause 镜像,这个镜像用来提供 Pod 内部共享的网络和文件空间。
#默认是 k8s.gcr.io/pause,这里修改为了国内阿里云的镜像,加速获取镜像。
#修改 cri-docker 服务的启动参数
#Kubernetes 通过 docker CRI (Container Runtime Interface) 来管理容器,cri-docker 这个系统服务就是 docker 的 CRI 实现。
#通过修改服务启动参数,可以自定义 Kubernetes 使用 docker 时的网络和镜像配置。
#总结一下,这组配置主要是设置了 CNI 网络插件类型和自定义了 pause 镜像,方便后续 Kubernetes 集群使用。
重启
# 重启Docker组件
systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker
# 检查Docker组件状态
systemctl status docker cir-docker.socket cri-docker
启用模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
#启用了overlay和br_netfilter两个对Kubernetes重要的内核模块。
#这是准备Kubernetes节点的必要步骤之一,需要在所有节点上执行完成。
设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
应用 sysctl 参数而不重新启动
sudo sysctl --system
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
master操作
Master初始化
#执行初始化命令,这一步只在主节点master执行
kubeadm init --node-name=master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=39.99.151.239 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
初始化命令注释
# 将下载容器镜像源替换为阿里云,否则因为网络原因会导致镜像拉不下来,一定会执行不成功。
--image-repository=registry.aliyuncs.com/google_containers
# 这是指定容器运行时,因为containerd也是Docker的组件之一,下载Docker会一并将containerd下载下来,在执行初始化时当Kubernetes检测到有多个容器运行时环境,就必须要手动选择一个。这里也可以看出containerd实际上比Docker更轻量得多。
--cri-socket=unix:///var/run/cri-dockerd.sock
# 为API server设置广播地址,这里选择本机的ipv4地址,这里不希望API SERVER设置在其他node上的话就不要改为其他地址。
--apiserver-advertise-address=39.99.151.239
# 指明 pod 网络可以使用的 IP 地址段
--pod-network-cidr=10.244.0.0/16
# 为服务的虚拟 IP 地址另外指定 IP 地址段
--service-cidr=10.96.0.0/12
初始化成功会有以下提示
将kubeadm join那一段用一个文本文档记下,后面node节点执行加入就是依靠这一条指令
mkdir -p $HOME/.kube
#在当前用户的HOME目录下创建.kube配置目录。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#将默认的admin.conf文件拷贝到.kube/config文件,这个admin.conf文件包含了管理集群的凭证和相关配置。
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#将.kube/config文件的ownership修改为当前用户,否则可能因为权限问题无法访问集群。
- 完成这些步骤后,当前用户就可以通过kubectl工具管理该Kubernetes集群了。
- 这是Kubernetes集群安装完成后,在master节点上配置kubectl命令行工具访问集群的常用方法。
- 需要注意kubeconfig文件包含权限敏感信息,要确保其文件权限只对当前用户可读可写。
# 永久生效,执行kubeadm reset后再次init也无需再次执行这条命令
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# 执行永久生效命令之后需要source一下使其生效
source ~/.bash_profile
# 检测配置是否生效
echo $KUBECONFIG
/etc/kubernetes/admin.conf
#这两条命令的作用是设置KUBECONFIG环境变量,以配置kubectl命令行工具访问Kubernetes集群。
#1. echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
#这行将export KUBECONFIG的配置命令追加到当前用户的bash profile文件中。这里将KUBECONFIG变量指定为admin.conf的路径。
#2. source ~/.bash_profile
#运行source命令重新加载bash profile,以立即生效其对环境变量的更改。
#这样就设置了KUBECONFIG变量指向admin.conf文件,kubectl将会使用这个配置文件访问Kubernetes集群。
#admin.conf文件包含访问Kubernetes集群所需的认证信息,是在master初始化时生成的,通常位于/etc/kubernetes/目录下。
#将其路径 export到KUBECONFIG变量是一个简单的方式,来配置kubectl与指定集群的连接。
#将这些命令添加到profile文件中,可以使设置持久化,方便长期使用。
flannel
#安装配置网络插件——这里使用flannel,将kube-flannel.yml文件下载并上传到server上。
#到GitHub自行手动下载并上传到服务器
https://github.com/flannel-io/flannel/releases/download/v0.22.2/kube-flannel.yml
#apply kube-flannel.yml文件,为Kubernetes配置flannel网络插件
kubectl apply -f kube-flannel.yml
cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
#执行完kubectl apply -f kube-flannel.yml这条命令之后,等待一会,才可以查看cat /run/flannel/subnet.env这个文件
更多推荐
已为社区贡献3条内容
所有评论(0)