0


搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

一、前言

1、k8s概述

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

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

2、NFS简介

NFS,即网络文件系统(Network File System),是一种用于在计算机系统之间共享文件和目录的协议。NFS最初由Sun公司开发,目前已经成为全球广泛使用的网络文件系统之一,无论是在企业内部网络还是在云计算环境中。

NFS允许远程计算机像访问本地文件一样访问和操作远程文件,从而方便了多台计算机之间的文件共享和协作。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS不仅适用于Linux与Unix之间实现文件共享,也能实现Linux与Windows间的文件共享功能。

NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,这样,从本地端的系统来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,使用上相当便利。

NFS的应用场景非常广泛,它可以用于办公环境,实现文件服务器的高可用性,保证数据的可靠传输和处理,提高工作效率;对于大型企业来说,NFS可以提供集中式的文件存储和管理,简化文件管理流程,降低运营成本。

二、NFS服务器搭建

1、准备NFS 服务器

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

2、搭建NFS服务

安装 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集群

这里我们安装的k8s只有一台master一台node,而在实际生产环境中,master节点和node节点必须要有多台组成高可用,这里为了节省资源,我们每个角色只用了一台

1、环境准备

准备至少2台服务器,虚拟机或服务器都可以,资源配置如下

2、禁用防火墙和SELinux

在两台机器上都要执行

关闭防火墙并禁止开机自启动

[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

3、设置时间同步

[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

4、关闭swap交换分区

[root@master ~]# swapoff -a

[root@node ~]# swapoff -a

5、修改hosts文件

[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

6、修改机器内核参数

[root@master ~]# modprobe br_netfilter
[root@master ~]# cat > /etc/sysctl.d/k8s.conf <<EOF

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 <<EOF

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

7、配置阿里repo源

[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

8、安装container

[root@master ~]# yum install containerd.io -y

[root@node ~]# yum install containerd.io -y

9、修改containerd配置文件

[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

10、设置container开机自启动

[root@master ~]# systemctl enable containerd --now

[root@node ~]# systemctl enable containerd --now

11、设置服务的端点地址

[root@master ~]# cat > /etc/crictl.yaml <<EOF
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 <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

12、安装docker

[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

13、添加docker镜像加速器

[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

14、配置软件源

[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

15、安装kubeadm、kubelet、kubectl

[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

16、设置kubelet开机自启动

[root@master ~]# systemctl enable kubelet

[root@node ~]# systemctl enable kubelet

17、上传离线镜像包

离线镜像包我已经放到个人主页的资源中,大家可以自行下载

18、导入镜像

[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

19、设置容器运行时

[root@master ~]# crictl config runtime-endpoint /run/containerd/containerd.sock

20、初始化Master节点

[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

21、设置容器运行时

[root@node ~]# crictl config runtime-endpoint /run/containerd/containerd.sock

22、导入镜像

[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

23、将Work节点加入到集群

在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

24、查看集群状态

[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 10m v1.28.2
node NotReady <none> 5s v1.28.2

25、为Work节点设置标签

[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

26、安装网络插件calico

calico介绍

  • Calico是一个开源的网络和网络安全解决方案,专为容器化环境设计,旨在提供网络连接和安全策略管理功能。它基于BGP协议,实现了一个纯三层网络方案,能够与Kubernetes、AWS、OpenStack等云平台良好地集成。
  • Calico的核心功能包括网络连接、网络策略和安全性。通过使用BGP路由协议,Calico能够在所有节点上通过Linux Kernel实现高效的vRouter进行数据转发。每个vRouter都会将在本节点上运行的容器的路由信息广播到整个Calico网络,并自动设置到达其他节点的路由转发规则。这种设计确保了所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。

27、安装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

28、查看Pod状态

[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

四、在k8s集群中使用nfs

1、安装nfs驱动

在集群的两个节点上分别执行

yum install nfs-utils -y
systemctl enable nfs --now

2、编写yaml文件

[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
  • apiVersion: v1 表示使用的是 Kubernetes API 的第一个版本。
  • kind: Pod 表示这个资源对象是一个 Pod。

metadata

metadata:  
  name: test-nfs-volume
  • metadata 包含了关于这个 Pod 的元数据。
  • **name: **test-nfs-volume 给这个 Pod 设置了一个唯一的名称。

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
  • containers 字段定义了 Pod 中运行的容器列表。
  • name: test-nfs 是容器的名称。
  • image: nginx 指定了容器使用的镜像。
  • **imagePullPolicy: **IfNotPresent 表示如果本地没有镜像,则尝试从镜像仓库拉取。
  • ports 字段定义了容器监听的端口。
  • **containerPort: **80 指定容器监听的端口为 80。
  • **protocol: **TCP 表示使用 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
  • **volumes **字段定义了 Pod 中可以使用的卷列表。
  • name: nfs-volumes 给卷设置了一个名称。
  • **nfs **字段定义了 NFS 卷的属性。
  • **path: **/data/nfs-k8s 指定了 NFS 服务器上共享的路径。
  • **server: **192.168.40.132 指定了 NFS 服务器的 IP 地址。

3、创建Pod

在master节点上执行

[root@master ~]# kubectl  apply -f nfs.yaml

五、测试数据持久化

1、创建首页文件

在nfs服务器上,cd到 /data/nfs-k8s 目录

[root@nfsserver nfs-k8s]# echo "hello nfs" > index.html

添加权限

[root@nfsserver nfs-k8s]# chmod 644 index.html

2、访问测试

在k8s master节点上执行

查看pod IP

[root@master ~]# kubectl get pod -owide

访问测试

[root@master ~]# curl 10.244.167.134

此处可以看到我们刚刚创建的文件的内容,证明k8s调用nfs作为持久化存储成功

至此,NFS服务器的搭建与k8s中的使用测试完成

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!


本文转载自: https://blog.csdn.net/weixin_53269650/article/details/137460285
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。

“搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存”的评论:

还没有评论