分类 DevOps 下的文章

loap.jpg

从上面这张图我们可以直观的看到 PostStart 和 PreStop 包括 liveness 和 readiness 是属于主容器的生命周期范围内的,而 Init Container 是独立于主容器之外的,当然他们都属于 Pod 的生命周期范畴之内的,现在我们应该明白 Init Container 和钩子函数之类的区别了吧。

我们说Init Container主要是来做初始化容器工作的,那么他有哪些应用场景呢?

等待其他模块Ready:这个可以用来解决服务之间的依赖问题,比如我们有一个 Web 服务,该服务又依赖于另外一个数据库服务,但是在我们启动这个 Web 服务的时候我们并不能保证依赖的这个数据库服务就已经启动起来了,所以可能会出现一段时间内 Web 服务连接数据库异常。要解决这个问题的话我们就可以在 Web 服务的 Pod 中使用一个InitContainer,在这个初始化容器中去检查数据库是否已经准备好了,准备好了过后初始化容器就结束退出,然后我们的主容器 Web 服务被启动起来,这个时候去连接数据库就不会有问题了。

做初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群。

其它场景:如将Pod注册到一个中央数据库、配置中心等。

参考链接:初始化容器

将当前用户加入到 docker 用户组

因为 Docker 运行时需要特殊权限,所以默认执行命令时都必须在前面加上 sudo。但这样做确实使人厌烦,一个可行的解决方法是把用户放进 docker 用户组里。在 Ubuntu 下你可以输入:

sudo usermod -aG docker $USER

重启 docker

sudo systemctl restart docker

重新 ssh 登录

ssh [email protected]

此时运行 docker version 就不会报 Got permission denied 错误了

[email protected]:~$ docker version
Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77
 Built:             Sat May  4 02:35:57 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 01:59:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false