首页 > 系统相关 >在centos stream 9上搭建k8s最新版本(当前:v1.26.1)集群环境

在centos stream 9上搭建k8s最新版本(当前:v1.26.1)集群环境

时间:2023-02-17 17:58:35浏览次数:54  
标签:kube centos stream -- sudo ------------------------------------- nfs k8s

为了尽可能契合生产环境的部署情况,这里用kubeadm安装集群,同时方便跟随笔记一步步实践的过程,也更加了解k8s的一些特性和基础知识。

先决条件

这里将通过虚拟机安装3台centos stream 9服务器,并组成kubeneters集群(1个master,2个worker节点),以下是本次实践的基本环境信息:

  • 操作系统:centos stream 9
  • k8s版本:v1.26.1
  • k8s网络插件:flannel
  • k8s存储插件:nfs

一、在虚拟机(VMware Workstation Pro)上安装操作系统

在虚拟机中按安装3台服务器:

  • 10.20.33.11 k8s-master
  • 10.20.33.12 k8s-node01
  • 10.20.33.13 k8s-node02

简要步骤如下:
1、创建新的虚拟机
2、选择典型
3、安装程序光盘映像文件-选择下载好的centos stream 9 文件
4、输入个性化的Linux信息(后面步骤中如果选择精简安装,这里输入信息则无用,这里的信息主要用于桌面版的账户登录)
5、输入虚拟机名称,并选择虚拟的文件存放位置(这里建议不要放到C盘)
6、指定磁盘容量50G,选择【将虚拟磁盘拆分成多个文件】
7、自定义硬件:内存2G,处理器数量1,处理器内核数量2,网络桥接模式(不勾选复制物理网络连接状态),其他都默认即可,点击完成即自动装centos stream 9的引导程序,等待几分钟出现界面配置信息(选择语言)
8、选择中文(简体中文)
9、配置安装目的地-->存储配置默认选择自动即可
10、软件选择-->基本环境-->Minimal Install,这里选择最小安装不需要桌面,需要桌面版的则默认Server with GUI即可
11、网络和主机名-->配置主机名k8s-master(按照上面的规划ip即名称配置)-->配置-->IPv4 设置-->手动(参考你的主机配置地址、DNS),我这里配置如下:

12、ROOT密码-->输入密码-->取消锁定root账户,允许root用户使用密码进行SSH登录--完成后,点击开始安装,等待10分钟左右系统安装完成启动系统
13、启动后,用xshell(或其他连接工具)连接,安装一些基础工具:

yum install -y wget vim net-tools telnet

3个节点重复以上步骤安装完成即可!

二、安装k8s前的系统配置准备

在安装k8s前,通过官方文档了解到有一些服务器的配置工作,来保证k8s能顺利创建和工作。
在每个节点上进行如下操作:
1、关闭防火墙

#临时关闭
systemctl stop firewalld
#永久关闭
systemctl disable firewalld

2、关闭selinux

#永久关闭
sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0

3、关闭swap

#临时关闭
swapoff -a
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

4、将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置);

#启用必要的模块
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

#配置生效
sudo sysctl --system

5、安装containerd
k8s依赖容器运行时(v1.24 弃用 dockershim)(如果需要使用docker,需要安装cri-dockerd组件),我们这里直接使用containerd。

sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

sudo dnf update
sudo dnf install -y containerd

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

# 修改containerd配置
sudo vi /etc/containerd/config.toml
# 1、找到[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]并将值更改SystemdCgroup为true
# 2、找到sandbox_image = "k8s.gcr.io/pause:3.6"并改为sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"

# 重启以应用更改
sudo systemctl restart containerd
# 加入开机启动
sudo systemctl enable containerd

以上完成后我们的服务器就准备就绪了。

三、安装k8s集群及网络插件(flannel)

以下步骤没有显示说明在指定节点上执行的步骤,则在所有节点上执行。
1、添加kubernetes仓库

cat <<EOF > /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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2、安装Kubernetes modules

# 当前最新版本v1.26.1
sudo dnf update
sudo dnf install -y kubelet kubeadm kubectl
# 加入开机启动
sudo systemctl enable kubelet

3、部署kubernetes集群
(1)、在k8s-master节点上初始化集群

# pod-network-cidr填写地址与后面安装的flannel插件默认的网段保持一致
$ kubeadm init \
  --apiserver-advertise-address=10.20.33.11 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16
# 等待一会,成功初始化后,输出内容如下:
-------------------------------------
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 10.20.33.11:6443 --token uh9zuw.gy0m40a90sd4o3kl \
        --discovery-token-ca-cert-hash sha256:24490dd585768bc80eb9943432d6beadb3df40c9865e9cff03659943b57585b2
-------------------------------------

kubeadm join从输出的末尾复制命令并将其保存在安全的地方。稍后我们将使用此命令来允许工作节点加入集群。如果您忘记复制该命令,或者找不到它,您可以使用以下命令重新生成它:

sudo kubeadm token create --print-join-command

接下来按照输出提示创建和声明目录

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

(2)、将pod网络部署到集群

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-------------------------------------
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
-------------------------------------

验证主节点现在是否准备就绪:

$ sudo kubectl get nodes
-------------------------------------
NAME          STATUS   ROLES             AGE   VERSION
k8s-master   Ready    control-plane     2m50s v1.26.1
-------------------------------------

建议检查所有 Pod 是否正常运行:

$ kubectl get pods --all-namespaces
-------------------------------------
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-64897985d-5r6zx 0/1 Running 0 22m
kube-system coredns-64897985d-zplbs 0/1 Running 0 22m
kube-system etcd-master-node 1/1 Running 0 22m
kube-system kube-apiserver-master-node 1/1 Running 0 22m
kube-system kube-controller-manager-master-node 1/1 Running 0 22m
kube-system kube-flannel-ds-brncs 0/1 Running 0 22m
kube-system kube-flannel-ds-vwjgc 0/1 Running 0 22m
kube-system kube-proxy-bvstw 1/1 Running 0 22m
kube-system kube-proxy-dnzmw 1/1 Running 0 20m
kube-system kube-scheduler-master-node 1/1 Running 0 22m
-------------------------------------

(3)、在子节点(k8s-node01、k8s-node02)按照上面的提示添加工作节点
运行第(1)步kubeadm join的命令,将节点加入集群:

$ kubeadm join 10.20.33.11:6443 --token uh9zuw.gy0m40a90sd4o3kl \
        --discovery-token-ca-cert-hash sha256:24490dd585768bc80eb9943432d6beadb3df40c9865e9cff03659943b57585b2
-------------------------------------
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
-------------------------------------

两个节点加入完成后,在k8s-master节点上验证:

kubectl get nodes

输出:

NAME          STATUS   ROLES             AGE   VERSION
k8s-master   Ready    control-plane     2m50s v1.26.1
k8s-node01   Ready                     83s    v1.26.1
k8s-node02   Ready                     93s    v1.26.1

将子节点设置为worker角色:

kubectl label node k8s-node01 node-role.kubernetes.io/worker=worker

完成后,再次查看节点,可以看到ROLES变为了worker,至此,我们的集群就准备就绪了。

四、安装Dashboard

dashboard提供界面化查看kubernetes集群相关资源使用情况,且可在线化编辑和操作资源。
1、下载dashborad.yaml(当前版本:v2.7.0)

wget https://raw.githubusercontent.com/cby-chen/Kubernetes/main/yaml/dashboard.yaml

# 修改dashboard.yaml,暴露端口
$ vim dashboard.yaml
-------------------------------------
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  type: NodePort
  selector:
    k8s-app: kubernetes-dashboard
-------------------------------------
$ kubectl apply -f dashborad.yaml

创建用户:

wget https://raw.githubusercontent.com/cby-chen/Kubernetes/main/yaml/dashboard-user.yaml
kubectl apply -f dashboard-user.yaml

创建登录Token:

$ kubectl -n kubernetes-dashboard create token admin-user
-------------------------------------
eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ1aFlySU9EYzBORlFiZkxLUU5KN0hFRlJZMXNjcUtSeUZoVHFnMW1UU00ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjc2NjI0ODM3LCJpYXQiOjE2NzY2MjEyMzcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiZjk0MjU5MGItZjgzNC00ZDVkLTlhZGItNmI0NzY0MjAyNmUzIn19LCJuYmYiOjE2NzY2MjEyMzcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.eWxD-pVzY9S-QcS4r-YpY7MAzZMg0jgP_Dj0i64aH8z2_NU25IJuNYHWB-3A7H6oEMEAofSbIYui-uE8a2oroLylwSPPP_IjcKmGZ2AUiFOfSD_R2QXzl2AC5-BsXBK068KzSYBfieesB-oWQjS8hKd4AOHjLKWWZlp9gJd_qdc8BbQWrKlKpmdmczQvXpeufj371W_taJIH_xxogmUVMgJOVxwawNsD5YGt0O7-_Y70s8AL9DQs3fAAU4YXGG8TmOI3yvOQCqNgfZuiVg2uE5dc4SGzk_FfBOf3QNCpcL1tvjKe6mH5GWlCNEYbJ4eu9flny9a4iRR2gGpt30AA5Q
-------------------------------------

打开地址:https://10.20.33.11:30001/,输入输出的Token,即可完成登录。

五、安装存储插件(nfs)并测试

未来部署很多应用(mysql、mongodb、minio...)都会用到存储,kubernetes集群常见的存储插件有NFS、Ceph、GlusterFS、iSCSI 等,这里选用NFS。
1、安装NFS服务器
(1)、在k8s-master节点上安装nfs服务作为存储服务器

sudo dnf install -y nfs-utils
sudo mkdir -p /var/nfs/data
sudo chown nobody:nobody /var/nfs/data
sudo chmod 755 /var/nfs/data
# 启动nfs服务
sudo systemctl start nfs-server
# 加入开机启动
sudo systemctl enable nfs-server

(2)、配置NFS共享

$ sudo vim /etc/exports
-------------------------------------
/var/nfs/data *(rw,sync,no_root_squash,no_all_squash)
-------------------------------------
# 应用更改:
sudo exportfs -rav

2、在子节点(k8s-node01、k8s-node02)安装nfs作为客户端访问nfs服务,并测试
安装 NFS 软件包:

sudo dnf install nfs-utils

挂载NFS共享目录:

sudo mkdir -p /nfs/data
sudo mount 10.20.33.11:/var/nfs/data /nfs/data

验证NFS是否可用:

# 在客户端上创建一个测试文件并写入内容,然后在`NFS`服务器上检查文件是否存在并是否包含相同的内容
echo "Hello World 01" > /nfs/data/test-01.txt
cat /nfs/data/test-01.txt

如果输出的内容为 "Hello World 01",则说明NFS配置正确,可用性正常。
3、在k8s-master节点上安装helm,请参考官方文档:https://helm.sh/zh/docs/intro/install/,推荐二进制安装方式
4、在kubernetes集群中安装nfs插件
nfs-client-provisioner是一个Kubernetes存储插件,可以使用NFS作为存储后端,为Pod提供 PV(Persistent Volume)和 PVC(Persistent Volume Claim)。

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=10.20.33.11 \
  --set nfs.path=/var/nfs/data \
  --set storageClass.defaultClass=true

# 这里镜像可能拉取失败,需通过Dashboard将镜像地址更换为:misterli/k8s.gcr.io_sig-storage_nfs-subdir-external-provisioner:v4.0.2

查看是否安装成功:

$ kubectl get pods
-------------------------------------
NAME                                               READY   STATUS    RESTARTS   AGE
nfs-subdir-external-provisioner-7f45674486-r5fhc   1/1     Running   0          6h20m
-------------------------------------

查看storageclass是否创建并且是默认的:

$ kubectl get storageclass
-------------------------------------
NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate           true                   6h35m
-------------------------------------

5、在kubernetes中部署一个应用,验证nfs使用是否正常
通过在Kubernetes集群中创建一个 PVC,将其绑定到一个Pod上并验证它是否能够成功地挂载到NFS存储。
(1)、在 Kubernetes 集群中创建一个 PVC:

$ vim nfs-pvc.yaml
-------------------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-client
-------------------------------------
$ kubectl apply -f nfs-pvc.yaml

accessModes中指定了ReadWriteMany权限,这样这个PVC就可以被多个Pod共享,并且在不同的节点上可以同时挂载这个NFS存储。
(2)、创建一个测试用的 Pod,并将 PVC 绑定到该 Pod 上:

$ vim test-pvc-pod.yaml
-------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
        - name: test-pv
          mountPath: /mnt/data
  volumes:
    - name: test-pv
      persistentVolumeClaim:
        claimName: nfs-pvc
-------------------------------------
$ kubectl apply -f test-pvc-pod.yaml

在这个Pod中,我们将上面创建的test-pvcPVC 绑定到了一个名为test-pvvolume上,然后将该volume挂载到了容器的/mnt/data目录下。
(3)、检查Pod是否正常启动并能够成功挂载NFS存储:

$ kubectl get pod
-------------------------------------
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          1m
-------------------------------------

$ kubectl exec -it test-pod -- ls /mnt/data
-------------------------------------
index.html
-------------------------------------

通过kubectl get pod命令可以看到Pod已经处于Running状态,然后使用kubectl exec命令进入该Pod并在容器中检查/mnt/data目录下是否存在一个名为index.html的文件。如果文件存在,则说明NFS存储已经成功挂载到了Pod中。
如果遇到挂载失败的情况,可以使用kubectl describe pod test-pod命令来查看Pod的详细日志信息,从而定位问题。

标签:kube,centos,stream,--,sudo,-------------------------------------,nfs,k8s
From: https://www.cnblogs.com/zengqinglei/p/17131046.html

相关文章

  • 新建的centos7安装软件
    首先肯定是使用yum进行安装’1、更新自己的   yumupdate2、安装yum仓库 所谓仓库就是每次安装软件的时候有个选择   yuminstall-yyum-utilsdevice-map......
  • 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘
    前言我们之前搭建了第一个docker项目:windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互):https://www.cnblogs.com/xiongze520/p/15069441.html然而我们知道......
  • k8s日志收集方案
    节点系统日志            节点应用日志        节点Pod日志      通过边车容器机制共享Pod卷采集主容器的日志 ......
  • k8s自签证书过期x509: certificate has expired or is not yet valid报错
    问题表现使用kubeletgetnode后报错,x509:certificatehasexpiredorisnotyetvalid,提示证书过期。[root@master~]#kubectlgetnodeUnabletoconnecttothe......
  • 【Linux系统】Centos7系统下配置samba共享
    (【Linux系统】Centos7系统下配置samba共享)一、Samba服务介绍Samba是一套使用SMB(ServerMessageBlock)协议的应用程序,通过支持这个协议,Samba允许Linux服务器与Win......
  • 图解 K8S OOM 和 CPU 节流
    介绍使用Kubernetes时,内存不足(OOM)错误和CPU节流是云应用程序中资源处理的主要难题。这是为什么?云应用程序中的CPU和内存要求变得越来越重要,因为它们与您的云成本......
  • K8s:开源安全平台 kubescape 实现 Pod 的安全合规检查/镜像漏洞扫描
    写在前面生产环境中的k8s集群安全不可忽略,即使是内网环境容器化的应用部署虽然本质上没有变化,始终是机器上的一个进程但是提高了安全问题的处理的复杂性分享一个开......
  • centos 中 使用nginx
    安装nginx使用yum安装yuminstall-ynginx若找不到nginx包(则依次执行一下命令,调整一下yum的源)sudoyuminstallepel-releasesudoyumupdateyuminstall-y......
  • centos7防火墙 使用命令
     一、防火墙的开启、关闭、禁用命令(1)设置开机启用防火墙:systemctlenablefirewalld.service(2)设置开机禁用防火墙:systemctldisablefirewalld.service(3)启动防火墙:syst......
  • k8s版本1.18升级至1.19.16
    一、master节点升级#1.yum升级kubernetes插件yuminstallkubeadm-1.19.16-0kubelet-1.19.16-0kubectl-1.19.16-0--disableexcludes=kubernetes#2.升级版本到1.19.16......