🐇明明跟你说过:个人主页
🏅个人专栏:《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 <<EOFnet.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 <<EOFnet.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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。