IT 铁人赛 k8s 入门30天 -- day30 Share Process Namespace between Containers in a Pod

参考文件 https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/

前言

今天要来实作 Share Process Namespace between Containers in a Pod 这个任务

在同一个 Pod 的 Container 内的 Process 可以透过 namespace sharing 的方式, 让彼此可以互相沟通

这种设定可以用来让同一个 Pod 内的 Container 彼此合作. 举例来说, 建立一个专门处理应用log 的 SideCar Container 或是建立一个用来 Debug 的 Container 就可以这样做

布署目标

1 建立一个 Pod 设定 shareProcessNames 让 Container 间 Process 可以互通

2 透过连线到其中一的 Container 验证查看另一个 Container 的 Process

建立一个 Pod 设定 shareProcessNames 让 Container 间 Process 可以互通

建立 share-process-namespace.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  shareProcessNamespace: true
  containers:
  - name: nginx
    image: nginx
  - name: shell
    image: busybox
    securityContext:
      capabilities:
        add:
        - SYS_PTRACE
    stdin: true
    tty: true

建立一个 Pod

名称设定为 nginx

设定 shareProcessNamespace 为 true 这个设定用来让 Containers 间的 Process 可以互通

设定第一个 Container 使用 image 为 nginx 名称设定为 nginx

设定第二个 Container 使用 image 为 busybox 名称设定为 shell

设定第二个 Container 设定 securityContext 如下

capabilities:
  add:
  - SYS_PTRACE

增加这个 SYS_PTRACE 是开启 可以让另一个 Container Process 操作这个 busybox Container process 的权限

设定第二个 Container 开启 tty: true, stdin: true 打开 terminal 与 stdin 权限

建立布署使用以下指令

kubectl apply -f share-process-namespace.yaml

透过连线到其中一的 Container 验证查看另一个 Container 的 Process

透过以下指令连线到 nginx

kubectl attach -it nginx -c shell

使用以下指令查看 Process

ps ax

透过以下指令发 SIGNUP 到 nginx 来重新启动 worker process

kill -HUP 7

注意的是, 这边 7 这个 PID 可能因为每个布署的不同而不同, 需要透过上面 ps ax 找到 master process 来处理

然後使用以下指令验证一下重起状态

ps ax

使用以下指令来查看 /proc/$pid/root 连结

head /proc/7/root/etc/nginx/nginx.conf

其他

同一个 Pod 的 Container 透过 shared namespace namespace

以下有几个特性

  1. Container process 将不再有 PID 1

有些 Container 需要 PID 1 来开启比如说需要 systemd 的 image

会透过 kill -HUP 1 来重启 Container Process

在 Pod 有开启 share process namespace, kill -HUP 1 则会变成发指令到 Pod 的 sandbox

  1. 在同一个 Pod 的 Process 彼此都可以看见

包括所有在 /proc 下的资讯, 比如说环境参数或是运行参数

可是存取仍然需要是具有对应 UNIX 权限的使用者

  1. 可以透过 /proc/$pid/root 来看到其他在同一个 Pod 的 Container 的档案系统

透过这个方式可以有效的做 debug

後记

这篇是 k8s 入门 30 天的最後一篇

大致上介绍了一些基础 k8s 基础概念

笔者发现在研究时由於自身经验的不足, 常常无法用良好的实际案例来解说

想要更理解 k8s 的效用, 後续应该要做更延伸应用

还需要去研究许多比如资讯安全的设置, NAT, Metric 监测, 或是建制 ci/cd 的 Pipeline runner 等等也许都是不错的应用情境

感谢各位订阅者一直以来的观看笔者的文章


<<:  Day 29:利用 NPM 来安装 Next 布景主题

>>:  Day29 :【TypeScript 学起来】React + TypeScript 实作简单 Todo App Part2

[Day 27] - 『转职工作的Lessons learned』 - Cube.js(III)

今天要说在後端的Cube.js Server连线DB後,对DB的请求需要做什麽样的设置,也就是如何建...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day16 文章留言区块

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

[Day 13] 第一主餐 pt.6-叮咚,有您的包裹

上一篇我们把MySQL安装设定好,并且开始跟django做互动了 今天我们就要来把MySQL的东东全...

第 11 天 范本驱动表单的动态检核讯息|ngSubmit

前情提要 昨日实作其中一个英雄表单栏位「姓名」後,演示了如何使用 FormControl 表单控制项...

强敌!费波那契数的哥哥登场,Ruby 30 天刷题修行篇第五话

大家好,我是 A Fei,相信大家应该都听过费波那契数(Fibonacci)的大名,又称费式数列,是...