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
posted @ 2023-12-06 16:21  小舟杂笔  阅读(225)  评论(0)    收藏  举报