k8s基础知识总结node+pod(上)

一、概念:

k8s(Kubernetes )是一个开源的容器编排平台,用于容器化应用程序的部署、扩展和管理。使运维人员能够轻松地管理容器化应用的整个生命周期,包括容器的调度、资源分配、服务发现、负载均衡、自动伸缩以及故障恢复等功能。

二、命名空间

命名空间是一种用于在单个 Kubernetes 集群中划分不同虚拟集群的机制,它提供了一种将集群资源进行逻辑隔离的方式;

2.1 作用:

  • 资源隔离:不同命名空间中的资源相互隔离,可为不同团队/用户(或项目)提供虚拟的集群空间,有助于不同团队或不同应用组件之间的资源管理和使用,避免名称冲突和资源的误操作。
  • 权限控制:可以为不同的命名空间设置不同的访问权限。例如,开发团队可能对开发命名空间具有完全的读写权限,而生产运维团队对生产命名空间有特定的管理权限。
  • 环境区分:通常可以根据不同的环境(如开发、测试、生产等)创建相应的命名空间。这样可以在同一个集群中为不同环境提供独立的运行空间,方便进行环境特定的配置和管理。

2.2 相关命令:

bash 复制代码
查看命名空间:
kubectl get namespace
或者
kubectl get ns
或者
kubectl get ns --show-labels # 显示namespace的label

查看某个namespace的概要信息:
kubectl describe ns xxxx

查看所有命名空间概要:
kubectl describe namespace 或 kubectl describe ns

创建命名空间:
kubectl create namespace xxx 或 kubectl create ns xxx

删除命名空间 :kubectl delete ns xxx

注意:

下面所有的命令,在实际操作时,应该加上命名空间,否则默认为default命名空间

三、Node

Node(节点)是集群中的工作机器,可以是物理主机或虚拟机。它是运行应用程序容器的实际工作负载节点,分为:Master 节点、Worker 节点。

bash 复制代码
查看集群中的 Node:
kubectl get nodes
(返回当前集群中所有 Node 的基本信息,如名称、状态、角色)

查看特定 Node 的详细信息:
kubectl describe node <node-name> 
(将返回有关该 Node 的详细信息,包括标签、资源使用情况)

添加标签到 Node:
kubectl label node <node-name> environment = production,
(为 Node 添加一个名为 "environment",值为 "production" 的标签,方便进行资源调度和管理)

从集群中删除 Node:
kubectl delete node <node-name>
(从集群中删除指定的 Node,k8s会停止在该Node上运行的所有Pod,并将其调度到其他可用的Node上)

标记节点为不可调度:
kubectl cordon <node-name>
(将节点标记为不可调度,这在准备进行节点维护等操作时很有用,它可以防止调度器将新的 Pod 分配到该节点,但不影响已在该节点上运行的 Pod)

取消节点不可调度标记:
kubectl uncordon <node - name>
(取消节点的不可调度标记,使节点重新可用于接收新的 Pod 调度)

四、Pod

Pod 是 K8s 中最小的可部署和可管理的计算单元,它可以包含一个或多个紧密相关的容器。这些容器共享相同的网络命名空间、存储卷和其他资源。

4.1 创建pod

1、通过 容器镜像创建pod,如下:

bash 复制代码
kubectl run nginx-test --image=nginx:1.14.2

2、一般是通过yaml资源文件创建,如下:

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14.2
    ports:
    - containerPort: 80

4.2 其他操作命令

bash 复制代码
查看 Pod 详细信息:
kubectl describe pod xxx-pod

进入 Pod 内的容器:
kubectl exec -it xxx-pod -c nginx-container -- /bin/bash
(如果 Pod 里只有一个容器,那么可以省略 -c 参数)

删除pod:
kubectl delete pod xxx-pod

4.3 pod挂载存储卷:

1. EmptyDir 存储卷

EmptyDir 是一种临时存储卷,生命周期与 Pod 相同。当 Pod 被删除时,EmptyDir 中的数据也会被删除。常用于容器间共享数据。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-with-empty-dir
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    volumeMounts:
    - name: empty-dir-volume
      mountPath: /data
  volumes:
  - name: empty-dir-volume
    emptyDir: {}    
2. HostPath 存储卷

HostPath 存储卷允许将宿主机上的目录或文件挂载到 Pod 中,通过volumeMounts 的name 跟 volumes 对应name对应路径的挂载映射,可以挂载多个目录,如下:

bash 复制代码
metadata:
  name: ac-xxx
  labels: 
    app: ac-xxx
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: xxx-pod
  template:
    metadata:
      labels:
        apps: xxx-pod
    spec:
      nodeName: k8s-master # 指定pod在该节点运行
      volumes:  # 映射Pod对外的挂载
      - name: logfile # Pod要挂载的名称指代,即指向volumeMounts的name
        hostPath: # 采用主机目录的挂载方式
          path: /log/
          type: DirectoryOrCreate #没有的话,会自动创建目录
      - name: datafile # Pod要挂载的名称指代,即指向volumeMounts的name
        hostPath: # 采用主机目录的挂载方式
          path: /data/xxx/
          type: DirectoryOrCreate #没有的话,会自动创建目录
      containers:
      - name: etcd
        image: etcd:v2.2.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          protocol: TCP
          containerPort: 4001
        volumeMounts: # Pod的数据卷挂载
        - name: logfile
          mountPath: /log # Pod的内部要挂载出去的目录
        - name: datafile
          mountPath: /data/xxx/ # Pod的内部要挂载出去的目录
      restartPolicy: Always # 可选 ,默认Always:无论如何停止,都会自动重启pod容器;OnFailure:容器以不为0的状态码终止(非正常停止),就自动重启pod容器;Never:无论何种状态,都不重启;
       # nodeSelector: # 可选,指定节点,符合标签的,部署在指定节点
---

eplicas: 1 制定当前pod的副本数

nodeName: k8s-master # 指定pod在该节点运行

3. PersistentVolumeClaim (PVC) 存储卷

PVC 是一种请求存储资源的抽象,它允许用户使用存储而无需关心底层存储的具体实现;

3.1、首先,需要创建一个 PersistentVolumeClaim,如下:

bash 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce  # 表示该 PVC 可以被一个节点以读写模式挂载
  resources:
    requests:
      storage: 5Gi            # 5Gi 说明这个 PVC 请求 5GB 的存储空间
  storageClassName: standard  # standard 代表使用名为 standard 的存储类

3.2、 然后创建对应的StorageClass:

需要有对应StorageClass 资源名为 standard 存在于集群中,否则 PVC 可能无法正常绑定到合适的 PV(PersistentVolume):

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2 # 可选类型:gp2, io1, sc1, st1
  fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true    
  • provisioner: kubernetes.io/aws-ebs:表示使用 AWS EBS 作为存储供应程序。
  • parameters.type: gp2:指定使用 AWS EBS 的通用型 SSD 卷(gp2)。
  • reclaimPolicy: Retain:设置当 PVC 被删除时,PV 不会被自动删除,而是保留其数据和状态。
  • allowVolumeExpansion: true:允许在 PVC 上进行存储容量扩展。

3.3、 最后,在 Pod 中使用这个 PVC

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-with-pvc
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    volumeMounts:
    - name: pvc-volume
      mountPath: /data
  volumes:
  - name: pvc-volume
    persistentVolumeClaim:
      claimName: my-pvc    

4.4 PVC相关操作:

使用 kubectl get pvc 命令来查看 PVC 的状态:

kubectl get pvc my-pvc

结果可能如下:

bash 复制代码
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc    Bound    pvc-8f9d6d4b-2c3e-4d5f-8a7b-9c0d1e2f3g4h   5Gi        RWO            standard       1m
  • STATUSBound 表示该 PVC 已经成功绑定到一个 PV(PersistentVolume)上。
  • VOLUME:显示绑定的 PV 的名称。
  • CAPACITY:显示 PVC 实际获得的存储容量。
  • ACCESS MODES:显示 PVC 的访问模式。
  • STORAGECLASS:显示使用的存储类名称。

4.5 PV相关操作:

PV(PersistentVolume)是集群层面的存储资源,PV 的常见操作,包括创建、查看、绑定、删除:

查看 PV 详细信息

bash 复制代码
kubectl describe pv xxxx-pv

结果如下:

bash 复制代码
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-001          10Gi       RWO            Retain           Bound       default/my-pvc-001      standard                3d
pv-002          20Gi       RWX            Delete           Available                           standard                2d

CAPACITY

  • 含义 :表示 PV 提供的存储容量大小。通常以字节(B)、千字节(KB)、兆字节(MB)、吉字节(GB)等单位表示。例如,pv-001 的容量为 10Gi,即 10GB。

STATUS

  • 含义 :显示 PV 的当前状态,常见的状态有:
    • Available:表示该 PV 尚未被任何 PVC 绑定,可供使用。
    • Bound:表示该 PV 已经与一个 PVC 成功绑定。
    • Released:表示与该 PV 绑定的 PVC 已被删除,但 PV 还未被回收,处于释放状态。
    • Failed:表示 PV 出现了错误,可能是由于存储系统故障等原因导致。

CLAIM

  • 含义 :显示与该 PV 绑定的 PVC 的信息,格式为 <命名空间>/<PVC 名称>。例如,default/my-pvc-001 表示在 default 命名空间下名为 my-pvc-001 的 PVC 与 pv-001 绑定。如果 PV 状态为 Available,则该字段为空。

4.6 StorageClass 使用:

(StorageClass)的名称。存储类是 k8s中的一种管理存储资源的关键对象,它为管理员提供了一 种动态配置和管理存储的方式。

**StorageClassName**作为存储类的名称,在 PV 和 PVC 之间起到了桥梁的作用。它使得 PV 和 PVC 可以根据存储类进行匹配和绑定,实现了存储资源的动态管理和分配。

(1)、查看 StorageClass

查看所有 StorageClass

bash 复制代码
kubectl get storageclasses 或 kubectl get sc

示例输出如下:

bash 复制代码
NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
standard (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   3d
gold                 kubernetes.io/aws-ebs   Retain          Immediate              false                  2d

查看特定 StorageClass 的详细信息

bash 复制代码
kubectl describe storageclass standard
(2)、删除特定 StorageClass
bash 复制代码
kubectl delete storageclass standard
(3)、创建 StorageClass

**1、**使用本地存储(以 HostPath 为例)

这种方式适用于测试环境,因为它依赖于特定的宿主机,在生产环境中使用需谨慎。

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer    
  • provisioner: kubernetes.io/no-provisioner:表示不使用自动存储供应程序,需要手动创建 PV。
  • volumeBindingMode: WaitForFirstConsumer:表示在有 Pod 请求使用该存储类的 PVC 时才进行 PV 绑定。

2、AWS EBS 存储类

如果你使用的是 AWS 云环境,需要确保你的 Kubernetes 集群已经正确配置了 AWS 云提供商。

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
  • provisioner: kubernetes.io/aws-ebs:表示使用 AWS EBS 作为存储供应程序。
  • allowVolumeExpansion: true:允许在 PVC 上进行存储容量扩展。

将上述内容保存为 standard-storageclass.yaml,然后执行以下命令创建:

bash 复制代码
kubectl apply -f standard-storageclass.yaml

当 PVC 被创建后,k8s会根据 PVC 请求的存储类(这里是 standard),调用 StorageClass 中指定的存储供应程序(如 kubernetes.io/aws-ebs)来动态创建一个符合要求的 PV,并将其绑定到该 PVC 上。

3、NFS 存储类

在使用 NFS 存储时,需要确保 NFS 服务器已经正确配置并可以被 Kubernetes 集群访问:

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storageclass
provisioner: example.com/nfs
parameters:
  server: nfs-server.example.com
  path: /exports
reclaimPolicy: Retain
volumeBindingMode: Immediate

保存为 nfs-storageclass.yaml 后,执行以下命令创建:

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storageclass
provisioner: example.com/nfs
parameters:
  server: nfs-server.example.com
  path: /exports
reclaimPolicy: Retain
volumeBindingMode: Immediate

解析如下:

  • provisioner: example.com/nfs:表示使用自定义的 NFS 存储供应程序。
  • parameters.server: nfs-server.example.com:指定 NFS 服务器的地址。
  • parameters.path: /exports:指定 NFS 共享目录的路径。
  • reclaimPolicy: Delete:设置当 PVC 被删除时,PV 会被自动删除。
相关推荐
云上艺旅35 分钟前
K8S学习之基础五十八:部署nexus服务
学习·docker·云原生·容器·kubernetes
老马啸西风39 分钟前
Neo4j GDS-06-neo4j GDS 库中社区检测算法介绍
网络·算法·云原生·中间件·neo4j
mask哥1 小时前
一文详解k8s体系架构知识
java·spring boot·docker·微服务·云原生·架构·kubernetes
demonlg01121 小时前
Go 语言标准库中log模块详细功能介绍与示例
开发语言·后端·云原生·golang
demonlg01122 小时前
Go 语言标准库中strings和strconv详细功能介绍与示例
开发语言·后端·云原生·golang
寒冰碧海3 小时前
JDK 17 + Spring Boot 3 全栈升级实战指南--从语法革新到云原生,解锁企业级开发新范式
java·spring boot·云原生
程序猿chen4 小时前
第二重·纵横篇:Kubernetes御剑术与云原生护体罡气
java·git·后端·程序人生·云原生·容器·kubernetes
云上艺旅4 小时前
K8S学习之基础六十一:k8s中部署helm
学习·云原生·容器·kubernetes
Ares-Wang4 小时前
Kubernetes》》k8s》》Replication Controller
kubernetes
Raymond运维6 小时前
Linux系统修改网卡名为eth0、eth1
linux·运维·云原生