Kubernetes(V1.27.4)集群搭建
注意事项
- Kubernetes核心三大组件(kubeadm、kubelet、kubectl)版本必须保持一致
- 集群机器之间必须能互通
- Kubernetes v1.24之前的版本直接集成了Docker Engine的一个组件,名为 dockershim,之后的版本需要继续使用Docker需要安装CRI的实现插件cri-dockerd。
集群搭建方式
Minikube
- 优点:
- 轻量级:Minikube是一个轻量级的Kubernetes集群,适合在本地开发和测试。
- 易于安装:安装和配置Minikube非常简单,适合快速搭建本地Kubernetes环境。
- 单节点部署:适合单机测试和开发,不需要复杂的集群配置。
- 缺点:
- 单节点限制:由于是单节点部署,无法模拟多节点集群的复杂环境。
- 生产环境不适用:不适合在生产环境中使用,因为无法提供高可用性和容错性。
Kubeadm(推荐)
- 优点:
- 灵活性:kubeadm提供了更灵活的部署选项,可以用于搭建生产环境的多节点Kubernetes集群。
- 社区支持:由Kubernetes官方维护,得到了广泛的社区支持和更新。
- 缺点:
- 配置复杂:相对于Minikube而言,kubeadm的配置和部署过程更为复杂。
- 需要手动管理:需要手动处理集群的各种配置和管理任务。
kubeKey(KubeSphere提供)
- 优点:
- 自动化部署:kubekey提供了自动化的Kubernetes集群部署,简化了部署过程。
- 多节点支持:支持多节点集群的部署,适合生产环境的需求。
- 缺点:
- 学习曲线:可能需要一定的学习曲线来熟悉kubekey的使用和配置。
- 依赖性:可能对特定的操作系统或环境有一定的依赖性。
其它
......
计算机资源(根据实际业务情况而定)
- Master节点(Control Plane)
CPU 2核 RAM 4G - Node节点(Data Plane)
CPU 8核 RAM 16G
环境说明
- 操作系统&内核版本:CentOS Linux 7 (Core) & 3.10.0-1127.el7.x86_64
- 服务器IP:
Master节点(192.168.0.26)
Node节点(192.168.0.217) - Docker版本:19.3.11(Master) 24.0.6(Node)
- Kubernetes版本:v1.27.4
集群搭建
基础搭建(所有节点)
hostname修改
hostnamectl set-hostname <xxx>
#例如修改成以下内容:
hostnamectl set-hostname k8s-master
#查看hostname
cat /etc/hostname
hosts修改
结合hostname并且所有的节点上都要配置
vi /etc/hosts
例如添加以下内容:
192.168.0.26 k8s-master
192.168.0.217 k8s-node1
转发IPv4并让iptables看到桥接流量
- 系统启动时自动加载指定的内核模块:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
- 当前系统加载内核模块:
sudo modprobe overlay
sudo modprobe br_netfilter
- 设置所需的 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参数查看:
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
关闭swap
k8s在swap开启的情况下集群无法使用,所以要关闭
#临时关闭:
swapoff -a
#永久关闭(注释掉fstab中包含swap的这一行即可):
vi /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
reboot #重启使其生效
防火墙
k8s集群机器都是内网环境(建议关闭防火墙)。如果不关闭防火墙的话,部署的过程中会出现很多端口未开放之类的问题,排查很耗时间。
- 关闭防火墙
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #关闭防火墙自启动
- 防火墙端口开放
#所有节点上开放:
sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent #k8s安全api
sudo firewall-cmd --zone=public --add-port=6443/udp --permanent
sudo firewall-cmd --zone=public --add-port=10250/tcp --permanent #k8s api
sudo firewall-cmd --zone=public --add-port=10250/udp --permanent
#NFS服务端(安装主机上)开启端口:
#rpcinfo -p查看实际端口情况
firewall-cmd --zone=public --add-port=111/tcp --permanent #portmapper
firewall-cmd --zone=public --add-port=111/udp --permanent
firewall-cmd --zone=public --add-port=892/tcp --permanent #mountd
firewall-cmd --zone=public --add-port=892/udp --permanent
firewall-cmd --zone=public --add-port=2049/tcp --permanent #nfs
firewall-cmd --zone=public --add-port=2049/udp --permanent
#执行防火墙生效:
sudo firewall-cmd --reload #重新加载防火墙
sudo firewall-cmd --zone=public --list-ports #查看防火墙所有开放的端口
禁用SELinux
容器需要访问系统资源
#临时关闭
sudo setenforce 0
#永久关闭
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
k8s yum配置
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
Docker安装
- 自行安装即可,版本尽量选择新版本
- 镜像配置:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tsvqojsz.mirror.aliyuncs.com"]
}
EOF
#重新加载systemd管理的单元文件
sudo systemctl daemon-reload
#重启Docker
sudo systemctl restart docker
#查看状态
sudo systemctl status docker
cri-dockerd安装
- 使用rpm包安装cri-dockerd:
#wget下载rpm包
sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
#rpm安装
sudo rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
#重新加载systemd管理的单元文件
sudo systemctl daemon-reload
#系统启动时自动启动
sudo systemctl enable cri-docker.socket cri-docker
#启动cri-docker.socket和cri-docker
sudo systemctl start cri-docker.socket cri-docker
- 查看服务状态:
sudo systemctl status cri-docker.socket
sudo systemctl status cri-docker
- cri-dockerd镜像配置:
vi /usr/lib/systemd/system/cri-docker.service
#找到ExecStart(大概在第10行),修改成下面(也可以将原来的加#注释掉):
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
#重新加载systemd管理的单元文件
sudo systemctl daemon-reload
#重启cri-docker.socket和cri-docker
sudo systemctl restart cri-docker.socket cri-docker
#查看状态
sudo systemctl status cir-docker.socket cri-docker
Kubernetes安装
#核心三大组件安装,版本要保持一致(kubeadm和kubelet必须要在所有节点上安装,kubectl可以只安装在工作机器上,建议全安装)
sudo yum install -y kubelet-1.27.4-0 kubeadm-1.27.4-0 kubectl-1.27.4-0 --disableexcludes=kubernetes
#开机自启动&立即启动kubelet
sudo systemctl enable --now kubelet
Master节点安装
Master节点初始化
- k8s主节点初始化:
kubeadm init --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.0.26 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
#说明
--pod-network-cidr为集群给pod分配的地址网段
--service-cidr为集群给service分配的地址网段
- 初始化成功后核心打印日志:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.26:6443 --token idu925.e176ekv2f2s0m34s \
--discovery-token-ca-cert-hash sha256:718dd62f2906aa8b9cb625a585f75eda5b24f9ddc16027e1f67c295ad5ac6996
#重点说明
#非root用户,按要求要先执行以下步骤:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#root用户按要求直接执行以下步骤:
export KUBECONFIG=/etc/kubernetes/admin.conf #临时生效,重启后失效,不推荐
#添加到用户bash shell配置文件,确保在每次启动终端时都会设置KUBECONFIG环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
#查看配置是否成功
echo $KUBECONFIG
#集群加入指令,在工作节点上执行
kubeadm join 192.168.0.26:6443 --token idu925.e176ekv2f2s0m34s \
--discovery-token-ca-cert-hash sha256:718dd62f2906aa8b9cb625a585f75eda5b24f9ddc16027e1f67c295ad5ac6996
#日志打印的缺失具体的socket连接方式,要使用下面的(末尾添加--cri-socket=unix:///var/run/cri-dockerd.sock):
kubeadm join 192.168.0.26:6443 --token idu925.e176ekv2f2s0m34s \
--discovery-token-ca-cert-hash sha256:718dd62f2906aa8b9cb625a585f75eda5b24f9ddc16027e1f67c295ad5ac6996
--cri-socket=unix:///var/run/cri-dockerd.sock
#集群加入指令如果不清楚了,可以通过一下指令查看
kubeadm token create --print-join-command
- 验证集群:
#看是否是Ready状态
kubectl get nodes
网络插件flannel
- 下载yaml文件(kube-flannel.yml),上传到Master节点服务器:
https://github.com/flannel-io/flannel/releases - 使用k8s安装:
kubectl apply -f kube-flannel.yml - 查看环境:
cat /run/flannel/subnet.env
Node节点安装
- 从Master节点拷贝admin.conf:
#可以在Master节点上使用scp指令进行拷贝到本机(192.168.0.217)指定目录
scp /etc/kubernetes/admin.conf 192.168.0.217:/etc/kubernetes/
#或者通过FTP软件上传
#添加到用户bash shell配置文件,确保在每次启动终端时都会设置KUBECONFIG环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
- 加入k8s集群:
#从Master初始化操作日志信息复制出来(注意指明--cri-socket)
kubeadm join 192.168.0.26:6443 --token idu925.e176ekv2f2s0m34s \
--discovery-token-ca-cert-hash sha256:718dd62f2906aa8b9cb625a585f75eda5b24f9ddc16027e1f67c295ad5ac6996 --cri-socket=unix:///var/run/cri-dockerd.sock
- 验证集群:
#看是否是Ready状态
kubectl get nodes
其它安装(除特别声明外服务器随意)
NFS(Network File System)安装
NFS服务端
- NFS服务端安装:
#yum安装nfs
yum -y install nfs-utils
#验证是否成功安装了NFS相关的软件包
rpm -qa | grep nfs
#开机自启动&立即启动NFS服务器服务
systemctl enable nfs-server --now
#查看NFS服务器服务的当前状态
systemctl status nfs-server
#查看rpcbind服务状态
systemctl status rpcbind
- NFS共享目录搭建:
#创建共享目录(磁盘空间一定要大)
mkdir /nfs_share_dir
#编辑NFS服务器的共享目录
vim /etc/exports
#NFS服务器的共享目录添加以下内容:
#将/nfs_share_dir目录以读写(rw)方式、异步(async)方式共享,并且禁用了root用户的权限限制(no_root_squash)
/nfs_share_dir *(rw,async,no_root_squash)
#查看共享配置是否已经生效
cat /etc/exports
#重新加载并更新NFS服务器的共享配置
exportfs -arv
#重启rpcbind、nfs服务(同时开启开机自启动,如果之前开启了可以不用重复性开启)
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs
#查看RPC服务的注册状况
rpcinfo -p localhost
#查看NFS服务端挂载信息
showmount -e 192.168.0.26
NFS客户端(k8s集群中的所有Node节点安装)
- NFS客户端安装(跟服务端类似):
yum -y install nfs-utils
systemctl enable nfs-server --now
systemctl status nfs-server
#查看rpcbind服务状态
systemctl status rpcbind
#查看NFS服务端挂载信息
showmount -e 192.168.0.26
helm(k8s包管理工具)安装(用不到可以忽略)
官网:https://helm.sh
- 下载安装包文件,上传到服务器:
https://github.com/helm/helm/releases - 解压缩文件:
tar -zxvf helm-xxx-linux-amd64.tar.gz - 移动文件位置:
mv linux-amd64/helm /usr/local/bin/helm
k8s配置StorageClass支持NFS
注意事项
- 需要在k8s集群内的节点上安装(因为是通过k8s来安装的)
- 已安装好NFS服务端
下载扩展存储卷yaml文件
- git拉取项目(也可以自己下到本地上传到服务器):
git clone https://github.com/kubernetes-incubator/external-storage.git
#说明
#安装中只使用到external-storage/nfs-client/deploy目录下的yaml文件
#重点说明
#deployment.yaml文件需修改的地方:
#由于nfs-client-provisioner镜像已不再维护,文件中的镜像(第24行)要换成nfs-subdir-external-provisione(我这里是将原来的注释掉,加了一行):
#image: quay.io/external_storage/nfs-client-provisioner:latest
image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0
#env配置(结合自己安装的NFS服务器信息):
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs #提供服务的名字,StorageClass使用的时候需要用到
- name: NFS_SERVER
value: 192.168.0.26 #NFS服务器
- name: NFS_PATH
value: /nfs_share_dir #NFS共享目录
#卷挂载信息配置(结合自己安装的NFS服务器信息):
volumes:
- name: nfs-client-root
nfs:
server: 192.168.0.26 #NFS服务器
path: /nfs_share_dir #NFS共享目录
- deployment.yaml示范代码:
1 apiVersion: apps/v1
2 kind: Deployment
3 metadata:
4 name: nfs-client-provisioner
5 labels:
6 app: nfs-client-provisioner
7 # replace with namespace where provisioner is deployed
8 namespace: default
9 spec:
10 replicas: 1
11 strategy:
12 type: Recreate
13 selector:
14 matchLabels:
15 app: nfs-client-provisioner
16 template:
17 metadata:
18 labels:
19 app: nfs-client-provisioner
20 spec:
21 serviceAccountName: nfs-client-provisioner
22 containers:
23 - name: nfs-client-provisioner
24 #image: quay.io/external_storage/nfs-client-provisioner:latest
25 image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione:v4.0.0
26 volumeMounts:
27 - name: nfs-client-root
28 mountPath: /persistentvolumes
29 env:
30 - name: PROVISIONER_NAME
31 value: fuseim.pri/ifs
32 - name: NFS_SERVER
33 value: 192.168.0.26
34 - name: NFS_PATH
35 value: /nfs_share_dir
36 volumes:
37 - name: nfs-client-root
38 nfs:
39 server: 192.168.0.26
40 path: /nfs_share_dir
安装NFS制备器
- 进入到项目的external-storage/nfs-client/deploy目录下
- k8s部署NFS资源权限(RBAC):
kubectl apply -f rbac.yaml - k8s部署NFS制备器:
kubectl apply -f deployment.yaml - k8s部署StorageClass资源:
kubectl apply -f class.yaml
#k8s标记一个默认的StorageClass
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
k8s中使用NFS
- 创建持久卷申领PersistentVolumeClaim(PVC)后,PVC会自动结合NFS创建并绑定持久卷PersistentVolume(PV)
- k8s其它资源需要使用只需配置对应的PVC即可
kubectl客户端安装(与服务端可以有小版本的差距,保持版本一致最好,如果服务端就能直接使用kubectl的话可以忽略安装)
- Kubectl客户端安装
#下载kubectl安装包
curl -LO https://dl.k8s.io/release/v1.27.4/bin/linux/amd64/kubectl
#下载校验文件
curl -LO "https://dl.k8s.io/v1.27.4/bin/linux/amd64/kubectl.sha256"
#安装
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
#验证
kubectl version --output=yaml
问题
问题一:dial tcp 10.96.0.1:443: connect: no route to host
- 解决方案:
systemctl stop kubelet
systemctl stop docker
#清空iptables规则表中的所有规则。iptables是Linux系统中的防火墙工具,通过清空规则表可以重置防火墙配置。
iptables --flush
#清空iptables的NAT表中的所有规则
iptables -tnat --flush
systemctl start kubelet
systemctl start docker
问题二:Node节点执行showmount -e 192.168.0.26报错
- showmount -e报错日志:
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
- 解决方案:
#NFS服务端查看端口
rpcinfo -p
#防火墙开启对应端口
问题三:Error from server (BadRequest): container "nfs-client-provisioner" in pod
- 报错日志:
Error from server (BadRequest): container "nfs-client-provisioner" in pod "nfs-client-provisioner-6c66687f4c-jmnzl" is waiting to start: ContainerCreating
- 解决方案:
#Node节点rpcbind没启动
systemctl start rpcbind
systemctl status rpcbind
浙公网安备 33010602011771号