• Kubernetes之Pod初始化容器


    Kubernetes之Pod初始化容器

    概述

    ​ 初始化是很多编程语言普遍关注的问题,甚至有些编程语言直接支持模式构造来生成初始化程序,这些用于进行初始化的程序结构称为初始化器或初始化列表。初始化代码要首先运行,且只能运行一次,它们常用于验证前提条件、基于默认值或传入的参数初始化对象实例的字段等。Pod中的初始化容器(Init Container)功能与此类似,它们为那些有先决条件的应用容器完成必要的初始设置,例如设置特殊权限、生成必要的iptables规则、设置数据库模式,以及获取最新的必要数据等。

    ​ 有很多场景都需要在应用容器启动之前进行部分初始化操作,例如等待其他关联组件服务可用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应用需求有如下几种。

    • 用于运行需要管理权限的工具程序,例如iptables命令等,出于安全等方面的原因,应用容器不适合拥有运行这类程序的权限。
    • 提供主容器镜像中不具备的工具程序或自定义代码。
    • 为容器镜像的构建和部署人员提供了分离、独立工作的途径,部署人员使用专用的初始化容器完成特殊的部署逻辑,从而使得他们不必协同起来制作单个镜像文件。
    • 初始化容器和应用容器处于不同的文件系统视图中,因此可分别安全地使用敏感数据,例如Secrets资源等。
    • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得以满足。

    ​ Pod对象中的所有初始化容器必须按定义的顺序串行运行,直到它们全部成功结束才能启动应用容器,因而初始化容器通常很小,以便它们能够以轻量的方式快速运行。某初始化容器运行失败将会导致整个Pod重新启动(重启策略为Never时例外),初始化容器也必将再次运行,因此需要确保所有初始化容器的操作具有幂等性,以避免无法预知的副作用。

    ​ Init 容器与普通的容器非常像,除了如下两点:

    • 它们总是运行到完成,即它的本身是有周期的,并不是像nginx,tomcat那样一直堵塞在那里。
    • 每个都必须在下一个启动之前成功完成,即在真正容器启动之前,初始化容器都要成功跑完。

    应用

    下面这个pod,会先在初始化容器中往挂载的路径的index.html写入12222222,然后nginx的挂载静态文件下,读取index.html

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: "pod-life"
    5. labels:
    6. app: "pod-life"
    7. spec:
    8. volumes:
    9. - name: content-vol
    10. emptyDir: {}
    11. initContainers: ## Pod在启动containers之前,先要【运行完】initContainers的所有容器,所以这些容器必须有终结,不能一直运行
    12. - name: init-c-01
    13. image: alpine ### 必须有终结的那个时刻,一般不要用一直启动的镜像
    14. command: ["/bin/sh","-c","echo 12222222 > /app/index.html;sleep 30;echo success;"]
    15. volumeMounts:
    16. - name: content-vol
    17. mountPath: /app
    18. containers:
    19. ### docker run alpine 没有在后台一直启动的程序
    20. - name: pod-life-01
    21. image: "nginx" #默认的启动命令是启动nginx。nginx启动在后台一直有了
    22. volumeMounts:
    23. - name: content-vol
    24. mountPath: /usr/share/nginx/html
    25. - name: pod-life-02
    26. image: "alpine" #pod里面的containers都必须能启动起来,Pod会不断的重启这个容器
    27. command: ["/bin/sh","-c","sleep 30"]

    应用后,查看日志

    1. [root@k8s-01 ~]# kubectl logs -f --tail 200 pod-life -c init-c-01
    2. success
    3. [root@k8s-01 ~]#

    查看pod,发现请求nginx的首页已经变成12222222

    1. [root@k8s-01 ~]# kubectl get pods -o wide
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. counter 1/1 Running 0 35h 10.244.165.198 k8s-03
    4. nfs-client-provisioner-69b76b8dc6-ms4xg 1/1 Running 1 (6d18h ago) 18d 10.244.179.21 k8s-02
    5. nginx-5759cb8dcc-t4sdn 1/1 Running 0 32m 10.244.179.50 k8s-02
    6. pod-life 2/2 Running 0 117s 10.244.179.52 k8s-02
    7. [root@k8s-01 ~]# curl 10.244.179.52
    8. 12222222
    9. [root@k8s-01 ~]#

    如果这个时候将yaml的命令改错

    image-20220620113326173

    那么初始化容器就会一直报错,重试,真正的容器也不会运行

    1. Every 1.0s: kubectl get pods Mon Jun 20 11:34:12 2022
    2. NAME READY STATUS RESTARTS AGE
    3. counter 1/1 Running 0 36h
    4. nfs-client-provisioner-69b76b8dc6-ms4xg 1/1 Running 1 (6d19h ago) 18d
    5. nginx-5759cb8dcc-t4sdn 1/1 Running 0 47m
    6. pod-life 0/2 Init:CrashLoopBackOff 3 (18s ago) 104s

    实际应用

    下面为kong的官方提供的yaml,就有一段初始化容器

    1. initContainers:
    2. - command:
    3. - /bin/sh
    4. - -c
    5. - while true; do kong migrations list; if [[ 0 -eq $? ]]; then exit 0; fi;
    6. sleep 2; done;
    7. env:
    8. - name: KONG_PG_HOST
    9. value: postgres
    10. - name: KONG_PG_PASSWORD
    11. value: kong
    12. image: kong:2.8
    13. name: wait-for-migrations

    主要是查看是否对数据库进行初始化数据,外面嵌套一层循环,一直等待初始化完成,则退出循环,再启动kong,把命令拿出来到源码安装环境下执行:

    1. [root@localhost ~]# kong migrations list
    2. 2022/06/20 11:48:08 [warn] ulimit is currently set to "1024". For better performance set it to at least "4096" using "ulimit -n"
    3. Executed migrations:
    4. core: 000_base, 003_100_to_110, 004_110_to_120, 005_120_to_130, 006_130_to_140, 007_140_to_150, 008_150_to_200, 009_200_to_210, 010_210_to_211, 011_212_to_213, 012_213_to_220, 013_220_to_230, 014_230_to_260, 015_260_to_270, 016_270_to_280
    5. acl: 000_base_acl, 002_130_to_140, 003_200_to_210, 004_212_to_213
    6. acme: 000_base_acme
    7. basic-auth: 000_base_basic_auth, 002_130_to_140, 003_200_to_210
    8. bot-detection: 001_200_to_210
    9. canary: 001_200_to_210
    10. degraphql: 000_base
    11. graphql-rate-limiting-advanced: 000_base_gql_rate_limiting
    12. hmac-auth: 000_base_hmac_auth, 002_130_to_140, 003_200_to_210
    13. ip-restriction: 001_200_to_210
    14. jwt: 000_base_jwt, 002_130_to_140, 003_200_to_210
    15. jwt-signer: 000_base_jwt_signer, 001_200_to_210
    16. key-auth: 000_base_key_auth, 002_130_to_140, 003_200_to_210
    17. key-auth-enc: 000_base_key_auth_enc, 001_200_to_210
    18. mtls-auth: 000_base_mtls_auth, 001_200_to_210, 002_2200_to_2300
    19. oauth2: 000_base_oauth2, 003_130_to_140, 004_200_to_210, 005_210_to_211
    20. openid-connect: 000_base_openid_connect, 001_14_to_15, 002_200_to_210
    21. proxy-cache-advanced: 001_035_to_050
    22. rate-limiting: 000_base_rate_limiting, 003_10_to_112, 004_200_to_210
    23. response-ratelimiting: 000_base_response_rate_limiting
    24. session: 000_base_session, 001_add_ttl_index
    25. vault-auth: 000_base_vault_auth
    26. enterprise: 000_base, 006_1301_to_1500, 006_1301_to_1302, 010_1500_to_2100, 007_1500_to_1504, 008_1504_to_1505, 007_1500_to_2100, 009_1506_to_1507, 009_2100_to_2200, 010_2200_to_2211, 010_2200_to_2300, 010_2200_to_2300_1, 011_2300_to_2600, 012_2600_to_2700, 012_2600_to_2700_1, 013_2700_to_2800
    27. enterprise.acl: 001_1500_to_2100
    28. enterprise.basic-auth: 001_1500_to_2100
    29. enterprise.hmac-auth: 001_1500_to_2100
    30. enterprise.jwt: 001_1500_to_2100
    31. enterprise.key-auth: 001_1500_to_2100
    32. enterprise.key-auth-enc: 001_1500_to_2100
    33. enterprise.mtls-auth: 001_1500_to_2100, 002_2200_to_2300
    34. enterprise.oauth2: 001_1500_to_2100, 002_2200_to_2211
    35. enterprise.request-transformer-advanced: 001_1500_to_2100
    36. enterprise.response-transformer-advanced: 001_1500_to_2100
    37. [root@localhost ~]# echo $?
    38. 0
    39. [root@localhost ~]#
  • 相关阅读:
    CI/CD相关概念学习
    Docker配置与使用
    10.Python_结构型模式_代理模式
    phpstorm+phpstudy+xdebug快速搭建php调试环境
    LeetCode 27. 移除元素
    博客园商业化之路-众包平台:继续召集早期合作开发者
    日志审计-syslog日志外发
    还天天熬夜加班做报表?其实你根本不懂如何高效做报表
    第八章《Java高级语法》第3节:位运算符
    基于PHP+MySQL的在线汽车租赁管理系统
  • 原文地址:https://blog.csdn.net/qq_29860591/article/details/128096399