openshift-docs
  • 不知所措的openshift kubernetes
  • 3scale
    • 在openshift使用3scale-operator部署3scale
  • Hyperledger-Fabric
    • Hyperledger Fabric on openshift 3.11
  • adminer
    • helm部署adminer
  • admission-controller
    • k8s nameapce增加默认node-selector和defaultTolerations
  • cert-manager
    • cert-manager-1.5升级到1.6
  • cicd
    • Argocd定时备份到us3
    • Argocd添加服务流程
    • Argocd自定义健康检查
    • helm安装argocd
    • k8s1.22部署gitlab对接keycloak
    • 使用Tekton+Helm-Chart+ArgoCD构建GitOps CICD
    • 使用 Tekton 构建CI流程
    • 使用argocd-notifications通知Tekton触发api-test
    • 使用 docker buildx 构建多CPU架构镜像
    • 使用image-syncer同步多CPU架构镜像到私有仓库
    • 开源helm chart 发布到 https://artifacthub.io/
    • 快速编写通用helm chart
  • client-go
    • k8s client-go 创建ingress示例
  • cluster-monitor-opertor
    • Openshift3.11 alertmanager 持久化
    • cluster-monitor-operator alertmanager配置
    • cluster-monitor-operator添加外部metrics
    • openshift3.11-cluster-monitoring-operator数据持久化
  • config-syncer
    • k8s使用config-syncer(kubed)同步secret
  • dns
    • k8s coredns 优化
    • k8s 使用coredns 自定义hosts 解析
  • dnsmasq
    • MAC 环境使用 dnsmasq 配置openshift相关自定义域名
    • 配置dnsmasq apps通配解析
  • elasticsearch
    • Elasticsearch查询重复数据
    • elasticsearch-kibana-8.10创建向量索引模板
    • openshift3.11中使用ECK安装filebeat+elasticsearch+kibana收集日志初探
    • openshift3.11部署eck1.6+es7.14.1
    • 使用kibana修改数据流索引mapping
  • etcd
    • k8s 1.22 使用cronjob 备份etcd
    • k8s1.22使用CronJob定时备份etcd到US3
    • 使用cronjob备份etcd
    • 恢复openshift3.11-etcd数据快照
  • flowiseai
    • argocd2.2.1+helm3.9-chart+k8s1.22部署flowise
  • ingress-nginx
    • ingress-nginx启用header名称中下划线
  • ipfs
    • golang计算文件ipfs cid
    • helm安装ipfs-cluster
  • kafka
    • banzaicloud-stable/kafka-operator+local-path迁移主机
    • 使用bitnami/kafka部署外部可访问的 kafka
  • keycloak
    • openshift使用keycloak登录
  • kong
    • Kong使用ip-pestriction插件配置IP白名单
    • kong admin api 使用 go-kong 调用
    • kong manager页面显示空白,报错net:ERR_HTTP2_PROTOCOL_ERROR
    • kong helm 安装
    • kong 自定义默认error html
    • 使用kong转发TCP服务
  • kube-flannel
    • kube-flannel-v0.20.1升级v0.22.2
  • kubeadm
    • RockLinux+kubeadm+k8s-1.22.16 升级到1.22.17
    • RockLinux+kubeadm+k8s-1.22.2 升级到1.22.16
  • kubevirt
    • Kubevirt on Openshift
    • kubebirt 中使用 cloud-init
    • kubevirt限制vm发布主机
    • openshift-3.11-kubevirt从v0.19.0升级到v0.27.0
    • 使用alpine-make-vm-image制作alpine-qcow2云镜像
    • 使用virtualbox自定义Alpine-vrit云镜像
  • load-balance
    • ucloud 添加负载均衡报文转发配置
  • metrics-sever
    • k8s-1.22安装metrics-server
  • mongodb
    • 使用argocd部署mongo-express
    • 阿里云 Mongodb副本集实例使用
  • mysql
    • Helm部署mysql
    • helm安装phpmyadmin
    • mysql批量修改utf8mb3为utf8mb4字符集
    • 部署MySQL Server Exporter
  • openfaas
    • OpenFaaS定时任务
    • OpenFaas使用Go模板创建Function
    • helm 安装openfaas
  • operator
    • 使用Operator-SDK构建基于Helm 的 Operator
  • playwright
    • 使用playwright截图Kibana图表
  • prometheus-operator
    • helm+kube-prometheus-stack-prometheus-operator+local-path(storageclass)部署的prometheus迁移主机
    • k8s 1.22 环境 kube-prometheus-stack 22.x 升级至 41.x
    • 使用helm+kube-prometheus-stack只部署prometheus
  • proxy
    • 使用快代理使用海外代理访问海外网站
  • rancher
    • helm 安装rancher 2.6.3
    • rancher-backup使用US3备份
    • rancher2.6.3升级至rancher2.6.9
    • rancher2.6.9对接keycloak
    • 解决rancher-v2.6.3报helm-operator更新rancher-webhook异常问题
    • 解决更新rancher2.6.13后报webhook和fleet chart版本不支持
  • raspberry-pi
    • mac os golang编译ARM环境go-sqlite3项目
    • 无头(headless) raspberry pi 4 ssh wifi 安装(mac)
    • 树莓派4B+raspberry-pi-os-buster在线安装k3s
    • 树莓派Raspberry Pi OS 设置静态ip
    • 树莓派raspberry-pi-os(32bit)安装docker
    • 树莓派raspberry pi os开启ssh
    • 树莓派安装centos7并简单优化
  • rbac
    • openshift给没能打开web terminal终端的用户添加权限
  • registry
    • 使用image-syncer同步所需镜像到仓库
  • ssh
    • Mac OSX ssh隧道使用方法
  • storage
    • lvm分区配置备份与恢复测试
    • openshift3.11使用nfs-client-provisioner+UCloud-UFS提供动态pv存储
    • openshift3.11使用nfs-client-provisioner+阿里云NAS提供动态nfs
    • openshift3.11配置local volume
    • openshift动态nfs
  • tracing
    • Ipfs cluseter使用分布式追踪系统jaeper tracing
  • troubleshooting
    • coredns service 连接超时(connection timed out; no servers could be reached)
    • etcdDatabaseHighFragmentationRatio 异常处理
    • helm更新服务报错提示statefulset更新是被禁止的
    • k8s如果防止容器中出现僵尸进程
    • kubevirt api server 证书过期问题导致openshfit调度异常
    • macOS Chrome访问https://registry-console-default.appsxxx.xxx.xxx/页面显示ERR_CERT_INVALID,且不能点继续
    • master 主机df 卡死
    • openshift project Terminaing处理
    • OpenShift Docker Registry 500
    • 解决openshift3.11 node NotReady csr Pending
    • openshift3.11-pvc-delete-Terminating-hang
    • openshift3.11清理Terminating 状态project
    • pod pending event报错cni无可用IP
    • ucloud环境开启selinux后/var/log/messages不能写入问题
    • ucloud环境开启selinux
    • 解决openshift3.11不能下载redhat registry.access.redhat.com中镜像问题
    • 证书未过期但是报NET::ERR_CERT_AUTHORITY_INVALID证书错误处理
  • walletconnect
    • WalletConnect-Relay 部署
Powered by GitBook
On this page
  • k8s如果防止容器中出现僵尸进程
  • 1、直接运行服务进程
  • 2、bash 使用 exec 运行进程
  • 3、pod使用 hostPID
  • Add Tini
  • Run your program under Tini
  • or docker run your-image /your/program ...

Was this helpful?

  1. troubleshooting

k8s如果防止容器中出现僵尸进程

k8s如果防止容器中出现僵尸进程

1、直接运行服务进程

Dockerfile 如下:

FROM alpine:3.12
COPY server /
EXPOSE 8080
ENTRYPOINT ["/server"]
CMD ["arg1"]

这种方式启动的服务,server 在容器中的进程pid是1,主进程server被kill, 会重建容器,旧容器被杀死后的残留进程被宿主机的1号进程回收残留进程

2、bash 使用 exec 运行进程

服务的启动脚本和 Dockerfile 示例如下:

run.sh

#!/bin/bash
mkdir -p /var/log/server
exec /server

Dockerfile

FROM alpine:3.12
COPY server run.sh /
EXPOSE 8080
ENTRYPOINT ["/run.sh"]
CMD ["args1"]

如果需要在启动前做一些脚本化的操作,再启动服务,这种是在run.sh最后启动服务的时候, 使用exec server, 会让server进程替换当前shell 做1号进程,这种情况下同 1直接运行服务进程,也就不会产生多余全局进程。

3、pod使用 hostPID

如果一个容器中有嵌套守护进程的逻辑,容器中的1号守护进程启动子进程,子进程还会启动其它子进程,中间的子进程被Kill 还是会出现全局进程的情况

如下所示,1号进程是 looprun-x64, 子进程是 ./9234, [9234] <defunct> 就是中间进程被kill 掉之后,父进程自动改为1, 但是容器中的守护进程服务 looprun-x64 又没有回收僵尸进程的能力,就会产生大量僵尸进程.

``` ps -ef UID PID PPID C STIME TTY TIME CMD ks 1 0 0 Nov13 ? 00:00:22 ./looprun-x64 ks 54 1 0 Nov13 ? 00:00:00 [9234] ks 130 1 0 Nov13 ? 00:00:08 [9234] ks 2385 0 0 14:46 ? 00:00:00 /bin/sh ks 7446 1 0 Nov15 ? 00:00:11 [9234] ks 15315 1 0 Nov23 ? 00:00:06 [9234] ks 15800 1 0 12:31 ? 00:00:00 [9234] ... ks 15879 1 0 12:32 ? 00:00:06 ./9234 ks 16017 1 0 Nov25 ? 00:00:29 [9234]

这种情况解决方法之一就是容器的进程pid 与宿主机共享,让宿主机的1号进程`/sbin/init` 来回收僵尸进程

k8s 的发现在yaml 的参数中添加 `hostPID: true`

... spec: containers: ... hostPID: true ...

容器启用宿主的pid 之后,容器中的主进程id 就不是1了,就算中间进程 `./9234` 被kill 其下的子进程会自动设置宿主机的 1号进程为父id, 宿主机的 1号进程 `/sbin/init` 是有回收无用的僵尸进程能力的,这相也就不会有多余的僵尸进程。

### 理解进程主机共享

1. 容器进程不再具有 PID 1。
2. 进程对宿主机中的其它进程可见。
3. 容器文件系统通过 /proc/$pid/root 链接对 pod 中的其他容器可见。 这使调试更加容易,但也意味着文件系统安全性只受文件系统权限的保护。

## 4、docker 启动命令使用Tnin

上述三种情况都是因为容器中的1号进程不具备回收子进程的能力导致的,所以如果我们让 容器中的 1号进程拥有回收子进程的能力,也就不会有僵尸进程。

Tini 做为1号进程启动,Tini 有进程管理的功能,可以回收僵尸进程,也不会对容器暴露主机上的进程,在旧版本的k8s中,这个是个不错的解决方案,很多大型项目也都有使用。

Tnin github 地址:https://github.com/krallin/tini

dockerfile 示例如下:

Add Tini

Run your program under Tini

CMD ["/your/program", "-and", "-its", "arguments"]

or docker run your-image /your/program ...

## 5、pod使用 `shareProcessNamespace: true`

从 k8s v1.17+ 起 ,`ShareProcessNamespace` 字段 就已经是 stable 状态了,启用后pod 中多个容器间可以共享进程,Infra容器中启动一个pause的进程作为1号进程管理pod 中的子进程,这样就可以回收容器中的僵尸进程了。

### 理解进程命名空间共享

1. 容器进程不再具有 PID 1。 在没有 PID 1 的情况下,一些容器镜像拒绝启动(例如,使用 systemd 的容器),或者拒绝执行 kill -HUP 1 之类的命令来通知容器进程。在具有共享进程命名空间的 pod 中,kill -HUP 1 将通知 pod 沙箱(在上面的例子中是 /pause)。
2. 进程对 pod 中的其他容器可见。 这包括 /proc 中可见的所有信息,例如作为参数或环境变量传递的密码。这些仅受常规 Unix 权限的保护。
3. 容器文件系统通过 /proc/$pid/root 链接对 pod 中的其他容器可见。 这使调试更加容易,但也意味着文件系统安全性只受文件系统权限的保护。

### k8s 中发布参考配置

... spec: shareProcessNamespace: true containers: ...

```

Previoushelm更新服务报错提示statefulset更新是被禁止的Nextkubevirt api server 证书过期问题导致openshfit调度异常

Last updated 4 years ago

Was this helpful?

ENV TINI_VERSION v0.19.0 ADD /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--"]

参考: 参考:

https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini
https://www.cnblogs.com/kkbill/p/12952815.html
https://blog.csdn.net/whatday/article/details/104136230