
🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、前言
1、k8s概述
2、NFS简介
二、NFS服务器搭建
1、准备NFS 服务器
2、搭建NFS服务
三、安装k8s集群
1、环境准备
2、禁用防火墙和SELinux
3、设置时间同步
4、关闭swap交换分区
5、修改hosts文件
6、修改机器内核参数
7、配置阿里repo源
8、安装container
9、修改containerd配置文件
10、设置container开机自启动
11、设置服务的端点地址
12、安装docker
13、添加docker镜像加速器
14、配置软件源
15、安装kubeadm、kubelet、kubectl
16、设置kubelet开机自启动
17、上传离线镜像包
18、导入镜像
19、设置容器运行时
20、初始化Master节点
21、设置容器运行时
22、导入镜像
23、将Work节点加入到集群
24、查看集群状态
25、为Work节点设置标签
26、安装网络插件calico
27、安装calico
28、查看Pod状态
四、在k8s集群中使用nfs
1、安装nfs驱动
2、编写yaml文件
3、创建Pod
五、测试数据持久化
1、创建首页文件
2、访问测试
Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。
Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。
有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

NFS,即网络文件系统(Network File System),是一种用于在计算机系统之间共享文件和目录的协议。NFS最初由Sun公司开发,目前已经成为全球广泛使用的网络文件系统之一,无论是在企业内部网络还是在云计算环境中。
NFS允许远程计算机像访问本地文件一样访问和操作远程文件,从而方便了多台计算机之间的文件共享和协作。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS不仅适用于Linux与Unix之间实现文件共享,也能实现Linux与Windows间的文件共享功能。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,这样,从本地端的系统来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,使用上相当便利。
NFS的应用场景非常广泛,它可以用于办公环境,实现文件服务器的高可用性,保证数据的可靠传输和处理,提高工作效率;对于大型企业来说,NFS可以提供集中式的文件存储和管理,简化文件管理流程,降低运营成本。

准备一台Linux服务器,虚拟机或物理机都可以,操作系统Ubuntu或centos,这里选择Centos

安装 nfs-utils 软件包。
[root@nfsserver ~]# yum install nfs-utils -y 创建共享目录
[root@nfsserver ~]# mkdir /data/nfs-k8s -p 配置nfs权限
[root@nfsserver ~]# vim /etc/exports 添加如下内容
/data/nfs-k8s *(rw,no_root_squash) 关闭防火墙并禁用SELinux
[root@nfsserver ~]# systemctl stop firewalld && setenforce 0 启动nfs服务
[root@nfsserver ~]# systemctl start nfs 为数据目录添加读写权限
[root@nfsserver ~]# chmod 666 /data/ -R 使nfs配置生效
[root@nfsserver ~]# exportfs -arv 至此,nfs服务器已搭建完成
这里我们安装的k8s只有一台master一台node,而在实际生产环境中,master节点和node节点必须要有多台组成高可用,这里为了节省资源,我们每个角色只用了一台
准备至少2台服务器,虚拟机或服务器都可以,资源配置如下

在两台机器上都要执行
关闭防火墙并禁止开机自启动
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@node ~]# systemctl stop firewalld && systemctl disable firewalld
关闭SELinux
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
[root@master ~]# getenforce
Permissive
[root@node ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@node ~]# setenforce 0
[root@node ~]# getenforce
Permissive
[root@master ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@master ~]# date
Tue Mar 19 14:10:22 CST 2024
[root@node ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@node ~]# date
Tue Mar 19 14:10:22 CST 2024
[root@master ~]# swapoff -a
[root@node ~]# swapoff -a
[root@master ~]# vi /etc/hosts
# 添加如下两行内容
192.168.40.110 master
192.168.40.111 node
[root@node ~]# vi /etc/hosts
# 添加如下两行内容
192.168.40.110 master
192.168.40.111 node
[root@master ~]# modprobe br_netfilter
[root@master ~]# cat > /etc/sysctl.d/k8s.conf <> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@node ~]# modprobe br_netfilter
[root@node ~]# cat > /etc/sysctl.d/k8s.conf <> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF
[root@node ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master ~]# yum install yum-utils device-mapper-persistent-data lvm2 -y
[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@node ~]# yum install yum-utils device-mapper-persistent-data lvm2 -y
[root@node ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master ~]# yum install containerd.io -y
[root@node ~]# yum install containerd.io -y
[root@master ~]# mkdir -p /etc/containerd
[root@master ~]# containerd config default > /etc/containerd/config.toml
[root@master ~]# vim /etc/containerd/config.toml#将SystemdCgroup = false修改为SystemdCgroup = true
[root@node ~]# mkdir -p /etc/containerd
[root@node ~]# containerd config default > /etc/containerd/config.toml
[root@node ~]# vim /etc/containerd/config.toml#将SystemdCgroup = false修改为SystemdCgroup = true
[root@master ~]# systemctl enable containerd --now
[root@node ~]# systemctl enable containerd --now
[root@master ~]# cat > /etc/crictl.yaml <
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@node ~]# cat > /etc/crictl.yaml <
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
[root@master ~]# yum install docker-ce -y
[root@master ~]# systemctl enable docker --now
[root@node ~]# yum install docker-ce -y
[root@node ~]# systemctl enable docker --now
[root@master docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://ofcqsr1y.mirror.aliyuncs.com"]
> }
> EOF[root@master docker]# sudo systemctl daemon-reload
[root@master docker]# sudo systemctl restart docker
[root@node docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://ofcqsr1y.mirror.aliyuncs.com"]
> }
> EOF[root@node docker]# sudo systemctl daemon-reload
[root@node docker]# sudo systemctl restart docke
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
# 添加如下内容[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@node ~]# vim /etc/yum.repos.d/kubernetes.repo
# 添加如下内容[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@master ~]# yum install kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 -y
[root@node ~]# yum install kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 -y
[root@master ~]# systemctl enable kubelet
[root@node ~]# systemctl enable kubelet
离线镜像包我已经放到个人主页的资源中,大家可以自行下载
[root@master ~]# ctr -n=k8s.io images import k8s-1-28.tar.gz
[root@master ~]# ctr -n=k8s.io images import k8s-1-28-etcd.tar.gz
[root@master ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@master ~]# kubeadm init --kubernetes-version=1.28.2 --apiserver-advertise-address=192.168.40.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看节点状态
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 66s v1.28.2
[root@node ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@node ~]# ctr -n=k8s.io images import k8s-1-28-etcd.tar.gz
[root@node ~]# ctr -n=k8s.io images import k8s-1-28.tar.gz
在Master节点上生成token
[root@master ~]# kubeadm token create --print-join-command
将生成的密钥考到node节点执行
[root@node ~]# kubeadm join 192.168.40.110:6443 --token 8zx14z.br9wctj9shxb08sq --discovery-token-ca-cert-hash sha256:6559345665c6beb70a9da42c2de6b85fc41f61d3dc3c527be3f7cc4629c503ab
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 10m v1.28.2
node NotReady5s v1.28.2
[root@master ~]# kubectl label nodes node node-role.kubernetes.io/work=work
#再次查看
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 10m v1.28.2
node NotReady work 5s v1.28.2
calico介绍

[root@master ~]# curl -L -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
[root@master ~]# kubectl apply -f calico.yaml
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-658d97c59c-fbrgn 1/1 Running 0 5m31s
kube-system calico-node-qd6v2 1/1 Running 0 5m31s
kube-system calico-node-s9khc 1/1 Running 0 5m31s
kube-system coredns-66f779496c-l6nqx 1/1 Running 0 19m
kube-system coredns-66f779496c-n7jn6 1/1 Running 0 19m
kube-system etcd-master 1/1 Running 0 19m
kube-system kube-apiserver-master 1/1 Running 0 19m
kube-system kube-controller-manager-master 1/1 Running 5 19m
kube-system kube-proxy-7wbhh 1/1 Running 0 9m15s
kube-system kube-proxy-bb47r 1/1 Running 0 19m
kube-system kube-scheduler-master 1/1 Running 5 19m
在集群的两个节点上分别执行
yum install nfs-utils -y systemctl enable nfs --now [root@master ~]# vim nfs.yaml apiVersion: v1 kind: Pod metadata: name: test-nfs-volume spec: containers: - name: test-nfs image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP volumeMounts: - name: nfs-volumes mountPath: /usr/share/nginx/html volumes: - name: nfs-volumes nfs: path: /data/nfs-k8s server: 192.168.40.132 这段配置文件的解释如下:
apiVersion 和 kind
apiVersion: v1 kind: Pod metadata
metadata: name: test-nfs-volume spec
spec 字段定义了 Pod 的期望状态。
containers
containers: - name: test-nfs image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP volumeMounts: - name: nfs-volumes mountPath: /usr/share/nginx/html volumes
volumes: - name: nfs-volumes nfs: path: /data/nfs-k8s server: 192.168.40.132 在master节点上执行
[root@master ~]# kubectl apply -f nfs.yaml 在nfs服务器上,cd到 /data/nfs-k8s 目录
[root@nfsserver nfs-k8s]# echo "hello nfs" > index.html 添加权限
[root@nfsserver nfs-k8s]# chmod 644 index.html 在k8s master节点上执行
查看pod IP
[root@master ~]# kubectl get pod -owide 
访问测试
[root@master ~]# curl 10.244.167.134 
此处可以看到我们刚刚创建的文件的内容,证明k8s调用nfs作为持久化存储成功
至此,NFS服务器的搭建与k8s中的使用测试完成
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!