K8s-Pod
一: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,以下两个命令的作用是一样的。可以看到当前没有任何资源
[root@k8s-master-node1 ~]# kubectl get pods No resources found. [root@k8s-master-node1 ~]# kubectl get po No resources found.
# 创建一个Pod资源
#--image 指定镜像名称,--port指定该容器的端口 --generator=run/v1 是指让k8s创建一个RC资源,而不是deployment资源,kubia是指RC的名称
[root@k8s-master-node1 ~]# kubectl run kubia --image=luksa/kubia --port= --generator=run/v1
# 再次查看Pod资源,一个叫kubia-v7mlq的Pod被运行起来了
# NAME:Pod的名称,REAY: 表示运行个数 前面的1表示正在运行的个数,后面的1表示总共要运行的个数, STATUS:表示状态 RESTARTS:表示被重启的次数, AGE:表示启动的时间。
[root@k8s-master-node1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE kubia-v7mlq / Running 14m
# 加入 –o wide参数看长信息
# NODE:运行该Pod的节点。IP:Pod的IP
[root@k8s-master-node1 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubia-v7mlq / Running 17m 10.244.1.6 k8s-worker-node1 <none> <none>
# 查看Pod的详细信息(信息非常详细)
[root@k8s-master-node1 ~]# kubectl describe po kubia-v7mlq
4.2 表单方式创建一个Pod
# 认识以下表单方式对Pod的定义,使用之前已经创建好的Pod
[root@k8s-master-node1 ~]# kubectl get po kubia-v7mlq -o yaml apiVersion: v1 # API版本 kind: Pod # 表示资源类型 metadata: creationTimestamp: "2019-01-07T12: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--11e9-9a4b-00163e00518c resourceVersion: "" selfLink: /api/v1/namespaces/default/pods/kubia-v7mlq uid: --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可以查看资源对象怎么进行定义
[root@k8s-master-node1 ~]# kubectl explain pods [root@k8s-master-node1 ~]# kubectl explain pods.spec
这里我们创建一个Pod对象定义的yaml文件
[root@k8s-master-node1 pods]# cat kubia-manual.yaml apiVersion: v1 kind: Pod metadata: name: kubia-manual spec: containers: - image: luksa/kubia name: kubia ports: - containerPort: protocol: TCP
使用create –f 指定yaml文件的方式创建该Pod
[root@k8s-master-node1 pods]# kubectl create -f kubia-manual.yaml pod/kubia-manual created [root@k8s-master-node1 pods]# kubectl get po -o wide
也可以查看刚创建Pod的完成定义,如果没有在yaml指定,使用默认配置,如下
# 查看kubia-manual完整的yaml
[root@k8s-master-node1 pods]# kubectl get po kubia-manual -o yaml # 也可以以json格式输出 [root@k8s-master-node1 pods]# kubectl get po kubia-manual -o json
Pod默认情况下只能在集群内部访问,外界无法访问,我们可以通过Service资源对象进行端口暴露,这里先使用另一种方法 端口转发
[root@k8s-master-node1 pods]# kubectl port-forward kubia-manual :
访问以下试试 确实时我们创建的Pod
五:Pod-日志
容器日志在大于10M后会自动轮替,所以我们看到的是轮替后的日志,或者没有轮替的日志,即有可能不是完整的日志
[root@k8s-master-node1 pods]# kubectl logs kubia-manual
# 如果Pod有多个容器时,查看某个容器的日志时需要加参数-c
[root@k8s-master-node1 pods]# kubectl logs kubia-manual -c kubia
六:Pod-标签
标签是一种可以附加到任意资源的任意键值对,是对资源的一种分类,一个资源可以有多个标签,比如对Pod资源进行分类。创建资源的时候可以顺带将标签创建,也可以创建资源后再贴标签,也可以对资源的现有标签进行修改
比如如下标签
app: 指定Pod输入哪个应用
rel:指定Pod运行的应用版本时stable,beta,。。。
6.1: 创建资源时贴标签
# 给Pod贴两个标签 create_method env
apiVersion: v1 kind: Pod metadata: name: kubia-manual-v2 labels: create_method: manual env: prod spec: containers: - image: luksa/kubia name: kubia ports: - containerPort: protocol: TCP
创建Pod
[root@k8s-master-node1 pods]# kubectl create -f kubia-manual-with-labels.yaml
查看Pod的标签
# 默认不显示标签
[root@k8s-master-node1 pods]# kubectl get po
# 使用 –show-labels
[root@k8s-master-node1 pods]# kubectl get po --show-labels
# 查看标签的值
[root@k8s-master-node1 pods]# kubectl get po -L create_method,env
6.2 在已有资源上创建标签
比如我们给kubia-manual 也贴一个create_method manual
[root@k8s-master-node1 pods]# kubectl label po kubia-manual create_method=manual
查看当前label情况
[root@k8s-master-node1 pods]# kubectl get pods --show-labels
[root@k8s-master-node1 pods]# kubectl get pods -L create_method,env
6.3 对现有标签进行修改
# 将kubia-manual-v2 Pod的env标签值改为debug 需要使用—overwrite
[root@k8s-master-node1 pods]# kubectl label po kubia-manual-v2 env=debug –overwrite
6.4 通过标签筛选Pod子集
通常情况下标签跟标签选择器放在一起使用,使用标签选择器通过标签能筛选出Pod子集,然后做必要的操作
1:包含(不包含)使用特定键的标签
2:包含特定键和值的标签
3:包含指定键,但其值与我们指定的不同
例子:包含指定键和值的标签Pod
[root@k8s-master-node1 pods]# kubectl get po -l create_method=manual
例子:查看包含标签env的所有Pod(无论env的值是什么)
[root@k8s-master-node1 pods]# kubectl get po -l env
例子:选择不含env标签的Pod
[root@k8s-master-node1 pods]# kubectl get po -l '!env'
6.5 对Node贴标签
[root@k8s-master-node1 pods]# kubectl label node k8s-worker-node1 env=prod
# 筛选
[root@k8s-master-node1 pods]# kubectl get nodes -l env=prod
有的时候我们需要将某些应用调度到指定的服务器集上,可以通过node的标签进行调度,例如
[root@k8s-master-node1 pods]# cat kubia-node.yaml apiVersion: v1 kind: Pod metadata: name: kubia-node spec: nodeSelector: env: "prod" containers: - image: luksa/kubia name: kubia ports: - containerPort: protocol: TCP
七:Pod-注解
注解跟标签一样也是键值对,所不同的是我们可以使用标签选择器并根据标签对对象进行分组,注解没有这样的功能。
通过给对象添加注解,可以有效的为维护集群人员迅速的提供必要的信息,比如我们可以给对象添加创建对象的人员姓名的注解啊等等。
7.1 查找某对象的注解
7.2 添加及修改注解
[root@k8s-master-node1 ~]# kubectl annotate pod kubia-v7mlq commond/maintainer="wangys" [root@k8s-master-node1 ~]# kubectl get po.tolerations kubia-v7mlq -o yaml
八:命名空间
K8s命名空间为对象提供了一个作用域,比如说我们可以将生产,开发,QA环境进行分组,然后通过该名称空间资源进行资源进行分组。
在查看资源对象时,如果不指定命名空间,默认时在default的命名空间下查找的
尽管命名空间将对象分隔到不同的组中,只允许你对属于指定命名空间的对象操作,但实际上命名空间并不提供对正在运行的对象的任何隔离,也就是说不同命名空间之间的Pod可以通过IP进行通讯,是否有网络隔离效果取决于使用的k8s网络方案。
8.1 查看命名空间
# namespace的缩写是ns,有default kube-pulic kube-system命名空间
[root@k8s-master-node1 ~]# kubectl get namespace
8.2 查看指定命名空间下的资源
查看其他命名空间的Pod资源对象
[root@k8s-master-node1 ~]# kubectl get po -n kube-public [root@k8s-master-node1 ~]# kubectl get po -n kube-system
我们可以看到在kube-system命名空间中k8s控制平面的各组件以Pod的方式运行。其实也好理解,因为这些组件比较重要,需要跟用户的default命名空间分开,这样就不会担心用户的误操作将重要组件删除或者致命操作。
8.3 创建命名空间
命名空间也时K8s资源对象的一种,我们可以通过手动或者清单方式创建
清单方式创建
创建一个custom-namespace,下面时该命名空间的清单
[root@k8s-master-node1 pods]# cat custom-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: custom-namespace
创建
[root@k8s-master-node1 pods]# kubectl create -f custom-namespace.yaml
命令行创建
[root@k8s-master-node1 pods]# kubectl create ns custom-namespace-
8.4 创建资源时选定指定的命名空间
8.4.1 命令行方式
[root@k8s-master-node1 pods]# kubectl create -f kubia-manual.yaml -n custom-namespace
在查看资源时前者时在default命名空间里查看Pod资源,后者是指定custom-namespace命名空间来查看Pod资源,两个Pod的名称一样。
8.4.2 通过清单文件的方式创建
[root@k8s-master-node1 pods]# cat kubia-manual-namespace.yaml apiVersion: v1 kind: Pod metadata: name: kubia-manual namespace: custom-namespace- spec: containers: - image: luksa/kubia name: kubia ports: - containerPort: protocol: TCP
创建
[root@k8s-master-node1 pods]# kubectl create -f kubia-manual-namespace.yaml
三个命名空间里都有同名的kubia-manual
8.5 快速切换命名空间
九:Pod-删除
在删除Pod的过程中,其实是K8s向进程他送了一个SIGTERM信号,随后等待一定的时间(默认为30s),如果该Pod没有及时关闭,K8s会发送SIGKILL终止该进程。
9.1 通过Pod的名称删除Pod
[root@k8s-master-node1 ~]# kubectl delete po kubia-node pod "kubia-node" deleted
在通过指定名称删除Pod的时候,我们可以指定多个Pod进行删除
9.2 使用标签选择器删除Pod
这两个Pod具有相同的标签,我们可以通过标签选择器删除他们
[root@k8s-master-node1 ~]# kubectl delete po -l create_method=manual
9.3 通过删除命名空间来删除Pod
[root@k8s-master-node1 ~]# kubectl delete ns custom-namespace
9.4 删除名称空间下的Pod资源,但是不删除命名空间
# --all指对应Pod的所有资源实例全部删除
[root@k8s-master-node1 ~]# kubectl delete po --all pod "kubia-v7mlq" deleted
Pod定义文件详解
K8s-Pod的更多相关文章
- k8s pod的4种网络模式最佳实战(externalIPs )
[k8s]k8s pod的4种网络模式最佳实战(externalIPs ) hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...
- k8s pod节点调度及k8s资源优化
一.k8s pod 在节点间调度控制 k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建.当需要在指定pod运行在某个节点上时,可以通过以下几种方式: ...
- kubectl cp 从k8s pod 中 拷贝 文件到本地
请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...
- k8s Pod的自动水平伸缩(HPA)
我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...
- k8s pod访问不通外网问题排查
环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...
- 2.k8s.Pod生命周期,健康检查
#Pod生命周期,健康检查 pod创建过程 Init容器 就绪探测 存活探测 生命周期钩子 #Pod创建过程 master节点:kubectl -> kube-api -> kubenle ...
- k8s pod,pvc,pv无法删除问题
注意步骤: 一般删除步骤为:先删pod再删pvc最后删pv 但是遇到pv始终处于“Terminating”状态,而且delete不掉 pod一直删不掉 [root@hadoop01 nacos-k8s ...
- k8s pod时区更改
一.问题所在 在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0.例如中国客户在UTC8.如果不把容器的时区和主机主机设置为一致,则在查找日志等时候将 ...
- 深入掌握K8S Pod
k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...
- 混沌工程之ChaosToolkit使用之一删除K8s POD
今天我们来玩一下混沌工程的开源工具chaostoolkit . 它的目标是提供一个免费,开放,社区驱动的工具集以及api. 官方源码链接:https://github.com/chaostoolkit ...
随机推荐
- [转] ElasticSearch 常用的查询过滤语句
备忘remark https://www.cnblogs.com/ghj1976/p/5293250.html query 和 filter 的区别请看: http://www.cnblogs.co ...
- 老师博客copy
新闻 管理 Py西游攻关之基础数据类型 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频 ...
- ipconfig命令查ip的时候给别人看有危险吗
知识源:Unit 4: Networking 1 4.1 Networking 1 The Routing of a Packet 网址:https://www.baidu.com/link?url ...
- 【Linux】CentOS7.0下安装JDK环境
写在前面:此次试验是在CentOS7上面安装的,亲测成功. 所需工具:JDK1.8安装包,xftp 具体步骤: 1,首先使用xftp连接到自己的虚拟机,然后查看是否有"/usr/java/j ...
- http://nancyfx.org + ASPNETCORE
商务产品servicestack: https://servicestack.net/ http://nancyfx.org + ASPNETCORE http://nancyfx.org ...
- python3+selenium入门03-操作谷歌浏览器
操作谷歌浏览器同样也需要下载相应的driver插件,官网下载.也可以从我的网盘下载,不过可能不是最新的,网盘地址.打开谷歌浏览器的操作和火狐的差不过. from selenium import web ...
- codeforces 38G - Queue splay伸展树
题目 https://codeforces.com/problemset/problem/38/G 题意: 一些人按顺序进入队列,每个人有两个属性,地位$A$和能力$C$ 每个人进入时都在队尾,并最多 ...
- css3时钟
参考资料: 奇舞团: http://www.75team.com/archives/851 DEMO:demo 截图: 代码: <!DOCTYPE html> <html lang= ...
- MySQL的连接数
我使用的数据库,没有针对其进行其他相关设置,最近经常出现连接异常,现象为太多的连接. MySQL查看最大连接数和修改最大连接数 1.查看最大连接数(可通过show variables查看其他的全局参数 ...
- CF 313B
题意: 给你一个字符串, 然后m次区间查询,求出区间有多少组 str[i] == str[i+1] 就是一个水DP了 有则Dp[i] = Dp[i-1] 无则 Dp[i] = Dp[i-1]: (刚开 ...