k8s-pod-共享资源的容器组合

网友投稿 267 2022-09-12

k8s-pod-共享资源的容器组合

这篇文章讲解的容器运行时是docker,containerd有些许不一样

​1.infra容器

在k8s项目中,Pod只是一个逻辑概念,在具体实现上,还是通过yaml来创建container。

在一个pod中可以创建多个容器,上面说了,pod中的多个容器是共享同一个Network Namespace的,并且pod中定义的多个容器是相同级别的,那多个容器的创建没有先后之分,是怎样共用Network Namespace的呢??

这里就是通过infra中间容器,这个容器永远都是第一个被创建。

1.1infra容器介绍

infra容器占用很少的资源:所以它使用一个特殊的镜像:k8s.gcr.io/pause,阿里云上创建的容器,使用的镜像是:registry.aliyuncs.com/google_containers/pause:3.1,这个镜像永远处于“暂停”状态。

infra容器第一个被创建:pod中定义的容器与infra容器使用相同的network namespace

即,对于pod中的A、B容器来说:

1.两个容器网络互通,可以使用localhost通信。

2.infra容器和A、B容器的网络设备相同。

3.一个pod只有一个Ip,即是这个共同的Network Namespace的Ip地址。

4.pod的生命周期只和infra容器一致,与A 、B 容器无关。

5.pod中流量的进出,可以认为是通过Infra容器完成的。所以开发网络插件时,只需要考虑如何配置这多个容器共享的network namespace。

1.2pod中包含多个容器演示案例

1.准备pod yaml

apiVersion: v1kind: Podmetadata: name: two-containersspec: nodeName: testops #这里我只在这个节点上测试,所以写了一个固定的节点 containers: - name: blue-pod-container image: busybox:1.31.1 command: ["sleep"] args: ["10000"] - name: green-pod-container image: busybox:1.30.1 command: ["sleep"] args: ["10000"]

2.查看该pod创建的容器

[root@testops ~]# docker ps -a|grep two-containers50088eed88a7 busybox "sleep 10000" 5 seconds ago Up 4 seconds k8s_green-pod-container_two-containers_default_51ed090c-5852-425c-8903-60bc88758ba1_0a2882bdb45aa busybox "sleep 10000" 12 seconds ago Up 11 seconds k8s_blue-pod-container_two-containers_default_51ed090c-5852-425c-8903-60bc88758ba1_072ad9f8e2891 registry.aliyuncs.com/google_containers/pause:3.1 "/pause" 19 seconds ago Up 18 seconds k8s_POD_two-containers_default_51ed090c-5852-425c-8903-60bc88758ba1_0

3.查看每个容器的pid和network namespace

测试发现,以下三个namespace相同。

lrwxrwxrwx 1 root root 0 Jan 27 22:25 ipc -> ipc:[4026535040]

lrwxrwxrwx 1 root root 0 Jan 27 22:25 net -> net:[4026535043]

lrwxrwxrwx 1 root root 0 Jan 27 22:26 user -> user:[4026531837]

[root@testops ~]# docker inspect --format '{{ .State.Pid }}' 50088eed88a72983[root@testops ~]# docker inspect --format '{{ .State.Pid }}' a2882bdb45aa2314[root@testops ~]# docker inspect --format '{{ .State.Pid }}' 72ad9f8e28911729[root@testops ~]# ll /proc/2983/ns/total 0lrwxrwxrwx 1 root root 0 Jan 27 22:26 cgroup -> cgroup:[4026531835]lrwxrwxrwx 1 root root 0 Jan 27 22:25 ipc -> ipc:[4026535040]lrwxrwxrwx 1 root root 0 Jan 27 22:25 mnt -> mnt:[4026535121]lrwxrwxrwx 1 root root 0 Jan 27 22:25 net -> net:[4026535043]lrwxrwxrwx 1 root root 0 Jan 27 22:25 pid -> pid:[4026535123]lrwxrwxrwx 1 root root 0 Jan 27 22:26 pid_for_children -> pid:[4026535123]lrwxrwxrwx 1 root root 0 Jan 27 22:26 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Jan 27 22:25 uts -> uts:[4026535122][root@testops ~]# ll /proc/2314/ns/total 0lrwxrwxrwx 1 root root 0 Jan 27 22:26 cgroup -> cgroup:[4026531835]lrwxrwxrwx 1 root root 0 Jan 27 22:25 ipc -> ipc:[4026535040]lrwxrwxrwx 1 root root 0 Jan 27 22:25 mnt -> mnt:[4026535117]lrwxrwxrwx 1 root root 0 Jan 27 22:25 net -> net:[4026535043]lrwxrwxrwx 1 root root 0 Jan 27 22:25 pid -> pid:[4026535120]lrwxrwxrwx 1 root root 0 Jan 27 22:26 pid_for_children -> pid:[4026535120]lrwxrwxrwx 1 root root 0 Jan 27 22:26 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Jan 27 22:25 uts -> uts:[4026535118][root@testops ~]# ll /proc/1729/ns/total 0lrwxrwxrwx 1 root root 0 Jan 27 22:26 cgroup -> cgroup:[4026531835]lrwxrwxrwx 1 root root 0 Jan 27 22:25 ipc -> ipc:[4026535040]lrwxrwxrwx 1 root root 0 Jan 27 22:25 mnt -> mnt:[4026535038]lrwxrwxrwx 1 root root 0 Jan 27 22:25 net -> net:[4026535043]lrwxrwxrwx 1 root root 0 Jan 27 22:25 pid -> pid:[4026535041]lrwxrwxrwx 1 root root 0 Jan 27 22:26 pid_for_children -> pid:[4026535041]lrwxrwxrwx 1 root root 0 Jan 27 22:26 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 Jan 27 22:25 uts -> uts:[4026535039][root@testops ~]#

2.pod介绍

2.1特殊字段介绍

2.2.1hostAliases设置/etc/hosts文件

在k8s中,如果要设置hosts文件,一定要通过这种方式,否则pod删除重建后,会覆盖掉被修改的内容。

---apiVersion: v1kind: Podmetadata: name: two-containersspec: hostAliases: - ip: "10.1.2.3" hostnames: - "foo.remote" - "bar.remote" nodeName: testops-k8s03-worker01 containers: - name: blue-pod-container image: busybox:1.31.1 command: ["sleep"] args: ["10000"]

查看/etc/hosts文件内容

✘ dz0400819@MacBook-Pro  ~/.kube  kubectl exec -it two-containers /bin/shkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead./ # cat /etc/hosts# Kubernetes-managed hosts file.127.0.0.1 localhost172.29.1.52 two-containers# Entries added by HostAliases.10.1.2.3 foo.remote bar.remote/ #

2.2.2pod lifecycle字段

podtsStart:容器启动后,立刻执行的操作。

postStart的执行是异步的,postStart 定义的操作,虽然是在 Docker 容器 ENTRYPOINT 执行之后,但它并不严格保证顺序。也就是说,在 postStart 启动时,ENTRYPOINT 有可能还没有结束。

preStop:在容器被杀死之前(如:收到SIGKILL信号)。

preStop的执行是同步的,所以会先执行preStop中的操作,操作完成后才会杀死容器。

在这个例子中,在容器被杀死之前,先调用nginx退出命令来实现nginx的优雅推出。

apiVersion: v1kind: Podmetadata: name: lifecycle-demospec: containers: - name: lifecycle-demo-container image: nginx lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] preStop: exec: command: ["/usr/sbin/nginx","-s","quit"]

注意:

上面说到了sigKill信号,这里多介绍一下删除pod的过程。

删除pod -> 执行preStop -> done收到KiLL信号 -> server端优雅终止 -> 删除pod

package mainimport ( "context" "flag" "fmt" "io" "math/rand" "net/ _ "net/ "os" "os/signal" "strings" "syscall" "time" "github.com/golang/glog")func main() { flag.Set("v", "4") glog.V(2).Info("Starting service0") mux := mux.HandleFunc("/", healthz) srv := Addr: ":80", Handler: mux, } done := make(chan os.Signal, 1) //用于接收Kill信号 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) go func() { if err := srv.ListenAndServe(); err != nil && err != { glog.Fatalf("listen: %s\n", err) } }() glog.Info("Server Started") <-done glog.Info("Server Stopped") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer func() { // extra handling here cancel() }() if err := srv.Shutdown(ctx); err != nil { glog.Fatalf("Server Shutdown Failed:%+v", err) } glog.Info("Server Exited Properly")}func healthz(w r *{ for k, v := range r.Header { io.WriteString(w, fmt.Sprintf("%s=%s\n", k, v)) } io.WriteString(w, "ok\n")}

2.3pod Status介绍

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:k8s源码学习-三大核心数据结构
下一篇:k8s集群环境安装kubesphere并查看问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~