前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes Pod基础

Kubernetes Pod基础

作者头像
kubernetes中文社区
发布2019-06-24 15:31:01
7050
发布2019-06-24 15:31:01
举报

一:Pod-资源对象概述

Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或者多个container组成的。

节点,Pod,容器之前的关系

二:Pod 特性:

2.1 资源共享

一个Pod里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如 namespace,cgroups或者其他的隔离资源。

多个容器共享同一个network namespace,由此在一个Pod里的多个容器共享Pod的IP和端口namespace,所以一个Pod内的多个容器之间可以通过localhost来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的Pod有不同的IP,不同Pod内的多个容器之前通信,不可以使用IPC(如果没有特殊指定的话)通信,通常情况下使用Pod的IP进行通信。

一个Pod里的多个容器可以共享存储卷,这个存储卷会被定义为Pod的一部分,并且可以挂载到该Pod里的所有容器的文件系统上。

2.2 生命周期短暂

Pod属于生命周期比较短暂的组件,比如,当Pod所在节点发生故障,那么该节点上的Pod会被调度到其他节点,但需要注意的是,被重新调度的Pod是一个全新的Pod,跟之前的Pod没有半毛钱关系。

2.3 平坦的网络

K8s集群中的所有Pod都在同一个共享网络地址空间中,也就是说每个Pod都可以通过其他Pod的IP地址来实现访问。

三:Pod-使用

核心原则是:将多个应用分散到多个Pod中

原因:基于资源的合理应用;扩缩容,不同应用应该有不同的扩缩容策略等。

如果容器之间不是必须运行在一起的话,那么就放到不同的Pod里

如果容器之前是相互独立的组件,那么就放到不同的Pod里

如果容器之前扩缩容策略不一样,那么就放到不同的Pod里

结论:单Pod单容器应用,除非特殊原因

四:Pod-创建

创建Pod可以使用两种方式,一种是通过命令行加各种命令行参数的方式,另一种是表单方式创建(推荐)。以下是一个创建Pod时的大概流程

# 流程:

1:kubectl 向K8s API发送一个REST HTTP请求

2:调度器将其调度到一个工作节点上

3:被调度的工作节点上的kubelet会告知Docker拉取镜像,下载后运行容器。

4.1 命令行加各种命令行参数的方式创建一个Pod

这里使用 luksa/kubia镜像(访问该镜像可以输出该容器的hostname)构建一个Pod

# 查看当前Pod资源

# pods的缩写是po,以下两个命令的作用是一样的。可以看到当前没有任何资源

代码语言:javascript
复制
kubectl get pods
No resources found.
kubectl get po
No resources found.

# 创建一个Pod资源

#--image 指定镜像名称,--port指定该容器的端口 --generator=run/v1 是指让k8s创建一个RC资源,而不是deployment资源,kubia是指RC的名称

代码语言:javascript
复制
kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1

# 再次查看Pod资源,一个叫kubia-v7mlq的Pod被运行起来了

# NAME:Pod的名称,REAY: 表示运行个数 前面的1表示正在运行的个数,后面的1表示总共要运行的个数, STATUS:表示状态 RESTARTS:表示被重启的次数, AGE:表示启动的时间。

代码语言:javascript
复制
kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
kubia-v7mlq   1/1     Running   0          14m

# 加入 –o wide参数看长信息

# NODE:运行该Pod的节点。IP:Pod的IP

代码语言:javascript
复制
kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE               NOMINATED NODE   READINESS GATES
kubia-v7mlq   1/1     Running   0          17m   10.244.1.6   k8s-worker-node1   <none>           <none>

# 查看Pod的详细信息(信息非常详细)

代码语言:javascript
复制
kubectl describe po kubia-v7mlq

4.2 表单方式创建一个Pod

# 认识以下表单方式对Pod的定义,使用之前已经创建好的Pod

代码语言:javascript
复制
kubectl get po kubia-v7mlq -o yaml
apiVersion: v1  # API版本
kind: Pod   # 表示资源类型
metadata:
  creationTimestamp: "2019-03-27T12:18:54Z"
  generateName: kubia-
  labels:
    run: kubia
  name: kubia-v7mlq
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicationController
    name: kubia
    uid: 6654b1f5-1276-11e9-9a4b-00163e00518c
  resourceVersion: "30073"
  selfLink: /api/v1/namespaces/default/pods/kubia-v7mlq
  uid: 66565269-1276-11e9-9a4b-00163e00518c
spec:
  containers:
  - image: luksa/kubia
    imagePullPolicy: Always
    name: kubia
..............

Yaml是一种可以对Pod定义的一种表单形式

对Pod资源定义主要分如下几个部分(其他资源对象一样)

1:API版本

2:资源类型,比如Pod资源

3:metadata:包括名称,名称空间,标签等

4:spec 关于Pod内容的实际规格说明,例如Pod的容器,卷及其他数据。

我们也可以通过命令行的方式查看具体怎么去定义

# 通过explain可以查看资源对象怎么进行定义

代码语言:javascript
复制
kubectl explain pods
kubectl explain pods.spec

这里我们创建一个Pod对象定义的yaml文件

代码语言:javascript
复制
cat kubia-manual.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

使用create –f 指定yaml文件的方式创建该Pod

代码语言:javascript
复制
kubectl create -f kubia-manual.yaml
pod/kubia-manual created
kubectl get po -o wide

也可以查看刚创建Pod的完成定义,如果没有在yaml指定,使用默认配置,如下

# 查看kubia-manual完整的yaml

代码语言:javascript
复制
kubectl get po kubia-manual -o yaml
# 也可以以json格式输出
kubectl get po kubia-manual -o json

Pod默认情况下只能在集群内部访问,外界无法访问,我们可以通过Service资源对象进行端口暴露,这里先使用另一种方法 端口转发

代码语言:javascript
复制
kubectl port-forward kubia-manual 8888:8080

访问以下试试 确实时我们创建的Pod

五:Pod-日志

容器日志在大于10M后会自动轮替,所以我们看到的是轮替后的日志,或者没有轮替的日志,即有可能不是完整的日志

代码语言:javascript
复制
kubectl logs kubia-manual

# 如果Pod有多个容器时,查看某个容器的日志时需要加参数-c

代码语言:javascript
复制
kubectl logs kubia-manual -c kubia

六:Pod-标签

标签是一种可以附加到任意资源的任意键值对,是对资源的一种分类,一个资源可以有多个标签,比如对Pod资源进行分类。创建资源的时候可以顺带将标签创建,也可以创建资源后再贴标签,也可以对资源的现有标签进行修改

比如如下标签

app: 指定Pod输入哪个应用

rel:指定Pod运行的应用版本时stable,beta,。。。

6.1: 创建资源时贴标签

# 给Pod贴两个标签 create_method env

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels:
    create_method: manual
    env: prod
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

创建Pod

代码语言:javascript
复制
kubectl create -f kubia-manual-with-labels.yaml

查看Pod的标签

# 默认不显示标签

代码语言:javascript
复制
[root@k8s-master-node1 pods]# kubectl get po

# 使用 –show-labels

代码语言:javascript
复制
kubectl get po --show-labels

# 查看标签的值

代码语言:javascript
复制
kubectl get po -L create_method,env

6.2 在已有资源上创建标签

比如我们给kubia-manual 也贴一个create_method manual

代码语言:javascript
复制
kubectl label po kubia-manual create_method=manual

查看当前label情况

代码语言:javascript
复制
kubectl get pods --show-labels
kubectl get pods -L create_method,env

6.3 对现有标签进行修改

# 将kubia-manual-v2 Pod的env标签值改为debug 需要使用—overwrite

代码语言:javascript
复制
kubectl label po kubia-manual-v2 env=debug –overwrite 

6.4 通过标签筛选Pod子集

通常情况下标签跟标签选择器放在一起使用,使用标签选择器通过标签能筛选出Pod子集,然后做必要的操作

1:包含(不包含)使用特定键的标签

2:包含特定键和值的标签

3:包含指定键,但其值与我们指定的不同

例子:包含指定键和值的标签Pod

代码语言:javascript
复制
kubectl get po -l create_method=manual

例子:查看包含标签env的所有Pod(无论env的值是什么)

代码语言:javascript
复制
kubectl get po -l env

例子:选择不含env标签的Pod

代码语言:javascript
复制
kubectl get po -l '!env'

6.5 对Node贴标签

代码语言:javascript
复制
kubectl label node k8s-worker-node1 env=prod 

# 筛选

代码语言:javascript
复制
kubectl get nodes -l env=prod

有的时候我们需要将某些应用调度到指定的服务器集上,可以通过node的标签进行调度,例如

代码语言:javascript
复制
cat kubia-node.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubia-node
spec:
  nodeSelector:
    env: "prod"
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

七:Pod-注解

注解跟标签一样也是键值对,所不同的是我们可以使用标签选择器并根据标签对对象进行分组,注解没有这样的功能。

通过给对象添加注解,可以有效的为维护集群人员迅速的提供必要的信息,比如我们可以给对象添加创建对象的人员姓名的注解啊等等。

7.1 查找某对象的注解

代码语言:javascript
复制
kubectl annotate pod kubia-v7mlq commond/maintainer="wangys"

7.2 添加及修改注解

代码语言:javascript
复制
kubectl get po.tolerations kubia-v7mlq -o yaml

八:命名空间

K8s命名空间为对象提供了一个作用域,比如说我们可以将生产,开发,QA环境进行分组,然后通过该名称空间资源进行资源进行分组。

在查看资源对象时,如果不指定命名空间,默认时在default的命名空间下查找的

尽管命名空间将对象分隔到不同的组中,只允许你对属于指定命名空间的对象操作,但实际上命名空间并不提供对正在运行的对象的任何隔离,也就是说不同命名空间之间的Pod可以通过IP进行通讯,是否有网络隔离效果取决于使用的k8s网络方案。

8.1 查看命名空间

# namespace的缩写是ns,有default kube-pulic kube-system命名空间

代码语言:javascript
复制
kubectl get namespace

8.2 查看指定命名空间下的资源

查看其他命名空间的Pod资源对象

代码语言:javascript
复制
kubectl get po -n kube-public
kubectl get po -n kube-system

我们可以看到在kube-system命名空间中k8s控制平面的各组件以Pod的方式运行。其实也好理解,因为这些组件比较重要,需要跟用户的default命名空间分开,这样就不会担心用户的误操作将重要组件删除或者致命操作。

8.3 创建命名空间

命名空间也时K8s资源对象的一种,我们可以通过手动或者清单方式创建

清单方式创建

创建一个custom-namespace,下面时该命名空间的清单

代码语言:javascript
复制
cat custom-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace

创建

代码语言:javascript
复制
kubectl create -f custom-namespace.yaml

命令行创建

代码语言:javascript
复制
kubectl create ns custom-namespace-1

8.4 创建资源时选定指定的命名空间

8.4.1 命令行方式

代码语言:javascript
复制
kubectl create -f kubia-manual.yaml -n custom-namespace

在查看资源时前者时在default命名空间里查看Pod资源,后者是指定custom-namespace命名空间来查看Pod资源,两个Pod的名称一样。

8.4.2 通过清单文件的方式创建

代码语言:javascript
复制
cat kubia-manual-namespace.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
  namespace: custom-namespace-1
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

创建

代码语言:javascript
复制
kubectl create -f kubia-manual-namespace.yaml

三个命名空间里都有同名的kubia-manual

九:Pod-删除

在删除Pod的过程中,其实是K8s向进程他送了一个SIGTERM信号,随后等待一定的时间(默认为30s),如果该Pod没有及时关闭,K8s会发送SIGKILL终止该进程。

9.1 通过Pod的名称删除Pod

代码语言:javascript
复制
kubectl delete po kubia-node
pod "kubia-node" deleted 

在通过指定名称删除Pod的时候,我们可以指定多个Pod进行删除

9.2 使用标签选择器删除Pod

这两个Pod具有相同的标签,我们可以通过标签选择器删除他们

代码语言:javascript
复制
kubectl delete po -l create_method=manual

9.3 通过删除命名空间来删除Pod

代码语言:javascript
复制
kubectl delete ns custom-namespace

9.4 删除名称空间下的Pod资源,但是不删除命名空间

# --all指对应Pod的所有资源实例全部删除

代码语言:javascript
复制
kubectl delete po --all
pod "kubia-v7mlq" deleted
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kubernetes中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:Pod-资源对象概述
  • 二:Pod 特性:
    • 2.1 资源共享
      • 2.2 生命周期短暂
        • 2.3 平坦的网络
        • 三:Pod-使用
        • 四:Pod-创建
          • 4.1 命令行加各种命令行参数的方式创建一个Pod
            • 4.2 表单方式创建一个Pod
            • 五:Pod-日志
            • 六:Pod-标签
              • 6.1: 创建资源时贴标签
                • 6.2 在已有资源上创建标签
                  • 6.3 对现有标签进行修改
                    • 6.4 通过标签筛选Pod子集
                      • 6.5 对Node贴标签
                      • 七:Pod-注解
                        • 7.1 查找某对象的注解
                          • 7.2 添加及修改注解
                          • 八:命名空间
                            • 8.1 查看命名空间
                              • 8.2 查看指定命名空间下的资源
                                • 8.3 创建命名空间
                                  • 8.4 创建资源时选定指定的命名空间
                                    • 8.4.1 命令行方式
                                    • 8.4.2 通过清单文件的方式创建
                                • 九:Pod-删除
                                  • 9.1 通过Pod的名称删除Pod
                                    • 9.2 使用标签选择器删除Pod
                                      • 9.3 通过删除命名空间来删除Pod
                                        • 9.4 删除名称空间下的Pod资源,但是不删除命名空间
                                        相关产品与服务
                                        容器服务
                                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档