pod 入门

pod 入门

入门级的放通网络

我们使用 nginx 创建的pod,必须要能本地访问它才行,在不引入复杂的网络环境的前提下,我们可以通过映射端口或者映射本机网络的方式进行访问。

apiVersion: v1
kind: Pod
metadata:
  name: web01
  labels:
    app: nginx
    version: "1.24"
  namespace: learn
spec:
  containers:
    - name: ng-host
      image: docker.io/library/nginx:1.24
      imagePullPolicy: IfNotPresent
  restartPolicy: Always
  hostNetwork: true # 使用宿主机网络

---
apiVersion: v1
kind: Pod
metadata:
  name: web02
  labels:
    app: nginx
    version: "1.24"
  namespace: learn
spec:
  containers:
    - name: ng-port
      image: docker.io/library/nginx:1.24
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          hostPort: 8080  # 映射主机端口
  restartPolicy: Always

加载的时候,发现 version 定义浮点数它报错,做成字符串就可以了

  • 加载部署,然后查看网络地址,访问测试

web01 这个pod已经直接映射为物理网络的地址,使用 node01 节点的网络;web02 也被分发到了 node01 节点,但是端口映射的是 8080


通过以上,其实已经学会了 pod 的基础使用了,也就是创建配置,拉起服务,测试访问


Labels 标签,k8s 管理的锚

k8s 的 logo 像是一个舵,掌握航行方向,我说 label 是它的锚,是因为绝大多数操作的关联项都是基于 label 进行的。

举个例子:

# 查看标签
kubectl get po -n learn --show-labels
# 根据标签进行删除,同理,能根据标签删除,也就能根据标签升级或其他操作
kubectl delete -l "version=1.24" -n learn
  • 标签使用时,只输入键,是模糊操作,有该键的都会被操作到

  • 键值对时,精确操作

  • 常用的标签键值对

    app:
    role: master、node、replica、salve
    env: dev、test、qa、prod
    release: stable、test、mainline
    tier: fronted、backend、cache
    partition: areaA、areaB
    
  • 手动创建标签

    # 创建节点标签,该标签可用于 nodeSelector 调用
    kubectl label nodes node02 os=rocky9
    # 创建pod标签
    kubectl label pod web03 version=1.24 -n learn
    
  • 删除标签

    # 指定键值即可
    kubectl label pod web03 version- -n learn
    
  • 与之类似的,打污点,污点针对 node

    # 污点标签:污点策略
    kubectl taint node node02 node-type=dev:PreferNoSchedule
    

pod 基础存储

apiVersion: v1
kind: Pod
metadata:
  name: web04
  labels:
    app: nginx
  namespace: learn
spec:
  volumes:
    - name: vol-empty   # emptyDir 存储定义
      emptyDir:
        {}
    - name: vol-local   # localPath 存储定义
      hostPath:
        path: /data/vol
  containers:
    - name: ssd-empty   # 创建一个容器,调用 emptyDir
      image: nginx:1.24
      imagePullPolicy: IfNotPresent
      volumeMounts:       # 挂载,声明挂载路径和名称
        - mountPath: /usr/share/nginx/html
          name: vol-empty
    - name: ssd-local     # 创建调用 hostPath 的容器
      image: alpine:3.18
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: vol-local
      command: # 给个命令,hang 住后台,不然启动容器就结束了,run不起来
        - ping
        - loclhost
  restartPolicy: Always
  

pod 节点选择

节点选择的方式,一种是直接指定分发的节点,一种是根据节点标签进行分发。根据节点标签进行分发,需要节点有各自的标签信息。

  • 为 node 创建标签

    # 查看节点标签信息
    kubectl get nodes --show-labels
    # 给 node02 打标签
    kubectl label nodes node02 os=rocky9
    # 删除标签,指定key即可
    kubectl label nodes node02 os-
    
  • 加载配置

    apiVersion: v1
    kind: Pod
    metadata:
      name: web05
      labels:
        app: nginx
      namespace: learn
    spec:
      nodeName: node01      # 指定调度到 node01
      containers:
        - name: node-name
          image: nginx:1.24
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: web06
      labels:
        app: nginx
      namespace: learn
    spec:
      nodeSelector:       # 标签选择,应该会调度到node02
        os: rocky9
      containers:
        - name: node-name
          image: nginx:1.24
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
    
    
    
  • 查看结果

    kubectl get po -n learn -owide
    

pod 的污点容忍和亲和性

当前没学各种控制器,pod 随机调度,我们先为 node02 打上污点,创建一个容忍该污点的 pod。pod 优先分发到没有污点的节点,所以,我们需要给做个节点的亲和性,让pod更亲和node02

  • 为 node02 创建污点

    kubectl taint node node02 env=test:NoSchedule
    
  • 创建并加载配置

    apiVersion: v1
    kind: Pod
    metadata:
      name: web07
      labels:
        app: nginx
      namespace: learn
    spec:
      containers:
        - name: web-affinity
          image: nginx:1.24
          imagePullPolicy: IfNotPresent
      # 配置容忍度,节点已创建污点
      tolerations:
        - key: env
          operator: Exists
          effect: NoSchedule
      # 亲和性
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: os
                    operator: In
                    values:
                      - rocky9
      restartPolicy: Always
    
  • 查看结果,pod 被调度到node02,符合预期

    kubectl get po -n learn -owide
    


pod 配置详细说明

根据 kubectl explain pod​ 逐级筛选

# 协议版本
apiVersion: v1
# 资源类型,资源不同,协议可能不同
kind: Pod
# 元数据
metadata:
  # pod 名称
  name: nginx
  # 标签
  labels:
    app: nginx
  # 名称空间
  namespace: learn
  # 自定义注释
  annotations:
    - name: "string"
# 容器的详细配置
spec:
  # 容器列表
  containers:
    # 容器名称
    - name: nginx
      # 镜像路径及名称
      image: nginx:1.24
      # 镜像拉取策略,IfNotPresent 本地不存在,拉取远程;Never 从不拉取远程;Always 总是拉取远程
      imagePullPolicy: IfNotPresent
      # 执行命令
      command: ["/bin/bash"]
      # 命令参数拼接
      args: ["-c","while true;do echo hello;sleep 1;done"]
      # 指定容器工作目录
      workingDir: /usr/share/nginx/html
      # 挂载存储,在外层先定义,后面高一层级这个
      volumeMounts:
        # 容器内挂载的绝对路径
        - mountPath: /usr/share/nginx/html
          # 上层定义个存储名称
          name: vol-name

      # 还可以配置环境变量、端口、资源限制等

      # 生命周期配置
      lifecycle:
        # 主容器启动前
        postStart:
          exec:
            command:
              - "sh"
              - "-c"
              - "echo \"postStart at $(date +%F_%T)\" >> /poststart.log "
        # 主容器删除前
        preStop:
          exec:
            command:
              - "sh"
              - "-c"
              - "echo \"preStop at $(date +%F_%T)\" >> /preStop.log "
      # 存活检查
      livenessProbe:
        exec:
          command:
            - cat
            - /etc/host
        # 启动完成后多少时间进行检查
        initialDelaySeconds: 10
        # 检查等待超时
        timeoutSeconds: 10
        # 定期检查
        periodSeconds: 5
        # 连续成功次数,默认为1,最少1次
        successThreshold: 3
        # 连续失败次数
        failureThreshold: 3
        # 宽限期,默认30s
        terminationGracePeriodSeconds: 30
      # 就绪检查
      readinessProbe:
        tcpSocket:
          port: 80
      # 启动检查
      startupProbe:
        httpGet:
          port: 80



  # 定义存储
  volumes:
    # 存储名称,调用时使用这个名称
    - name: vol-name
      # 调用nfs资源
      nfs:
        # nfs 共享路径
        path: /data/vol
        # nfs 服务地址,域名、主机、IP
        server: nfs.server.com
    - name: vol2
      # 定义一个空目录,临时文件,删除pod,数据丢失
      emptyDir:
        {}
    - name: vol3
      # 挂载主机本地存储
      hostPath:
        path: /data/vol

  # -----------------------------------------
    # 节点调度,nodeName 和 nodeSelector 二选一
  # 指定节点的调度,与其他调度方式互斥,优先级更高
  #nodeName: node01

  # 根据【节点】标签调度
  #nodeSelector:
    # 节点有对应标签
    #cpu: high
  # -----------------------------------------

  # 容忍度
  tolerations:
    # 污点 key
    - key: node-type
      # 操作符 Exists 包含,可忽略值;Equal 键值对相等,要同时配置键值;
      operator: Exists
      # 调度策略 NoExecute 驱逐,NoSchedule 不调度,存在继续;PreferNoSchedule 减少调度
      effect: PreferNoSchedule
  # 亲和性
  affinity:
    # 节点亲和性 nodeAffinity;pod亲和性 podAffinity;反亲和性 podAntiAffinity
    nodeAffinity:
      # 精确匹配,硬亲和性
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          # 匹配表达式
          - matchExpressions:
              - key: cpu
                # in / notin 键值对存在或不存在;exists / noexists 键存在或不存在;Gt / Lt 大于或小于
                operator: In
                values:
                  - high
                  - low
              - key: app
                operator: Exists

      # 模糊匹配,软亲和性
      preferredDuringSchedulingIgnoredDuringExecution:
        - preference:
            matchExpressions:
              - key: cpu
                operator: In
                values:
                  - high
          weight: 1


  # 容器重启策略 Always 总是重启;OnFailure 非正常退出;Never 不重启
  restartPolicy: Always

posted @ 2024-03-29 10:54  虫祇  阅读(10)  评论(0编辑  收藏  举报