当前位置: 首页 > article >正文

【k8s应用管理】kubernetes pod资源控制管理(一)

文章目录

  • Pod 基础
    • Pod 的组成
    • Pod 的特性
    • Pod 容器的镜像拉取策略
    • Pod 容器的重启策略
      • 示例
    • 静态 Pod 管理指南
      • 查看当前 kubelet 配置
      • 修改 kubelet 配置以添加静态 Pod
        • 1. 找到 kubelet 的启动配置文件
        • 编辑 kubelet 的环境变量配置
        • 重新加载 systemd 配置并重启 kubelet
      • 创建静态 Pod 配置文件
      • 验证静态 Pod 的状态
      • 静态 Pod 的删除
        • 无法通过 `kubectl delete` 删除静态 Pod
        • 删除静态 Pod 的方法
        • 验证 Pod 是否已删除
    • 使用私有镜像创建 Pod 示例
      • 编辑现有的 Deployment 配置
      • 创建测试 Pod 并观察其行为
    • 部署 harbor 创建私有项目
      • 部署 Harbor
        • 在 Docker Harbor 节点上操作
      • 配置 Kubernetes 节点以连接私有仓库
      • 推送镜像到 Harbor
      • 在 Kubernetes 中使用 Harbor 镜像

Pod 基础

Pod 是 Kubernetes 中能够创建和管理的最小单位。Kubernetes 直接管理的是 Pod,而不是容器。

Pod 的组成

  1. Pause 容器(基础容器、父容器、根容器)

    • 作用
      1. 作为 Linux 命名空间共享的基础,为 Pod 内的其他容器提供网络、存储等资源的共享。
      2. 作为 PID=1 的 init 进程,管理整个 Pod 容器组的生命周期。
    • 特性
      • Pod 中第一个启动的容器。
      • 为其他容器提供共享的环境。
  2. 应用容器(业务容器、用户容器、Main Container)

    • 作用
      1. 运行应用程序。
      2. 作为边车容器(Sidecar),为主应用容器提供紧密相关的业务功能支持。
    • 特性
      • 在 Pause 容器之后启动。
      • 如果 Pod 中有多个应用容器,它们会并行启动。
  3. Init 容器(初始化容器)

    • 作用
      1. 在应用容器启动前,基于共享存储卷为应用容器提供依赖环境或工具包。
      2. 可以阻塞或延迟应用容器的启动。
    • 特性
      • 在 Pause 容器之后启动。
      • 如果 Pod 中有多个 Init 容器,它们会串行启动(一个完成后才会启动下一个)。

Pod 的特性

  1. 共享资源

    • 同一个 Pod 中的容器运行在同一个 Node 节点上。
    • 容器之间通过 localhost 互相通信,共享同一个 IP 和端口范围。
    • 共享同一个存储卷(Volume),实现容器间的数据共享。
  2. Pod 的 3 种类型

    • 自主式 Pod

      • 由 Scheduler 调度到 Node 节点部署。
      • 不被控制器管理,没有自愈能力(Pod 挂了不会被重建)。
      • 没有副本管理能力,不支持滚动更新。
      • 配置信息存储在 etcd 中。
      • 创建命令kubectl run ...
    • 控制器管理的 Pod

      • 由 Scheduler 调度到 Node 节点部署。
      • 被控制器(如 Deployment、StatefulSet)管理。
      • 具有自愈能力(Pod 挂了会被重建)。
      • 支持副本管理和滚动更新。
      • 配置信息存储在 etcd 中。
      • 创建命令kubectl create deployment ...
    • 静态 Pod

      • 不由 Scheduler 调度,也不通过 API Server 创建。
      • 由 Kubelet 自行创建和管理。
      • 配置信息存储在 Node 节点的 /etc/kubernetes/manifests/ 目录中。
      • Kubelet 会自动根据该目录中的 YAML 文件创建静态 Pod。
      • 删除 YAML 文件后,Kubelet 会自动删除静态 Pod。

Pod 容器的镜像拉取策略

通过 imagePullPolicy 字段定义:

  1. IfNotPresent

    • 优先使用 Node 节点本地已存在的镜像。
    • 如果本地没有,则从仓库拉取镜像。
    • 默认策略:适用于标签为非 latest 的镜像。
  2. Always

    • 总是从仓库拉取镜像,无论本地是否已存在。
    • 默认策略:适用于标签为 latest 或无标签的镜像。
  3. Never

    • 仅使用 Node 节点本地的镜像,总是不从仓库拉取镜像。

Pod 容器的重启策略

通过 restartPolicy 字段定义:

  1. Always

    • 当容器退出时,总是重启容器(无论退出状态码如何)。
    • 默认策略:适用于 Deployment、StatefulSet、DaemonSet 等控制器管理的 Pod。
  2. OnFailure

    • 仅当容器异常退出时(退出状态码为非 0),重启容器。
    • 正常退出的容器(退出状态码为 0)不会重启。
  3. Never

    • 当容器退出时,总是不重启容器(无论退出状态码如何)。

注:deployment、statefulset、daemonset 控制器的Pod容器重启策略只能设置为 Always

示例

# pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30; exit 3  # 命令让容器睡眠30秒后退出,退出状态码为3
  # 默认情况下,如果不指定restartPolicy,Pod的重启策略为Always(仅适用于单独的Pod定义,不适用于由控制器管理的Pod)
  # 但在这里我们稍后会显式设置restartPolicy为Never来演示其效果

# 应用YAML文件创建Pod
# kubectl apply -f pod3.yaml

# 查看Pod状态,初始时Pod应该是Running状态
# 等容器启动后30秒执行exit退出进程,Pod会进入Error状态(如果restartPolicy为Always,则Pod会重启;如果为Never,则不会重启)
# kubectl get pods
# NAME    READY   STATUS             RESTARTS   AGE
# foo     1/1     Running            1          (时间)  # 这里的RESTARTS可能会根据restartPolicy的值而变化

# 删除Pod
# kubectl delete -f pod3.yaml

# 修改YAML文件,设置restartPolicy为Never
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30; exit 3  # 命令保持不变
  restartPolicy: Never  # 显式设置Pod的重启策略为Never

# 再次应用YAML文件创建Pod
# kubectl apply -f pod3.yaml

# 使用-w选项实时观察Pod的状态变化
# 当容器睡眠30秒后退出,由于restartPolicy设置为Never,Pod将保持在Error状态而不会重启
# kubectl get pods -w
# NAME    READY   STATUS    RESTARTS   AGE
# foo     1/1     Running   0          (时间)  # 初始状态
# foo     0/1     Error     0          (稍后的时间)  # 容器退出后,Pod进入Error状态且RESTARTS保持为0(因为restartPolicy为Never)

静态 Pod 管理指南

静态 Pod 是由 kubelet 直接管理的一类特殊 Pod,它们不通过常规的 API Server 进行控制。
静态 Pod 的配置文件存放在特定的目录(一般为:/etc/kubernetes/manifests/),kubelet 会周期性地扫描该目录,根据其中的配置文件自动创建、更新或删除 Pod。

查看当前 kubelet 配置

首先,确认 kubelet 当前配置的静态 Pod 路径:

cat /var/lib/kubelet/config.yaml | grep staticPodPath

示例:

staticPodPath: /etc/kubernetes/manifests

修改 kubelet 配置以添加静态 Pod

1. 找到 kubelet 的启动配置文件

通常,kubelet 的启动配置文件位于 /usr/lib/systemd/system/kubelet.service.d/ 目录下,常见文件为 10-kubeadm.conf

systemctl status kubelet

示例输出片段:

● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
编辑 kubelet 的环境变量配置

使用 vim 或其他文本编辑器打开 10-kubeadm.conf 文件,添加或修改 --pod-manifest-path 参数:

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

示例配置:

[Service]
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allowprivileged=true"

注意: 如果该行已存在,确保 --pod-manifest-path 指向正确的目录(通常是 /etc/kubernetes/manifests)。

重新加载 systemd 配置并重启 kubelet
systemctl daemon-reload
systemctl restart kubelet

创建静态 Pod 配置文件

在静态 Pod 的管理目录下准备 Pod 的 YAML 文件。例如,创建一个简单的 Nginx Web 服务器 Pod:

vim /etc/kubernetes/manifests/static-web.yaml

示例内容:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    app: static
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80

验证静态 Pod 的状态

kubelet 会自动检测到 /etc/kubernetes/manifests/ 目录下的新配置文件,并根据该文件创建相应的 Pod。
查看 Pod 状态:

kubectl get pods -A | grep static-web

示例输出:

kube-system   static-web   1/1     Running   0          1m

静态 Pod 的删除

无法通过 kubectl delete 删除静态 Pod

静态 Pod 由 kubelet 直接管理,而不是通过 API Server。因此,使用 kubectl delete pod 命令无法删除静态 Pod。尝试删除时,可能会发生:

kubectl delete pod static-web -n kube-system

示例:

error: pods "static-web" not found
删除静态 Pod 的方法

删除静态 Pod,直接删除其配置文件即可

rm /etc/kubernetes/manifests/static-web.yaml

随后,kubelet 会检测到配置文件的删除,并自动停止并删除相应的 Pod。

验证 Pod 是否已删除
kubectl get pods -A | grep static-web

注意

  • 权限:确保 kubelet 对 /etc/kubernetes/manifests/ 目录及其文件具有适当的读写权限。
  • 配置文件格式:静态 Pod 的 YAML 配置文件必须符合 Kubernetes 的 Pod 规范,否则 kubelet 可能无法正确解析和创建 Pod。
  • 高可用:在多节点集群中,静态 Pod 仅在配置了 --pod-manifest-path 的节点上运行。因此,确保关键服务的静态 Pod 配置在多个节点上,以实现高可用性。

使用私有镜像创建 Pod 示例

官方示例:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: private-image-test-1
spec:
  containers:
    - name: uses-private-image
      image: $PRIVATE_IMAGE_NAME
      imagePullPolicy: Always
      command: [ "echo", "SUCCESS" ]
EOF
  • 关键配置:
    • image: 指定私有镜像名称
    • imagePullPolicy: 设置为 Always,表示每次启动容器时都尝试拉取最新镜像
    • command: 容器启动时执行的命令,此处为 echo SUCCESS

编辑现有的 Deployment 配置

步骤:

kubectl edit deployment/nginx-deployment
  • 关键配置:
    • imagePullPolicy: 设为 IfNotPresent,表示仅在本地不存在镜像时才拉取。
    • restartPolicy: 设为 Always,确保容器异常退出后自动重启。

创建测试 Pod 并观察其行为

步骤:

  1. 创建 Pod 配置文件 pod1.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-test1
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: Always
          command: [ "echo", "SUCCESS" ]
    
  2. 应用配置并查看 Pod 状态:

    kubectl create -f pod1.yaml
    kubectl get pods -o wide
    
    • Pod 处于 CrashLoopBackOff 状态:容器执行完 echo SUCCESS 后退出,导致容器生命周期结束。
  3. 查看 Pod 事件详情:

    kubectl describe pod pod-test1
    
    • 容器被多次重启,但由于任务已完成,容器不断重启尝试执行命令。
  4. 修改 Pod 配置以保持容器运行:

    • 编辑 pod1.yaml,移除 command 并指定具体的镜像版本:
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-test1
      spec:
        containers:
          - name: nginx
            image: nginx:1.14
            imagePullPolicy: Always
      
    • 应用修改:
      kubectl delete -f pod1.yaml 
      kubectl apply -f pod1.yaml 
      
    • 验证状态:
      kubectl get pods -o wide
      
      • Pod 状态变为 Running,表示容器正常。
  5. 测试容器服务:

    • 使用 curl 访问容器服务:
      curl -I http://172.17.36.4
      
    • 示例:
      HTTP/1.1 200 OK
      Server: nginx/1.14.2
      ...
      
    • 成功访问到 Nginx 服务,确认容器正常运行并提供服务。

部署 harbor 创建私有项目

部署 Harbor

在 Docker Harbor 节点上操作
  1. 关闭防火墙并设置 SELinux
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    setenforce 0
    
  2. 安装 Docker
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install -y docker-ce
    systemctl start docker.service
    systemctl enable docker.service
    docker version
    
  3. 上传并安装 docker-compose 和 Harbor
    cd /opt
    chmod +x docker-compose
    mv docker-compose /usr/local/bin/
    tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
    vim /usr/local/harbor/harbor.cfg
    # 修改 hostname 为 Harbor 服务器的 IP 地址或域名
    cd /usr/local/harbor/
    ./install.sh
    
  4. 访问 Harbor WEB UI 并创建项目
    • 在浏览器中访问 http://<Harbor_IP>(例如 http://192.168.80.30),使用默认的管理员用户名和密码(admin/Harbor12345)登录。
    • 创建一个新项目,例如名为 kgc-project

配置 Kubernetes 节点以连接私有仓库

  1. 在每个 Kubernetes 节点上配置 Docker
    cat > /etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://<mirror_url>"],
      "insecure-registries":["192.168.80.30"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    
  2. 登录 Harbor 私有仓库
    docker login -u admin -p Harbor12345 http://192.168.80.30
    

推送镜像到 Harbor

  1. 下载并标记镜像
    docker pull tomcat:8.0.52
    docker tag tomcat:8.0.52 192.168.80.30/kgc-project/tomcat:v1
    docker push 192.168.80.30/kgc-project/tomcat:v1
    
  2. (可选)删除本地镜像以测试拉取
    docker rmi tomcat:8.0.52
    docker rmi 192.168.80.30/kgc-project/tomcat:v1
    

在 Kubernetes 中使用 Harbor 镜像

  1. 创建 Kubernetes Secret
    vim harbor-pull-secret.yaml
    # 复制粘贴之前查看的登录凭据(base64 编码)
    kubectl create -f harbor-pull-secret.yaml
    
  2. 创建 Deployment 和 Service
    cd /opt/demo
    vim tomcat-deployment.yaml
    # 定义 Deployment 和 Service,指定 imagePullSecrets
    kubectl create -f tomcat-deployment.yaml
    
  3. 验证
    • 使用 kubectl get pods 查看 Pod 状态。
    • 使用 kubectl describe pod <pod_name> 查看 Pod 描述信息,确认镜像是从 Harbor 下载的。
    • 刷新 Harbor 页面,查看镜像的下载次数是否增加。

http://www.kler.cn/a/539974.html

相关文章:

  • 【Git】ssh如何配置gitlab+github
  • 一文学会:用DeepSeek R1/V3 + AnythingLLM + Ollama 打造本地化部署的个人/企业知识库,无须担心数据上传云端的泄露问题
  • PHP 运算符
  • 手动配置IP
  • 代码随想录day09
  • 单例模式几种实现
  • MATLAB使用技巧之局部放大图的制作(二)
  • 通过Demo案例的形式弄懂Java中的设计模式
  • JMeter通过BeanShell如何对CSV文件的指定列追加数据
  • 智能理解 PPT 内容,快速生成讲解视频
  • 排错 -- 用React.js,Solidity,智能合约构建最新区块链应用
  • Pixel3XL 编译源码刷机教程
  • undetected-chromedriver 使用教程,指定浏览器驱动和浏览器版本
  • 运行npm install卡住不动的
  • 22.2、Apache安全分析与增强
  • 【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现
  • 深度学习 语音合成
  • Java并发编程笔记
  • C++使用Json保存配置参数
  • 【计算机网络基础】ACL
  • 【Redis keys命令有什么问题?】
  • Android内存性能优化量化指标
  • 深度卷积神经网络实战海洋动物图像识别
  • 网络基础知识与配置
  • 《ARM64体系结构编程与实践》学习笔记(三)
  • 7 使用 Pydantic 验证 FastAPI 的请求数据