k8s中pod的基本概念以及pod内资源共享的分析与实现

目录

pod基本概念:

pod的主要用法

pod资源共享实现机制

pod网络共享测试案例:

存储共享

pod存储共享测试案例:

pod管理命令

常用的pod管理命令

定义pod


pod基本概念:

      pod是一个逻辑抽象概念,他是kuberneter创建的最小单元,一个pod可以由一个或者多个容器组成
pod特点:
     1、一个pod可以理解为一个应用实例,提供服务
      2、一个pod中的容器始终在一个node上
      3、一个pod中可以共享网络、存储资源
我们可以抽象的将一个pod看作像一个豌豆荚,一个豌豆荚中可有多个豌豆。
k8s中pod的基本概念以及pod内资源共享的分析与实现_第1张图片

pod的主要用法

     pod主要有两种用法,分别为单容器用法与多容器用法
     运行单个容器:这是个常用方式,在这种使用上pod可以看作是单个容器的抽象封装
     运行多个容器: 这种属于边车模式(Sidecar) ,通过再Pod中定义专门容器,来执行主业务容器需要的辅助工作,这样好处是将辅助功能同主业务容器解耦,实现独立发布和能力重用。例如: 日志监控、应用监控()
k8s中pod的基本概念以及pod内资源共享的分析与实现_第2张图片
       所以,在边车模式下,我们可以不去修改主容器代码的情况下去给他新增例如日志监控和应用监控这类功能,增加程序耦合性,而这些功能的实现,则涉及到pod的资源共享:网络共享与存储共享

pod资源共享实现机制

网络共享
     pod的网络共享是默认的。每一个pod都有一个Infra Container容器,这个容器我们称之为网络容器,他负责一个pod内的所有容器的网络共享
k8s中pod的基本概念以及pod内资源共享的分析与实现_第3张图片
所以,在一个pod中,所有容器的网络是共享的,即在多容器中,我们的辅助容器可能会有通过端口来访问主容器的需求,但每个容器在每次重启都会启动不同的ip,但因为网络共享,我们在复制容器中可以用127.0.0.1的ip来访问主容器的服务,

pod网络共享测试案例:

导出一个基础pod的yaml
kubectl run pod1 --image=nginx -o yaml --dry-run=client > pod.yaml
修改一个这个测试yaml如下
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  containers:
  - image: nginx  # 主容器
    name: web
  - image: busybox  # 辅助容器
    name: test
    command: ['/bin/sh','-c','sleep 24h']
运行此yaml
kubectl apply -f pod.yaml
查看是否创建成功
kubectl get pods
k8s中pod的基本概念以及pod内资源共享的分析与实现_第4张图片
进入辅助容器busybox容器
kubectl exec -it pod1 -c test -- sh
k8s中pod的基本概念以及pod内资源共享的分析与实现_第5张图片
我们进入辅助容器,能看到,容器内未运行进程,但在端口监听上有80端口
通过wget命令下载127.0.0.1:80端口文件,发现这是个nginx首页文件
wget 127.0.0.1:80
cat index.html
k8s中pod的基本概念以及pod内资源共享的分析与实现_第6张图片
此时我们重新进入到主容器web容器中
kubectl exec -it pod1 -c web -- bash
我们将123注入到主容器的index.html
重新进入辅助容器test,并下载127.0.0.1:80端口的文件打开,发现内容变成了123
k8s中pod的基本概念以及pod内资源共享的分析与实现_第7张图片
由此测试可以看出,在一个pod中,网络是共享的,每个容器都可以通过127.0.0.1ip访问到同一pod中其他容器的端口
查看网络共享容器
通过命令我们查看到刚才创建的pod在node1节点上
kubectl get pods -o wide
在node1上通过过滤查看所有pod1中运行的容器
docker ps |grep pod1
我们发现,通过命令我们看到三个容器,但刚刚创建pod时只创建了两个容器,这组容器中这个pause:3.6容器即是一个pod中负责共享网络的容器,这个容器是每个pod创建之初默认也创建的

存储共享

      与网络共享不同,pod内的存储共享不是默认的。他是需要在pod的yaml文件去设置的。通过创建数据卷的方式

pod存储共享测试案例:

修改一个测试yaml,如下
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod2
  name: pod2
spec:
  containers:
  - image: nginx  # 主容器
    name: web
    volumeMounts:
    - name: log
      mountPath: /usr/share/nginx/html
  - image: busybox  # 辅助容器
    name: test
    command: ['/bin/sh','-c','sleep 24h']
    volumeMounts: # 数据卷挂载
    - name: log # 指定挂载的数据卷名称
      mountPath: /data # 数据卷挂载到容器中的路径
  volumes: # 定义数据卷
  - name: log # 数据卷名称
    emptyDir: {} # 数据卷类型
这里,我们是创建了一个叫log的共享目录,将它分别挂载到了busybox的/data目录与nginx的/usr/share/nginx/html目录,实现这两个目录的共享
执行yaml
kubectl apply -f pod2.yaml
查看pod2已经执行成功
k8s中pod的基本概念以及pod内资源共享的分析与实现_第8张图片
进入pod2的web容器
kubectl exec -it pod2 -c web -- bash
在 web容器的/usr/share/nginx/html中创建一个a.html
退出并进入到test容器
kubectl exec -it pod2 -c test -- sh
查看data下文件,发现在web容器中创建的文件被同步到test容器中的/data下
此即为pod存储共享案例, 与网络共享不同,存储共享非默认的配置,需要在yaml文件中单独新建并配置

pod管理命令

常用的pod管理命令

创建Pod:
kubectl apply -f pod.yaml
或者使用命令
kubectl run nginx --image=nginx
 查看Pod:
kubectl get pods 
kubectl describe pod
查看日志:
kubectl logs [-c CONTAINER] 
kubectl logs [-c CONTAINER] -f
进入容器终端:
kubectl exec -it [-c CONTAINER] -- bash
删除Pod:
kubectl delete pod

定义pod

apiVersion: v1 
kind: Pod 
metadata:
  name: my-pod 
spec:
  containers:
  - name: container1
    image: nginx
  - name: container2
    image: centos
pod一共有三种类型容器
• Infrastructure Container:基础容器
 • 维护整个Pod网络空间 
• InitContainers:初始化容器 
• 先于业务容器开始执行 
• Containers:业务容器 
• 并行启动

你可能感兴趣的:(k8s,k8s-pod,kubernetes,运维开发,运维)