让你能深入理解什么是Pod对象的一篇文章

Pod存在的意义

Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。

Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本单位。

Pod 内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

让你能深入理解什么是Pod对象的一篇文章

Pod的意义

容器都是单进程运行的,不是因为容器只能运行一个进程,而是容器没有管理多个进程的能力。

容器里PID=1的进程就是应用本身,其他的进程都是这个PID=1进程的子进程。如果启动了第二个进程,那这第二个进程异常退出的时候,外部并不能感知,也就管理不了。

在一个真正的操作系统里,进程并不是“孤苦伶仃”地独自运行的,应用之间可能有着密切的协作关系,必须部署在同一台机器上。

这些密切关系包括但不限于:互相之间会发生直接的文件交换,使用localhost或者Socket文件进行本地通信,会发生非常频繁的远程调用,共享某些Linux Namespace。

Pod的实现原理

首先,Pod只是一个逻辑概念,是一组共享了某些资源的容器。

Kubernetes真正处理的,还是宿主机操作系统上Linux容器的Namespace和Cgroups,而并不存在一个所谓的Pod的边界或者隔离环境。

Kubernetes里,Pod的实现需要使用一个中间容器,叫做Infra容器,在Pod中,Infra容器永远都是第一个被创建的容器。

其他用户自定义的容器,通过Join Network Namespace的方式与Infra容器关联在一起。

让你能深入理解什么是Pod对象的一篇文章

如图所示,这个Pod里除了两个用户容器,还有一个Infra容器。

这个Infra容器占用极少的资源,使用了一个非常特殊的镜像:k8s.gcr.io/pause,这个镜像永远处于“暂停”状态,100-200KB左右大小。

Infra容器生成NetWork Namespace后,用户容器加入Infra容器的Network Namespace中,用户容器和Infra容器在宿主机上的Namespace文件是一样的。

这意味着,对Pod中的容器A和容器B来说:

  • 它们可以直接使用localhost进行通信;
  • 他们看到的网络设备和Infra容器的一样;
  • 一个Pod只有一个IP地址,也就是容器A、容器B、Infra容器的ip地址一致;
  • 所有的网络资源被改Pod中的所有容器共享;
  • Pod的生命周期只跟Infra容器一致,与容器A和B无关。

对于同一个Pod里面的所有用户容器来说,它们的进出流量,都是通过Infra容器完成的。

Pod的本质,实际上是在扮演传统基础设施“虚拟机”的角色;容器则是这个虚拟机里运行的用户进程。

镜像拉取策略

策略参数:

  • IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
  • Always:每次创建 Pod 都会重新拉取一次镜像
  • Never: Pod 永远不会主动拉取这个镜像

查看已创建deployment的拉取策略

$ kubectl get deploy/nginx-deployment -o yaml | grep imagePull
imagePullPolicy: IfNotPresent

认证镜像仓库拉取方法

Node:修改需要认证的镜像仓库

{"insecure-registries": ["需要认证的仓库地址"]}

Node:登录镜像仓库(可提交项目镜像到私有仓库)

docker login 镜像仓库IP地址

Node:查看仓库docker认证信息、并编码

cat ~/.docker/config.json | base64 -w 0

Master:创建认证yaml文件、 .dockerconfigjson下就是Node config.json的编码信息

apiVersion: v1
kind: Secret
metadata:
  # 拉取镜像策略定义名称
  name: registry-pull-secret
data:
  .dockerconfigjson: ewoJImF1dGhzIjkfldsajkfldsajklfsJKLFJDAKLJKljkJjfkldsjkfdsaJKLFDASLjkljfklJFKDLHASKjkjfLfdsjaklfjdsaklFDSAJKLFDJSAKLFDSAjklfjdsaklf;jdaklfj;dsklajfkldsajfkld;ajkfld==
type: kubernetes.io/dockerconfigjson

下面根据条件完成策略

apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
      imagePullPolicy: IfNotPresent
apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
  imagePullSecrets:
    - name: registry-pull-secret

本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2020/10/04/k8s-7971
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
兰玉磊兰玉磊
上一篇 2020年9月29日
下一篇 2020年10月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注