暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s部署-40-对POD进行重新认识(上)

运维家 2022-04-19
235

 对POD进行深度认识,让我们再次进入pod的世界。



 

1

POD回顾

一直使用的pod,我们再继续了解下,首先回顾下之前我们知道的。
    1、POD是最小调度单位
    2、POD本质上还是容器的隔离
    3、Pause容器

     

    2

    PODVolume

     我们看下pod的文件是如何共享的。
      [root@node1 ~]# cd namespace/
      [root@node1 namespace]# mkdir pod
      [root@node1 namespace]# cd pod
      [root@node1 pod]#
      [root@node1 pod]# vim pod-volume.yaml 
      apiVersion: v1
      kind: Pod
      metadata:
      name: pod-volume
      spec:
      containers:
      - name: web
      image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
      ports:
      - containerPort: 8080
      volumeMounts:
      - name: shared-volume
      mountPath: shared-web
      - name: redis
      env:
      - name: REDIS_PORT
            value: "6379"
      image: redis
      volumeMounts:
      - name: shared-volume
      mountPath: shared-redis
      volumes:
      - name: shared-volume
      hostPath:
      path: shared-volume-data
      [root@node1 pod]# kubectl apply -f pod-volume.yaml -n dev
      pod/pod-volume created
      [root@node1 pod]#

      然后我们查看下pod的运行情况;
        [root@node1 pod]# kubectl get pod -n dev -o wide
        NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
        pod-volume 2/2 Running 0 17s 10.200.104.36 node2 <none> <none>
        [root@node1 pod]#

        可以看到运行在node2上,那么我们登录到node2上进行操作;
          [root@node2 ~]# crictl ps
          CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
          5ef0dd5143665 bba24acba395b 24 seconds ago Running redis 0 a9c6a4f87ffde
          0123cd4068b28 8ad32427177e4 28 seconds ago Running web 0 a9c6a4f87ffde
          8eb0924940884 f2f70adc5d89a About an hour ago Running my-nginx 34 a696725bc8d76
          be92ec599aca8 67da37a9a360e About an hour ago Running coredns 33 0ea47c03f8a05
          1b44a197f9c4e 7a71aca7b60fc About an hour ago Running calico-node 33 d4b02f3244df6
          c7cf66853091b 90f9d984ec9a3 About an hour ago Running node-cache 33 a461065aec716
          cfa1c7594c33b acac7d63e4060 About an hour ago Running nginx-ingress-controller 4 a3cdef0be2594
          [root@node2 ~]# 

          我们先登录进redis容器中创建待验证文件;
            [root@node2 ~]# crictl exec -it 5ef0dd5143665 /bin/bash
            root@pod-volume:/data# cd
            root@pod-volume:/# ls
            bin boot data dev etc home lib lib64 media mnt opt proc root run sbin shared-redis srv sys tmp usr var
            root@pod-volume:/# cd shared-redis/
            root@pod-volume:/shared-redis# ls
            root@pod-volume:/shared-redis# echo "redis" > yunweijia.txt
            root@pod-volume:/shared-redis# cat yunweijia.txt
            redis
            root@pod-volume:/shared-redis# exit
            exit
            [root@node2 ~]# 
            然后我们再登录进web容器中看下是否有该文件和对应内容;
              [root@node2 ~]# crictl exec -it 0123cd4068b28 bin/bash
              root@pod-volume:/# ls
              bin boot dev etc home lib lib64 media mnt opt proc root run sbin shared-web springboot-web-demo.jar srv sys tmp usr var
              root@pod-volume:/# cd shared-web/
              root@pod-volume:/shared-web# ls
              yunweijia.txt
              root@pod-volume:/shared-web# cat yunweijia.txt
              redis
              root@pod-volume:/shared-web# exit
              exit
              [root@node2 ~]#

              我们可以发现,在redis上创建的文件,web容器中的确是存在的,并且对应node2节点上呢?那必然也是存在的,看看;
                [root@node2 ~]# cat shared-volume-data/yunweijia.txt 
                redis
                [root@node2 ~]#

                 

                3

                POD的Hosts文件

                 

                在volume的基础上,我们来看看一个pod中运行多个容器的时候,它们的hosts文件怎样的吧。
                首先我们看下redis的hosts文件吧;
                  [root@node2 ~]# crictl exec -it 5ef0dd5143665 cat etc/hosts
                  # Kubernetes-managed hosts file.
                  127.0.0.1 localhost
                  ::1 localhost ip6-localhost ip6-loopback
                  fe00::0 ip6-localnet
                  fe00::0 ip6-mcastprefix
                  fe00::1 ip6-allnodes
                  fe00::2 ip6-allrouters
                  10.200.104.36 pod-volume
                  [root@node2 ~]#
                  其次,我们再看下web的hosts文件;
                    [root@node2 ~]# crictl exec -it 0123cd4068b28 cat etc/hosts
                    # Kubernetes-managed hosts file.
                    127.0.0.1 localhost
                    ::1 localhost ip6-localhost ip6-loopback
                    fe00::0 ip6-localnet
                    fe00::0 ip6-mcastprefix
                    fe00::1 ip6-allnodes
                    fe00::2 ip6-allrouters
                    10.200.104.36 pod-volume
                    [root@node2 ~]#

                    可以看到同一个pod中不同容器的hosts文件是一致的,且是同一个IP地址,那么就能看出来,在同一个pod中,不同容器的端口号必须保持不同,否则会造成端口号冲突,从而无法正常启动该容器。
                    那么又有一个问题了,这种情况下我们如何配置他的host主机名呢?是应该配置在哪个容器下面呢?
                      # 先删除pod
                      [root@node1 pod]# kubectl delete -f pod-volume.yaml -n dev
                      pod "pod-volume" deleted
                      [root@node1 pod]# 

                      修改yaml文件文件;
                        [root@node1 pod]# vim pod-volume.yaml 
                        apiVersion: v1
                        kind: Pod
                        metadata:
                        name: pod-volume
                        spec:
                        hostAliases:
                        - ip: "192.168.112.131"
                        hostnames:
                        - "ceshi.volume.com"
                        containers:
                        - name: web
                        image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
                        ports:
                        - containerPort: 8080
                        volumeMounts:
                        - name: shared-volume
                        mountPath: shared-web
                        - name: redis
                        env:
                        - name: REDIS_PORT
                        value: "
                        6379
                        "
                        image: redis
                        volumeMounts:
                        - name: shared-volume
                        mountPath: shared-redis
                        volumes:
                        - name: shared-volume
                        hostPath:
                        path: shared-volume-data
                        [root@node1 pod]#

                        使其生效;
                          [root@node1 pod]# kubectl apply -f pod-volume.yaml -n dev
                          pod/pod-volume created
                          [root@node1 pod]# kubectl get pod -n dev -o wide
                          NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
                          pod-volume 2/2 Running 0 3m 10.200.104.54 node2 <none> <none>
                          [root@node1 pod]#

                          查看redis的hosts文件;
                            [root@node2 ~]# crictl exec -it de4805fe7b87c cat etc/hosts
                            # Kubernetes-managed hosts file.
                            127.0.0.1 localhost
                            ::1 localhost ip6-localhost ip6-loopback
                            fe00::0 ip6-localnet
                            fe00::0 ip6-mcastprefix
                            fe00::1 ip6-allnodes
                            fe00::2 ip6-allrouters
                            10.200.104.54 pod-volume

                            # Entries added by HostAliases.
                            192.168.112.131 ceshi.volume.com
                            [root@node2 ~]#

                            查看web的hosts文件;
                              [root@node2 ~]# crictl exec -it ffe81fd533bcd cat etc/hosts
                              # Kubernetes-managed hosts file.
                              127.0.0.1 localhost
                              ::1 localhost ip6-localhost ip6-loopback
                              fe00::0 ip6-localnet
                              fe00::0 ip6-mcastprefix
                              fe00::1 ip6-allnodes
                              fe00::2 ip6-allrouters
                              10.200.104.54 pod-volume

                              # Entries added by HostAliases.
                              192.168.112.131 ceshi.volume.com
                              [root@node2 ~]#

                              可以看到redis和web的hosts文件都添加成功了。

                               

                              4

                              POD和宿主机共享

                              那么pod还可以和宿主机共享网络和pid空间,下面看看;
                              先停止原pod;
                                [root@node1 pod]# kubectl delete -f pod-volume.yaml -n dev
                                pod "pod-volume" deleted
                                [root@node1 pod]#
                                修改yaml文件如下;
                                  [root@node1 pod]# vim pod-volume.yaml 
                                  apiVersion: v1
                                  kind: Pod
                                  metadata:
                                  name: pod-volume
                                  spec:
                                  hostNetwork: true
                                    hostPID: true
                                  hostAliases:
                                  - ip: "192.168.112.131"
                                  hostnames:
                                  - "ceshi.volume.com"
                                  containers:
                                  - name: web
                                  image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
                                  ports:
                                  - containerPort: 8080
                                  volumeMounts:
                                  - name: shared-volume
                                  mountPath: shared-web
                                  - name: redis
                                  env:
                                  - name: REDIS_PORT
                                  value: "6379"
                                  image: redis
                                  volumeMounts:
                                  - name: shared-volume
                                  mountPath: shared-redis
                                  volumes:
                                  - name: shared-volume
                                  hostPath:
                                  path: shared-volume-data
                                  [root@node1 pod]#

                                  让yaml文件生效;
                                    [root@node1 pod]# kubectl apply -f pod-volume.yaml -n dev
                                    pod/pod-volume created
                                    [root@node1 pod]# kubectl get pod -n dev -o wide
                                    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
                                    pod-volume 2/2 Running 0 17s 192.168.112.131 node2 <none> <none>
                                    [root@node1 pod]#

                                    验证下:
                                      [root@node2 ~]# netstat -tunlp | grep 6379
                                      tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 71405/redis-server
                                      tcp6 0 0 :::6379 :::* LISTEN 71405/redis-server
                                      [root@node2 ~]# netstat -tunlp | grep 8080
                                      tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 2337/nginx: master
                                      tcp6 0 0 :::8080 :::* LISTEN 71290/java
                                      tcp6 0 0 :::18080 :::* LISTEN 2337/nginx: master
                                      [root@node2 ~]#

                                      可以看到我们可以从宿主机上查到pod的端口号信息,我这里就不进入容器中查看了,因为我的容器中没有相关命令,无法查证。

                                       

                                      5

                                      POD的生命周期

                                       

                                      pod的生命周期是什么,就是lifecycle,可以在启动的时候同时执行一个命令,也可以在退出的时候执行一个命令,有什么作用呢?

                                      启动执行的时候可以做一些配置,比如修改个端口号,或者输出个日志,需要注意的是他和容器的运行是pod关系,并没有先后顺序;

                                      退出执行的时候可以发一个信号,或者优雅的停止进程,它的执行顺序和启动不同,它是先执行该命令,该命令执行完毕之后,容器才会停止。

                                      具体如何配置呢?我们来看看,还是以上面的例子进行修改;
                                      先停止该pod;
                                        [root@node1 pod]# kubectl delete -f pod-volume.yaml -n dev
                                        pod "pod-volume" deleted
                                        [root@node1 pod]#

                                        修改yaml文件;
                                          [root@node1 pod]# vim pod-volume.yaml 
                                          apiVersion: v1
                                          kind: Pod
                                          metadata:
                                          name: pod-volume
                                          spec:
                                          hostNetwork: true
                                          hostPID: true
                                          hostAliases:
                                          - ip: "192.168.112.131"
                                          hostnames:
                                          - "ceshi.volume.com"
                                          containers:
                                          - name: web
                                          image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
                                          ports:
                                          - containerPort: 8080
                                          volumeMounts:
                                          - name: shared-volume
                                          mountPath: /shared-web
                                          lifecycle:
                                          postStart:
                                          exec:
                                          command: ["/bin/sh", "-c", "echo web-service starting~~~ >> /shared-web/service.log"]
                                          preStop:
                                          exec:
                                          command: ["/bin/sh", "-c", "echo web-service stoping~~~ >> /shared-web/service.log"]
                                          - name: redis
                                          env:
                                          - name: REDIS_PORT
                                          value: "6379"
                                          image: redis
                                          volumeMounts:
                                          - name: shared-volume
                                          mountPath: /shared-redis
                                          volumes:
                                          - name: shared-volume
                                          hostPath:
                                          path: /shared-volume-data
                                          [root@node1 pod]#

                                          使其yaml文件生效;
                                            [root@node1 pod]# kubectl apply -f pod-volume.yaml -n dev
                                            pod/pod-volume created
                                            [root@node1 pod]# kubectl get pod -n dev -o wide
                                            NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
                                            pod-volume 2/2 Running 0 2m1s 192.168.112.131 node2 <none> <none>
                                            [root@node1 pod]#

                                            看下共享目录下文件内容是否有输出;
                                              [root@node2 ~]# cat /shared-volume-data/service.log 
                                              web-service starting~~~
                                              [root@node2 ~]#

                                              可以看到启动的时候是正常输出信息了,那么我们再停止一下看看是否能输出;
                                                [root@node1 pod]# kubectl delete -f pod-volume.yaml -n dev
                                                pod "pod-volume" deleted
                                                [root@node1 pod]#

                                                看下命令是否执行了呢;
                                                  [root@node2 ~]# cat /shared-volume-data/service.log 
                                                  web-service starting~~~
                                                  web-service stoping~~~
                                                  [root@node2 ~]#

                                                  至此,本文结束。
                                                  PS:创建了一个群,感兴趣的老板们加我下面的微信号,拉你入群,一起讨论技术哈,共同学习进步。


                                                  往期推荐

                                                  五分钟学会linux磁盘共享之nfs技术

                                                  01-docker系列-linux下的docker安装

                                                  linux搭建mongodb数据库副本集


                                                  文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                  评论