k8s 使用 Init Container 确保依赖的服务已经启动

Intro

最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目已经升级到了 dotnetcore 3.1,最近几天则在准备把项目打包一个 helm 包,使得想要在 k8s 上部署的童鞋可以更方便的部署,目前已经基本完成,本来打算发布到阿里云的 AppHub 上,但是前几天更新的 angular client 的 chart 还没有更新,不知道最近是不更新了还是怎么回事,所以现在暂时还没发布到阿里云的 AppHub。你如果想要现在体验,可以直接拉取 Github 上的 chart 配置,自己打包安装。

一个 Pod 中可以有多个 container,也可以有多个 init container,init container 会在应用启动之前启动,并且如果有多个应用会依次启动,只有一个运行成功了,才会启动下一个,所有 init container 都运行结束了,应用才会启动,因此,我们可以借助 init container 来检查应用的依赖(如:db/redis/es...)是否已经可用。

Init Container 使用示例

apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: reservation-server
image: weihanli/activityreservation:dev
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /api/notice
port: http
initialDelaySeconds: 60
periodSeconds: 10
initContainers:
- name: init-redis
image: busybox:1.31
command: ['sh', '-c', 'until nslookup redis-server; do echo waiting for redis; sleep 2; done;']
- name: init-mysql
image: busybox:1.31
command: ['sh', '-c', 'until nslookup mysql-server; do echo waiting for mysql; sleep 2; done;']

上面这一示例定义了两个 init container,一个用来检查 redis 是否启动成功,另外一个用来检查 mysql 是否启动成功,开始部署的时候,首先会通过 nslookup 检查 redis 是否成功启动,检测到 redis 启动了之后,域名解析也就会成功,然后会检查 mysql 的状态,mysql 也成功启动之后才会开始启动 reservation-server container

查看 pod 信息:

kubectl describe po reservation-server-59fb5447f7-gb5jg

从上面的信息可以看到结果是符合预期的,首先是创建并启动 init-redis 的容器,然后创建并启动 init-mysql 容器,最后创建并启动 reservation-server 容器,从 pod 状态来看,redis 和 mysql 还未 ready 时,resrvation-server 容器也不会启动

查看 init-redis 的日志

kubectl logs reservation-server-59fb5447f7-gb5jg -c init-redis

查看 init-mysql 的日志:

kubectl logs reservation-server-59fb5447f7-gb5jg -c init-mysql

Memo

通过 init container 的配置终于可以解决依赖的服务还没有 ready 应用就启动从而导致应用多次重启之后才能正常工作的问题~~

Reference

k8s 使用 Init Container 确保依赖的服务已经启动的更多相关文章

  1. 微服务架构 - 解决Docker-Compose服务编排启动顺序问题

    基于Docker Compose进行服务编排时,一定碰到服务启动顺序的问题,例如:B服务启动之前,A服务要已经启动并且可以正常对外服务. 这个启动顺序的问题,Docker Compose本身它是无法解 ...

  2. computer browser服务无法启动 错误1068 依存服务或组无法启动

    两台电脑电脑之间传送大文件,发现局域网内共享文件,需要设置文件夹共享,需要开启 Computer Browser服务,而Computer Browser服务项的依存服务项是server服务和works ...

  3. k8s中初始化容器(init container)的作用及其使用方法

    概述 在容器的部署过程中,有的时候需要在容器运行之前进行一些预配置的工作,比如下载配置,判断某些服务是否启动,修改配置等一些准备的工作,想要实现这些功能,在k8s中可以使用初始化容器,在应用容器运行之 ...

  4. Kubernetes init container

    目录 简介 配置 init container与应用容器的区别 简介 在很多应用场景中,应用在启动之前都需要进行如下初始化操作: 等待其他关联组件正确运行(例如数据库或某个后台服务) 基于环境变量或配 ...

  5. Init Container(初始化容器)

    在很多应用场景中,应用在启动之前都需要进行如下初始化操作. ◎ 等待其他关联组件正确运行(例如数据库或某个后台服务). ◎ 基于环境变量或配置模板生成配置文件. ◎ 从远程数据库获取本地所需配置,或者 ...

  6. 【spring cloud】spring cloud分布式服务eureka启动时报错:java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V

    spring cloud分布式服务eureka启动时报错:java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApp ...

  7. kubernetes之初始容器(init container)

    系列目录 理解初始容器 一个pod里可以运行多个容器,它也可以运行一个或者多个初始容器,初始容器先于应用容器运行,除了以下两点外,初始容器和普通容器没有什么两样: 它们总是run to complet ...

  8. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  9. 转:无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

    今天看到一篇文章感觉不错,收藏转载下. 原文地址:http://blog.csdn.net/sntyy/article/details/2090347 版权为原作者所有 无法向会话状态服务器发出会话状 ...

随机推荐

  1. mac安装numpy,scipy,matplotlib

      SaintKings-Mac-mini:~ saintking$ python Python ( , ::) [GCC Compatible Apple LLVM (clang-)] on dar ...

  2. 谈谈.net对象生命周期

     不用程序员操心的堆 — 托管堆         程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存.    栈内存,通常使用的 ...

  3. tp5判断多模块下访问PC端和手机端

    现在很多网站的手机端和PC端都是分开的模块,这是问题就来了,有些手机端的用户输入了PC端的网址,直接访问了PC端.下面我教大家如何实现手机端用户访问PC时,跳转回手机端. 解决方法:把下面的代码放到公 ...

  4. javascript基础修炼(13)——记一道有趣的JS脑洞练习题【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  5. Python中的UDP协议应用之飞秋应用-单IP版本

    UDP协议是无连接的.不稳定的网络通信协议. 通过使用飞秋端口(2425),以及模拟飞秋消息格式实现使用UDP协议对飞秋进行通信. 飞秋通信格式: '1:1000:66:%s:32:%s' 以冒号分割 ...

  6. js之观察者模式和发布订阅模式区别

    观察者模式(Observer) 观察者模式指的是一个对象(Subject)维持一系列依赖于它的对象(Observer),当有关状态发生变更时 Subject 对象则通知一系列 Observer 对象进 ...

  7. CSS 3D图片翻转 ——3D Flipping Effect

    效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. luogu P3152 正整数序列

    题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇--其实就是1, 2, -, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有 ...

  9. Java修炼——冒泡排序

    核心思想: 1)如有一个数列有 N(5)个元素,则至多需要 N-1(4)趟循环 才能保证数列有序 2) 每一趟循环都从数列的第一个元素开始比较,依次比较 相邻的两个元素,比较到数列的最后 3) 如果前 ...

  10. robotframework配置邮箱服务器

    1.登录邮箱以腾讯企业邮箱为例:开启smtp服务并获得邮箱的客户端授权码 用户名:18890260218@163.com 客户端授权码:admin123 2.进入系统管理-->GO to plu ...