kubernetes中的Pod简述与实践

  1. Pod的概念
    详细的Pod解释可参考k8s官网,关于Pod的概念主要有以下几点:
    (1)Pod是kubernetes中你可以创建和部署的最小也是最简的单位。一个Pod代表着集群中运行的一个进程;
    (2)在Kubrenetes集群中Pod的使用方式;
    (3)Pod中如何管理多个容器
  2. 理解Pod
    上面已经说了“Pod是kubernetes中你可以创建和部署的最小也是最简的单位。一个Pod代表着集群中运行的一个进程。”Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubernetes中应用的一个实例,可能由一个或者多个容器组合在一起共享资源。
    #说明
    Docker是kubernetes中最常用的容器运行时,但是Pod也支持其他容器运行时。

    #容器进行时,看参考如下文章或博客:
    (1)解密容器运行时
    (2)Kubernetes(k8s)容器运行时(CRI)简介
    (3)容器运行时接口、容器网络接口、容器存储接口解析

  3. Kubrenetes集群中Pod的两种使用方式之一
    一个Pod中运行一个容器。
    “每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
    #实战
    ##创建一个nginx容器的可以定义为:
    cat pod1-deployment
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-test
    namespace: test
    labels:
    app: web
    spec:
    containers:
    - name: front-end
    image: nginx:1.7.9
    ports:
      - containerPort: 80
    #创建pod
    kubectl create -f pod1-deployment --namespace=test
    pod "nginx-test" created
    #查看pod
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    nginx-test                    1/1       Running   0          1m
    #查看pod详细情况
    kubectl describe po nginx-test --namespace=test
    Name:         nginx-test
    Namespace:    test
    Node:         swarm1/10.0.0.38
    Start Time:   Thu, 17 May 2018 17:33:50 +0800
    Labels:       app=web
    Annotations:  <none>
    Status:       Running
    IP:           10.244.2.131
    Containers:
    front-end:
    Container ID:   docker://5af319b84acfa076ac8500f39c81ff05e6664e6562d9593f5c7ba2fde0118372
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://[email protected]:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 17 May 2018 17:34:07 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)
            ...
            ...
    #进入到pod(容器)内部
    kubectl exec -it nginx-test  /bin/bash --namespace=test
    [email protected]:/# nginx -v
    nginx version: nginx/1.7.9
    ##说明
    kubectl exec
    这条命令是对docker exec命令的包装,可以让你执行容器内部的命令,如果pod中只有一个容器在运行则此命令可以作用在pod上如:
    kubectl exec -it [pod] /bin/bash。
    我们可以使用如下命令来进入一个运行中的pod:
    kubectl exec -it [pod name] --/bin/bash,
    -i:用来启动标准输入流STDIN
    -t:将输入流定向到TTY(伪终端)中
    -c [container-name]:一个Pod中启动了多个容器,使用该参数来进入特定的容器中。
  4. Kubrenetes集群中Pod的两种使用方式之二
    在一个Pod中同时运行多个容器。
    一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位——一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
    #实战
    ##在一个pod里放置两个容器:nginx与redis
    cat test-deployment
    apiVersion: v1
    kind: Pod
    metadata:
    name: rss-site
    namespace: test
    labels:
    app: web
    spec:
    containers:
    - name: front-end
    image: nginx:1.7.9
    ports:
      - containerPort: 80
    - name: rss-reader
    image: dockerhub.com/redis:3.2.8
    ports:
      - containerPort: 88

    ##说明:文档中“ image: dockerhub.com/redis:3.2.8”并不是真实的,如有需要请自行去下载!

    #创建pod
    kubectl create -f test-deployment --namespace=test
    pods "rss-site"created
    #查看pod
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    rss-site                      2/2       Running   0          2h
    #查看pod详细情况
    kubectl describe po rss-site  --namespace=test
    Name:         rss-site
    Namespace:    test
    Node:         swarm1/10.0.0.38
    Start Time:   Thu, 17 May 2018 16:31:57 +0800
    Labels:       app=web
    Annotations:  <none>
    Status:       Running
    IP:           10.244.2.130
    Containers:
    front-end:
    Container ID:   docker://adb8115e7a559b0680a0a8bc79c4f535f1c6b8227acdb25f406c41bc7a29ac3c
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://[email protected]:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 17 May 2018 16:32:20 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)
    rss-reader:
    Container ID:   docker://19e642c9bfa2fe2c5161ea015ea02c0470eb360744df452a28f975f81acce30a
    Image:          dockerhub.datagrand.com/global/redis:3.2.8
    Image ID:       docker-pullable://dockerhub.datagrand.com/global/[email protected]:de7a70c04bb2de36bb32c44fe26ce92b9715922f80e07cb3f25aaf00a1f49bb5
    Port:           88/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 17 May 2018 16:32:24 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-z4ffx (ro)
    #分别进入pod(容器)内部
    ##进入front-end
    kubectl exec -it rss-site  -c front-end /bin/bash --namespace=test
    [email protected]:/# nginx -v
    nginx version: nginx/1.7.9
    #进入rss-reade
    kubectl exec -it rss-site  -c rss-reader  /bin/bash --namespace=test
    [email protected]:/data#

    ##说明
    在一个Pod中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如下图所示:

  5. Pod资源
    Pod中可以共享两种资源:网络和存储。
    (1)网络
    每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
    (2)存储
    可以Pod指定多个共享的Volume。Pod中的所有容器都可以访问共享的volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。
  6. 使用Pod
    你很少会直接在kubernetes中创建单个Pod。因为Pod的生命周期是短暂的,用后即焚的实体。当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。
    ##说明
    (1)重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。
    (2)Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。
  7. Pod和Controller
    Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。
    具体的实例可参考:创建和管理多个Pod--Deployment

原文地址:http://blog.51cto.com/wutengfei/2117648

时间: 2024-10-07 15:52:03

kubernetes中的Pod简述与实践的相关文章

kubernetes中网络报错问题

系统环境 #系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) #kubelet版本 kubelet --version Kubernetes v1.10.0 #selinux状态 getenforce Disabled #系统防火墙状态 systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loade

实用干货:Kubernetes中的负载均衡全解

很多企业在部署容器的时候都会选择Kubernetes作为其容器编排系统.这是对Kubernetes的可靠性,灵活性和特性广泛的肯定.在这篇文章中,我们将对Kubernetes如何处理一个非常常见且必要的工作--负载均衡,进行深入的解读.在许多非容器环境(即服务器之间的均衡)中,负载均衡是一个相对简单的任务,但当涉及到容器时,就需要一些其他的.特殊的处理. 管理容器 要理解Kubernetes的负载均衡,首先需要了解Kubernetes是如何组建容器的. 容器通常用来执行特定的服务或者一组服务,因

Kubernetes中,通过Service访问Pod快速入门

一.背景 理想状态下,我们可以认为Kubernetes Pod是健壮的.但是,理想与现实的差距往往是非常大的.很多情况下,Pod中的容器可能会因为发生故障而死掉.Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性.众所周知,每个Pod都拥有自己的IP地址,当新的Controller用新的Pod替代发生故障的Pod时,我们会发现,新的IP地址可能跟故障的Pod的IP地址可能不一致.此时,客户端如何访问这个服务呢?Kubernetes中的Service应运而生

Kubernetes中Pod间共享内存方案

摘要:一些公共服务组件在追求性能过程中,与业务耦合太紧,造成在制作基础镜像时,都会把这些基础组件都打包进去,因此当业务镜像启动后,容器里面一大堆进程,这让Kubernetes对Pod的管理存在很大隐患.为了让业务容器瘦身,更是为了基础组件自身的管理更独立和方便,将基础组件从业务镜像中剥离并DaemonSet容器化部署.然而一些基础组件Agent与业务Pod之间通过共享内存的方式进行通信,同一Node中跨Pod的共享内存方案是首先要解决的问题. 为什么要将公共基础组件Agent进行DaemonSe

第三章 pod:运行于kubernetes中的容器

本章内容涵盖 创建. 启动和停止 pod 使用标签组织 pod 和其他资源 使用特定标签对所有 pod 执行操作 使用命名空间将多个 pod 分到不重叠的组中 调度 pod 到指定类型的工作节点 上一章 已经大致介绍了在 Kubemetes 中创建的基本组件,包括它们的基本功 能概述. 那么接下来我们将更加详细地介绍所有类型的 Kubemetes 对象(或资源), 以便你理解在何时. 如何及为何要使用每一个对象. 其中 pod 是 Kubemetes 中最为 重要的核心概念,而其他对象仅仅是在管

Kubernetes中,两种常见类型的Volume深度实践

一.背景 存储资源在所有计算资源中扮演着十分重要的角色,大部分业务场景下都有可能使用到各类存储资源.在Kubernetes中,系统通过Volume对集群中的容器动态或静态提供存储资源.通常情况下,我们可以认为容器或者Pod的生命周期时短暂的,当容器被销毁时,容器内部的数据也同时被清除.为了持久化保存容器的数据,Kubernetes引入了Volume,类似于Docker的Volume(Docker also has a concept of volumes, though it is somewh

Kubernetes中Namespace与Pod

一.Namespace 1)Namespace概述 Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组.常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace. Namespace常用来隔离不同的用户,比如Kubernetes自带的服务一般运行在kub

Kubernetes中强制删除Pod、namespace

Kubernetes中强制删除Pod.namespace 解决方法 可使用kubectl中的强制删除命令 # 删除POD kubectl delete pod PODNAME --force --grace-period=0 # 删除NAMESPACE kubectl delete namespace NAMESPACENAME --force --grace-period=0 若以上方法无法删除,可使用第二种方法,直接从ETCD中删除源数据 # 删除default namespace下的pod

Kubernetes中的Secret配置

  Secret 概览 Secret 是一种包含少量敏感信息例如密码.token 或 key 的对象.这样的信息可能会被放在 Pod spec 中或者镜像中:将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险. 用户可以创建 secret,同时系统也创建了一些 secret. 要使用 secret,pod 需要引用 secret.Pod 可以用两种方式使用 secret:作为 volume中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 p