k8s pod 文件权限不足

两套集群,同样的云平台,操作系统版本,k8s版本,docker版本,k8s镜像,配置。集群甲顺利部署,集群乙部署后,网络组件异常,容器内文件操作权限不足导致异常退出。目前排查到差别就是集群乙已经创建了业务用户(uid1000),这个会有影响吗?

单独docker run那个镜像,在里面操作文件内问题,应该是k8s这边。怀疑selinux,但也关了。

集群甲组件情况

[root@kfzx-yyfwq01 ~]# uname -a
Linux kfzx-yyfwq01 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@kfzx-yyfwq01 ~]# kubectl get pod -A
NAMESPACE      NAME                                               READY STATUS      RESTARTS    AGE IP               NODE
default        rocketmq-operator-6f54dbb5d8-xbmmn                 0/1   CrashLoopBackOff 185         16h 10.244.41.135    worker1
ingress-controller ingress-nginx-admission-create-tfdwt           0/1   Completed   0           20h 10.244.61.2      worker2
ingress-controller ingress-nginx-admission-patch-gxfm4            0/1   Completed   2           20h 10.244.61.1      worker2
ingress-controller ingress-nginx-controller-dz4sb                 0/1   CrashLoopBackOff 138         11h 192.168.9.47     worker3
ingress-controller ingress-nginx-controller-nnsrv                 0/1   CrashLoopBackOff 138         11h 192.168.9.45     worker1
ingress-controller ingress-nginx-controller-pzhzg                 0/1   CrashLoopBackOff 138         11h 192.168.9.46     worker2
kube-system    calico-kube-controllers-6ff5c664c4-5jk68           0/1   CrashLoopBackOff 219         13h 10.244.61.7      worker2
kube-system    calico-node-8qbps                                  1/1   Running     0           20h 192.168.9.45     worker1
kube-system    calico-node-bwwhn                                  1/1   Running     3           20h 192.168.9.46     worker2
kube-system    calico-node-xr285                                  1/1   Running     3           20h 192.168.9.47     worker3
kube-system    calico-typha-6576ff658-5wtqq                       1/1   Running     1           20h 192.168.9.46     worker2
kube-system    calico-typha-6576ff658-626vr                       1/1   Running     1           20h 192.168.9.47     worker3
kube-system    calicoctl-hdfp2                                    1/1   Running     1           20h 192.168.9.46     worker2
kube-system    calicoctl-l9wk5                                    1/1   Running     0           20h 192.168.9.45     worker1
kube-system    calicoctl-m75qj                                    1/1   Running     1           20h 192.168.9.47     worker3
[root@kfzx-yyfwq01 ~]# kdesc ingress-nginx-controller|grep Image
    Image:         registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller:v0.47.0
    Image ID:      docker-pullable://registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller@sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
[root@kfzx-yyfwq01 ~]# kdesc calico-kube-controllers|grep Image
    Image:          registry.aliyuncs.com/kubeadm-ha/calico_kube-controllers:v3.19.1
    Image ID:       docker-pullable://registry.aliyuncs.com/kubeadm-ha/calico_kube-controllers@sha256:904458fe1bd56f995ef76e2c4d9a6831c506cc80f79e8fc0182dc059b1db25a4

集群乙组件情况

[root@ytzn-saas06 ~]# uname -a
Linux ytzn-saas06 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

# kubectl get pod -A
ingress-controller ingress-nginx-controller-4k7kq                1/1   Running     0          105d 192.168.9.73     worker1
ingress-controller ingress-nginx-controller-cz6jv                1/1   Running     0        105d 192.168.9.75     worker3
ingress-controller ingress-nginx-controller-pzgb4                1/1   Running     0          105d 192.168.9.74     worker2
kube-system    calico-kube-controllers-6d75fbc96d-cgq4g           1/1   Running     6          105d 10.244.52.10     master2
kube-system    calico-node-2nllh                                  1/1   Running     0          105d 192.168.9.73     worker1
kube-system    calico-node-8jr77                                  1/1   Running     1          105d 192.168.9.70     master1
kube-system    calico-node-hqb6b                                  1/1   Running     21         105d 192.168.9.75     worker3
kube-system    calico-node-kcg44                                  1/1   Running     0          105d 192.168.9.71     master2
kube-system    calico-node-nlnmd                                  1/1   Running     0          105d 192.168.9.72     master3
kube-system    calico-node-thzw2                                  1/1   Running     0          105d 192.168.9.74     worker2
kube-system    calico-typha-6576ff658-8jr9n                       1/1   Running     0           33d 192.168.9.75     worker3
kube-system    calico-typha-6576ff658-d5h8z                       1/1   Running     0          105d 192.168.9.74     worker2
kube-system    calicoctl-8jzgt                                    1/1   Running     1          105d 192.168.9.70     master1
kube-system    calicoctl-hqp24                                    1/1   Running     0          105d 192.168.9.73     worker1

[root@ytzn-saas06 ~]# kdesc ingress-nginx-controller-4k7kq|grep Image
    Image:         registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller:v0.47.0
    Image ID:      docker-pullable://registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller@sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
[root@ytzn-saas06 ~]# kdesc calico-kube-controllers|grep Image
    Image:          registry.aliyuncs.com/kubeadm-ha/calico_kube-controllers:v3.19.1
    Image ID:       docker-pullable://registry.aliyuncs.com/kubeadm-ha/calico_kube-controllers@sha256:904458fe1bd56f995ef76e2c4d9a6831c506cc80f79e8fc0182dc059b1db25a4

ingress-nginx-controller 日志

-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:       v0.47.0
  Build:         7201e37633485d1f14dbe9cd7b22dd380df00a07
  Repository:    https://github.com/kubernetes/ingress-nginx
  nginx version: nginx/1.20.1

-------------------------------------------------------------------------------

I0329 00:31:51.771283       7 flags.go:208] "Watching for Ingress" class="nginx"
W0329 00:31:51.771341       7 flags.go:213] Ingresses with an empty class will also be processed by this Ingress controller
W0329 00:31:51.771634       7 client_config.go:614] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I0329 00:31:51.771862       7 main.go:241] "Creating API client" host="https://10.244.64.1:443"
I0329 00:31:51.789762       7 main.go:285] "Running in Kubernetes cluster" major="1" minor="21" git="v1.21.5" state="clean" commit="aea7bbadd2fc0cd689de94a54e5b7b758869d691" platform="linux/amd64"
F0329 00:31:51.962345       7 ssl.go:389] unexpected error storing fake SSL Cert: could not create PEM certificate file /etc/ingress-controller/ssl/default-fake-certificate.pem: open /etc/ingress-controller/ssl/default-fake-certificate.pem: permission denied
goroutine 1 [running]:
k8s.io/klog/v2.stacks(0xc00000e001, 0xc0001b4200, 0x103, 0x1e1)
        k8s.io/klog/v2@v2.4.0/klog.go:1026 +0xb9

calico-kube-controllers 日志

2023-03-29 00:31:29.141 [INFO][1] main.go 92: Loaded configuration from environment config=&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyWorkers:1, NodeWorkers:1, Kubeconfig:"", DatastoreType:"kubernetes"}
W0329 00:31:29.142583       1 client_config.go:615] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
2023-03-29 00:31:29.143 [INFO][1] main.go 113: Ensuring Calico datastore is initialized
2023-03-29 00:31:29.157 [INFO][1] main.go 153: Getting initial config snapshot from datastore
2023-03-29 00:31:29.173 [INFO][1] main.go 156: Got initial config snapshot
2023-03-29 00:31:29.173 [INFO][1] watchersyncer.go 89: Start called
2023-03-29 00:31:29.173 [INFO][1] main.go 173: Starting status report routine
2023-03-29 00:31:29.173 [INFO][1] main.go 182: Starting Prometheus metrics server on port 9094
2023-03-29 00:31:29.173 [INFO][1] main.go 418: Starting controller ControllerType="Node"
2023-03-29 00:31:29.173 [INFO][1] node_controller.go 143: Starting Node controller
2023-03-29 00:31:29.173 [INFO][1] watchersyncer.go 127: Sending status update Status=wait-for-ready
2023-03-29 00:31:29.173 [ERROR][1] status.go 138: Failed to write readiness file: open /status/status.json: permission denied
2023-03-29 00:31:29.173 [WARNING][1] status.go 66: Failed to write status error=open /status/status.json: permission denied

日志都指向无法写入文件这个权限不足问题

解决方案

重装k8s集群后故障消失(注:从1.21.5改为1.21.14),原有不明

<think>我们正在讨论如何将Kubernetes Pod中的大文件下载到Jenkins Agent节点(可能是一个物理机、虚拟机或另一个Pod)上。根据用户提供的引用,特别是引用[3]中提到了Jenkins在Kubernetes中的运行方式,以及Pod模板的配置,我们可以设计几种方法。 注意:Jenkins Agent节点可能是Kubernetes集群中的一个Pod(动态生成的构建节点),也可能是集群外的一个节点(比如传统的Jenkins Agent节点)。我们的目标是将Pod中的大文件传输到运行Jenkins构建任务的Agent节点上。 方法分析: 1. **使用kubectl cp命令**:如果Jenkins Agent节点上安装了kubectl并且配置了访问Kubernetes集群的权限(kubeconfig),那么可以直接使用`kubectl cp`命令从Pod中复制文件到Agent节点。但这种方法对于大文件可能不够高效,且需要Agent节点有kubectl配置。 2. **在Pod内启动文件服务,然后由Agent节点下载**:在Pod内启动一个HTTP服务(例如Python的HTTP服务器)或者FTP服务,然后Jenkins Agent节点通过wget或curl等工具下载文件。这种方法支持断点续传,适合大文件。 3. **使用共享存储卷**:如果Pod和Agent节点都可以访问同一个持久化存储(比如NFS、CephFS、云存储等),那么可以将文件写入共享卷,然后Agent节点从共享卷中读取。这种方法传输效率高,但需要预先配置存储卷。 4. **通过Jenkins Agent的容器执行命令**:如果Jenkins Agent本身也是一个Pod(在Kubernetes中动态创建),那么我们可以利用Pod内的容器执行命令,将文件从目标Pod复制到Agent Pod,然后通过Jenkins的stash/unstep机制将文件保存并传递到后续步骤(但注意,如果Agent Pod被销毁,文件也会消失,所以需要及时下载到Jenkins Master或持久化存储)。 5. **使用rsync**:如果Pod内安装了rsync,并且Agent节点也能运行rsync,那么可以通过rsync进行高效的文件传输,特别是对于部分更新的文件。 考虑到大文件传输,我们优先考虑支持断点续传和高效传输的方法。 下面我们将详细介绍几种可行的方案: 方案一:使用HTTP服务临时下载(推荐) 步骤: 1. 在目标Pod中启动一个HTTP服务,暴露大文件所在的目录。 2. 获取目标Pod的IP地址(或者通过Service暴露,但临时使用可以直接用Pod IP)。 3. 在Jenkins Agent节点上使用支持断点续传的工具(如wget或curl)下载文件。 Jenkins Pipeline示例: ```groovy pipeline { agent any stages { stage('Download') { steps { script { // 假设目标Pod名为mypod,命名空间为mynamespace,文件路径为/path/to/largefile.iso // 在目标Pod中启动HTTP服务(注意:这里使用后台运行,并记录PID以便后续停止) sh "kubectl exec mypod -n mynamespace -- sh -c 'cd /path/to && python3 -m http.server 8080 & echo \$! > /tmp/http.pid'" // 等待服务启动 sleep 5 // 获取Pod的IP def podIP = sh(script: "kubectl get pod mypod -n mynamespace -o jsonpath='{.status.podIP}'", returnStdout: true).trim() // 在Agent节点上下载 sh "wget -c http://${podIP}:8080/largefile.iso -O largefile.iso" // 停止Pod内的HTTP服务 sh "kubectl exec mypod -n mynamespace -- sh -c 'kill \$(cat /tmp/http.pid) && rm /tmp/http.pid'" } } } } } ``` 注意:这种方法需要目标Pod有Python环境(或者其他HTTP服务器工具),并且需要开放8080端口(确保没有防火墙阻止)。另外,如果Pod重启,IP会变化,所以需要确保在下载期间Pod不会重启。 方案二:通过共享存储卷 前提条件:配置一个Kubernetes持久化卷(PV)和持久化卷声明(PVC),并挂载到目标Pod和Jenkins Agent Pod(如果Agent是动态Pod)上,或者该共享存储也可以被Jenkins Agent节点(非Pod形式)直接访问(如NFS)。 步骤: 1. 目标Pod将大文件写入共享存储卷。 2. Jenkins Agent节点(或Pod)从同一个共享存储卷读取文件。 这种方法不需要网络传输,速度最快。但需要预先配置共享存储。 方案三:使用kubectl cp(适合小规模文件,大文件可能超时) 虽然kubectl cp支持复制文件,但对于大文件,可能会因为网络问题中断,且不支持断点续传。 示例步骤: ```groovy steps { sh "kubectl cp mynamespace/mypod:/path/to/largefile.iso largefile.iso" } ``` 但注意:如果传输中断,需要重新开始。 方案四:使用rsync(需要目标Pod和Agent节点都安装rsync) 步骤: 1. 在目标Pod中启动rsync守护进程,或者通过ssh使用rsync。 2. 在Agent节点上执行rsync命令同步文件。 这种方法比较高效,但配置稍复杂(比如需要配置ssh免密登录到Pod,或者配置rsync守护进程)。 综合推荐: 如果环境允许(有共享存储),方案二最佳。否则,方案一(HTTP服务)是通用且易于实现的方法。 注意事项: - 大文件传输需要考虑网络带宽和传输时间,避免超时。Jenkins Pipeline默认超时为60分钟,可以通过`timeout`步骤调整。 - 确保目标Pod有足够的资源(CPU、内存)来支持文件传输,避免因资源不足导致Pod重启(CrashLoopBackOff,如引用[4]所述)。 - 如果目标Pod处于CrashLoopBackOff状态(引用[4]),则可能无法稳定提供服务,需要先解决Pod的问题。 相关问题: 1. 如何监控大文件传输的进度? 2. 在传输过程中如何避免Pod被删除或重启? 3. 如何配置Kubernetes的持久化存储卷用于文件共享? 4. 如何优化HTTP服务以提高大文件下载速度? 请根据实际环境选择合适的方法。</think>### 将 Kubernetes Pod 大文件下载到 Agent 节点的完整方案 #### 方法 1:通过共享存储卷(最高效方案)[^1][^3] ```bash # 步骤 1: 创建共享存储卷(如 NFS/CephFS) kubectl create -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: large-file-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi EOF # 步骤 2: 将存储卷挂载到 Pod kubectl patch deployment your-deployment --patch ' spec: template: spec: containers: - name: your-container volumeMounts: - name: shared-volume mountPath: /mnt/shared volumes: - name: shared-volume persistentVolumeClaim: claimName: large-file-pvc ' # 步骤 3: 在 Pod 内移动文件到共享目录 kubectl exec -it your-pod -- mv /path/to/large_file.iso /mnt/shared/ # 步骤 4: 在 Agent 节点挂载共享存储 # (需提前配置 NFS 客户端或云存储插件) sudo mount -t nfs <nfs-server>:/path /mnt/agent-downloads ``` **优势**: - 传输速度比网络复制快 3-5 倍 - 支持断点续传 - 避免网络传输失败风险 - 适合超过 50GB 的超大文件[^2] #### 方法 2:使用 kubectl cp + 分块传输(中等文件) ```bash # 步骤 1: 在 Pod 内分割文件(每块 2GB) kubectl exec your-pod -- sh -c "split -b 2G /data/large_file.zip /data/part_" # 步骤 2: 分批下载到 Agent 节点 for part in $(kubectl exec your-pod -- ls /data | grep part_); do kubectl cp your-pod:/data/$part /agent/path/$part done # 步骤 3: 合并文件 cat /agent/path/part_* > /agent/path/large_file.zip ``` #### 方法 3:HTTP 直连下载(跨网络场景) ```bash # 步骤 1: 在 Pod 启动 HTTP 服务 kubectl exec your-pod -- python3 -m http.server 8080 --directory /data & # 步骤 2: 获取 Pod IP POD_IP=$(kubectl get pod your-pod -o jsonpath='{.status.podIP}') # 步骤 3: 在 Agent 节点下载(支持断点续传) wget -c http://$POD_IP:8080/large_file.zip -O /agent/path/file.zip # 带宽限制(可选) wget --limit-rate=50m http://$POD_IP:8080/large_file.zip ``` #### 方法 4:通过 Jenkins Agent 容器挂载(动态 Pod 场景)[^1][^3] ```jenkinsfile pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: jnlp image: jenkins/inbound-agent:latest - name: downloader image: alpine:latest command: ['sleep', '99999'] volumeMounts: - name: shared-storage mountPath: /shared volumes: - name: shared-storage persistentVolumeClaim: claimName: large-file-pvc ''' } } stages { stage('Download') { steps { container('downloader') { sh ''' # 从目标 Pod 复制到共享卷 kubectl cp source-pod:/path/file.iso /shared/file.iso ''' } sh 'ls /shared' # 文件已在 Agent 节点 } } } } ``` ### 关键注意事项 1. **资源监控**: ```bash # 检查 Pod 资源使用 kubectl top pod your-pod # 检查存储卷空间 df -h /mnt/agent-downloads ``` 2. **传输中断处理**: - 共享存储方案:自动支持断点续传 - 网络传输:使用 `wget -c` 或 `rsync --partial` - 分块传输:失败后只需重传单个块 3. **Pod 稳定性保障**: - 添加资源限制防止 OOM[^4] ```yaml resources: limits: memory: 4Gi cpu: "2" ``` - 配置存活探针避免 CrashLoopBackOff[^3][^4] 4. **传输验证**: ```bash # 比较源文件和下载文件的校验值 kubectl exec your-pod -- sha256sum /path/file.iso sha256sum /agent/path/file.iso ``` ### 性能优化技巧 1. **压缩传输**: ```bash kubectl exec your-pod -- gzip -k large_file.log kubectl cp your-pod:/path/large_file.log.gz . gunzip large_file.log.gz ``` 2. **SSD 加速**: ```bash # 将下载目录挂载到 SSD 分区 sudo mount /dev/nvme0n1 /fast-downloads ``` 3. **并行传输**: ```bash # 同时下载多个分块 parallel -j 4 kubectl cp your-pod:/data/part_{} ./part_{} ::: {01..20} ``` > ⚠️ **超大型文件(>100GB)建议**:优先采用共享存储卷方案,结合 `rsync` 增量同步: > ```bash > rsync -avzP --bwlimit=100m user@pod-ip:/path/ /agent/path/ > ``` --- ### 相关问题 1. 如何监控 Kubernetes Pod 到 Agent 节点的传输速度? 2. 共享存储卷方案中如何处理跨可用区传输延迟? 3. Jenkins 动态 Agent Pod 如何持久化下载的文件?[^1][^3] 4. 如何避免大文件传输导致的 Pod OOM 崩溃?[^4] 5. 在受限网络环境中如何优化大文件传输? [^1]: Jenkins Kubernetes 集成方案 [^2]: Kubernetes 集群自动扩缩容机制 [^3]: Kubernetes 插件配置指南 [^4]: Pod CrashLoopBackOff 解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值