一、 pod简介

1. pod概览

Pod是kubernetes中你可以创建和部署的最小也是最简单位。一个Pod代表着集群中运行的一个进程。

Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubernetes中应用的一个实例,可能由一个或者多个容器组合在一起共享资源

在Kubrenetes集群中Pod有如下两种使用方式:

一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法:在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。

在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位——一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

2. pod网络

由于一个pod中的容器运行于相同的Network命名空间中,因此它们共享相同的IP地址和端口空间。当两个pod彼此之间发送网络数据包时,它们都会将对方的实际IP地址看作数据包中的源IP。

pod 是逻辑主机,其行为与非容器世界中的物理主机或虚拟机非常相似。此外,运行在同一个pod中的进程与运行在同一物理机或虚拟机上的进程相似,只是每个进程都封装在一个容器之中。

二、创建pod的两种方式

1. 命令方式

[root@master ~]# kubectl run kubia --image=luksa/kubia --replicas=3

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

deployment.apps/kubia created

kubia指定deployment名字(本文pod的创建不论命令还是文件方式都使用Controller deployment),--image=luksa/kubia显示的是指定要运行的镜像,--replicas=3指定副本数为3

先创建deployment:nginx-deployment,再创建replicasets:kubia-66c8b6d4fc,最后创建三个pod:kubia-66c8b6d4fc-cdzzg、kubia-66c8b6d4fc-ff9f8和kubia-66c8b6d4fc-xtcmm,3个pod分别位于3个node节点上。

2. 文件方式

[root@master ~]# more nginx-master.yaml

apiVersion: extensions/v1beta1 #描述文件遵循extensions/v1beta1版本的Kubernetes API

kind: Deployment #创建资源类型为Deployment

metadata: #该资源元数据

name: nginx-master #Deployment名称

spec: #Deployment的规格说明

replicas: 3 #指定副本数为3

template: #定义Pod的模板

metadata: #定义Pod的元数据

labels: #定义label(标签)

app: nginx #label的key和value分别为app和nginx

spec: #Pod的规格说明

containers:

- name: nginx #容器的名称

image: nginx:latest #创建容器所使用的镜像

执行创建命令

[root@master ~]# kubectl create -f nginx-master.yaml

deployment.extensions/nginx-master created

查看创建的资源

3. 进入pod

进入pod kubia-66c8b6d4fc-cdzzg

[root@master ~]# kubectl exec -it kubia-66c8b6d4fc-cdzzg bash

类似docker,使用kubectl exec命令进入容器

容器的ip和主机名同pod

三、标签

标签其实就一对 key/value,可以附加到资源的任意键值对,标签可以用来划分特定组的对象,用以选择具有该确切标签的资源。

1. pod使用标签

pod指定标签

[root@master ~]# kubectl run http-label --image=httpd --labels="app=web,env=prod"

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

deployment.apps/http-label created

指定pod的标签为'app=web和env=prod'

查看pod的标签

[root@master ~]# kubectl get pod --show-labels

通过--show-labels参数可查看pod的标签

通过标签筛选pod

[root@master ~]# kubectl get pod -l app --show-labels

NAME READY STATUS RESTARTS AGE LABELS

http-label-7cf498876f-rhqxf 1/1 Running 0 107s app=web,env=prod,pod-template-hash=7cf498876f

nginx-master-9d4cf4f77-cg47g 1/1 Running 1 46h app=nginx,pod-template-hash=9d4cf4f77

nginx-master-9d4cf4f77-lflck 1/1 Running 1 46h app=nginx,pod-template-hash=9d4cf4f77

nginx-master-9d4cf4f77-w4xgb 1/1 Running 1 46h app=nginx,pod-template-hash=9d4cf4f77

通过-l app参数可筛选所有标签为app的pod

修改现有标签

[root@master ~]# kubectl label pod http-label-7cf498876f-rhqxf env=debug --overwrite

pod/http-label-7cf498876f-rhqxf labeled

将pod http-label-7cf498876f-rhqxf的标签env由prod更改为debug

删除标签

[root@master ~]# kubectl label pod http-label-7cf498876f-rhqxf env-

pod/http-label-7cf498876f-rhqxf labeled

将pod http-label-7cf498876f-rhqxf的标签env删除

2. 通过标签指定pod创建的节点

给node节点打标签

分别给节点打上标签node=master、node=node01、node=node02

指定node创建pod

[root@master ~]# more httpd-node.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: httpd-node

spec:

template:

metadata:

labels:

env: prod

spec:

containers:

- name: httpd-node

image: httpd:latest

nodeSelector:

node: master

[root@master ~]# kubectl apply -f httpd-node.yaml

指定pod的label为env:prod,node节点为master

四、命名空间

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default)

1. 查看命名空间

[root@master ~]# kubectl get ns

NAME STATUS AGE

default Active 37d

kube-node-lease Active 46h

kube-public Active 37d

kube-system Active 37d

其中命名空间kube-node-lease发布于1.14的beta版本,被kubelet用作确定节点运行状况。

2. 查看指定命名空间的pod

[root@master ~]# kubectl get po -n kube-system

NAME READY STATUS RESTARTS AGE

busybox03-5b4cb76f96-jg8f8 1/1 Running 4 5d22h

coredns-fb8b8dccf-bxvrz 1/1 Running 24 37d

coredns-fb8b8dccf-mqvd8 1/1 Running 24 37d

etcd-master 1/1 Running 26 37d

fluentd-elasticsearch-928nt 1/1 Running 21 29d

fluentd-elasticsearch-gw5tx 1/1 Running 30 29d

fluentd-elasticsearch-n4mc6 1/1 Running 26 29d

kube-apiserver-master 1/1 Running 26 37d

kube-controller-manager-master 1/1 Running 31 37d

kube-flannel-ds-amd64-lkh5n 1/1 Running 30 35d

kube-flannel-ds-amd64-pv5ll 1/1 Running 24 36d

kube-flannel-ds-amd64-wnn5g 1/1 Running 36 36d

kube-proxy-42vb5 1/1 Running 26 37d

kube-proxy-7nrfk 1/1 Running 30 35d

kube-proxy-x7dmk 1/1 Running 35 36d

kube-scheduler-master 1/1 Running 32 37d

kubernetes-dashboard-7b87f5bdd6-7d5s8 1/1 Running 4 5d18h

该命令也可写作为:'kubectl get pod --namespace=kube-system'

3. 创建命名空间

文件方式

创建test01-namespace

[root@master ~]# more test01-namespace.yaml

apiVersion: v1

kind: Namespace

metadata:

name: test01-namespace

[root@master ~]# kubectl apply -f test01-namespace.yaml

namespace/test01-namespace created

kubectl apply和kubectl create命令类似,都可以根据文件创建相关资源。

命令方式

创建test02-namespace

[root@master ~]# kubectl create ns test02-namespace

namespace/test02-namespace created

4. pod指定命名空间

[root@master ~]# kubectl run httpd --image=httpd -n test01-namespace

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

deployment.apps/httpd created

[root@master ~]# kubectl get pod -o wide -n test01-namespace

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

httpd-6b77d6648-zqnv4 0/1 ContainerCreating 0 27s node01

指定创建pod的命名空间为test01-namespace,查询pod是需带上命名空间。

命名空间切换

[root@master ~]# alias kcd='kubectl config set-context $(kubectl config current-context) --namespace'

[root@master ~]# kcd test01-namespace

Context "kubernetes-admin@kubernetes" modified.

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

httpd-6b77d6648-zqnv4 1/1 Running 0 5m6s

配置kcd,通过kcd namespace可切换命名空间。

五、扩容/缩容

创建文件nginx-scale.yaml并新建资源

新建deployment nginx-scale,pod副本数为3

文件方式

通过修改文件中参数replicas的值并重新执行kubectl apply命令即可实现pod的扩缩容

命令方式

[root@master ~]# kubectl scale deployment nginx-scale --replicas=1

deployment.extensions/nginx-scale scaled

通过命令将pod副本数缩容为1

六、failover

1. pod节点分布查看

2. failover测试

节点node02关机

[root@node02 ~]# init 0

查看node状态和pod分布

node02状态为NotReady且之前在该节点的pod被迁移至master或者node01

当node02恢复后,运行在该节点的Pod会被删除,且迁移至master和node01的Pod不会重新调度回到node02

注意,本节有个前提:所有pod需绑定到replication controller上,'裸奔的 pod'(没有绑定到任何replication controller)不会被重新调度

七、升级及回滚

1. 创建deployment

[root@master ~]# more nginx-roll.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-roll

namespace: test02-namespace

spec:

selector:

matchLabels:

env: prod

replicas: 3

template:

metadata:

labels:

env: prod

spec:

containers:

- name: nginx-roll

image: nginx:1.16

[root@master ~]# kubectl apply -f nginx-roll.yaml --record

deployment.apps/nginx-roll created

创建deployment nginx-roll,副本数为3,namespace为test02-namespace,nginx版本为1.16,--record参数会记录历史版本号

Deployment apiVersion版本说明:

1.6版本之前 apiVsersion:extensions/v1beta1

1.6版本到1.9版本之间:apps/v1beta1

1.9版本之后:apps/v1

查看部署状态

[root@master ~]# kubectl rollout status deployment -n test02-namespace nginx-roll

Waiting for deployment "nginx-roll" rollout to finish: 0 of 3 updated replicas are available...

Waiting for deployment "nginx-roll" rollout to finish: 1 of 3 updated replicas are available...

Waiting for deployment "nginx-roll" rollout to finish: 2 of 3 updated replicas are available...

deployment "nginx-roll" successfully rolled out

查看pod

分别查看deployment、replicaset、pod

2. 升级

升级方式有多种,比如'kubectl edit deployments -n test02-namespace nginx-roll'方式、直接修改nginx-roll.yaml文件方式、kubectl set image方式等

修改文件方式

[root@master ~]# sed -i 's/image: nginx:1.16/image: nginx:1.17/g' nginx-roll.yaml

[root@master ~]# kubectl apply -f nginx-roll.yaml --record

deployment.apps/nginx-roll configured

将nginx-roll.yaml中nginx镜像版本修改为1.17并重新执行kubectl apply命令

nginx升级为1.17

kubectl set image方式

[root@master ~]# kubectl set image deployment -n test02-namespace nginx-roll nginx-roll=nginx:1.17.1

deployment.extensions/nginx-roll image updated

将nginx升级至1.17.1

3. 回滚

查看deployments版本

[root@master ~]# kubectl rollout history deployments -n test02-namespace nginx-roll

deployment.extensions/nginx-roll

REVISION CHANGE-CAUSE

1 kubectl apply --filename=nginx-roll.yaml --record=true

2 kubectl apply --filename=nginx-roll.yaml --record=true

3 kubectl apply --filename=nginx-roll.yaml --record=true

查看deployment具体版本信息

回滚至上一个版本

[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll

deployment.extensions/nginx-roll rolled back

回滚至指定版本

[root@master ~]# kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revision=1

deployment.extensions/nginx-roll rolled back

--to-revision=1指定回滚至1.16版本的nginx

查看ReplicasSet

可以看到在升级过程中replicaset保留了修改的历史版本信息

八、内外网访问

1. 创建pod

[root@master ~]# more web-svc.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: web-svc

namespace: test02-namespace

spec:

selector:

matchLabels:

app: web-svc

replicas: 3

template:

metadata:

labels:

app: web-svc

spec:

containers:

- name: web-svc

image: httpd:latest

[root@master ~]# kubectl apply -f web-svc.yaml

deployment.apps/web-svc created

创建pod,namespace为test02,副本数为3

2. 内网访问

创建servcie

内网通过pod ip访问没什么太大意义,因为pod会随时重建,每次ip会随机分配

[root@master ~]# cat >> web-svc.yaml << EOF

---

apiVersion: v1

kind: Service

metadata:

name: web-svc

namespace: test02-namespace

spec:

selector:

app: web-svc

ports:

- protocol: TCP

port: 8080

targetPort: 80

> EOF

[root@master ~]# kubectl apply -f web-svc.yaml

deployment.apps/web-svc unchanged

service/web-svc created

查看创建的service

[root@master ~]# kubectl get service -n test02-namespace

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

web-svc ClusterIP 10.106.53.114 8080/TCP 5m12s

修改index.html

[root@master ~]# kubectl get po -o wide -n test02-namespace

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nginx-roll-8fd7f679-9h9ng 1/1 Running 2 2d17h 10.244.1.52 node01

nginx-roll-8fd7f679-b5clj 1/1 Running 2 2d17h 10.244.0.180 master

nginx-roll-8fd7f679-pwkbw 1/1 Running 2 2d17h 10.244.2.6 node02

web-svc-58956c55fc-7vnw5 1/1 Running 0 3m35s 10.244.1.59 node01

web-svc-58956c55fc-8wbst 1/1 Running 0 3m35s 10.244.2.14 node02

web-svc-58956c55fc-nxt4r 1/1 Running 0 3m35s 10.244.2.13 node02

[root@master ~]# kubectl exec -it web-svc-58956c55fc-7vnw5 -n test02-namespace bash

root@web-svc-58956c55fc-7vnw5:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF

> web-svc-58956c55fc-7vnw5

> EOF

root@web-svc-58956c55fc-7vnw5:/usr/local/apache2# exit

exit

[root@master ~]# kubectl exec -it web-svc-58956c55fc-8wbst -n test02-namespace bash

root@web-svc-58956c55fc-8wbst:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF

> web-svc-58956c55fc-8wbst

> EOF

root@web-svc-58956c55fc-8wbst:/usr/local/apache2# exit

exit

[root@master ~]# kubectl exec -it web-svc-58956c55fc-nxt4r -n test02-namespace bash

root@web-svc-58956c55fc-nxt4r:/usr/local/apache2# cat > /usr/local/apache2/htdocs/index.html << EOF

> web-svc-58956c55fc-nxt4r

> EOF

root@web-svc-58956c55fc-nxt4r:/usr/local/apache2# exit

分别进入pod,将访问的主页修改为pod名

内网访问pod

[root@master ~]# for i in {1..10};do sleep 1;curl 10.98.103.41:8080;done

web-svc-58956c55fc-8wbst

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-8wbst

web-svc-58956c55fc-8wbst

通过service内容访问pod

3. 外网访问

修改servcie

apiVersion: v1

kind: Service

metadata:

name: web-svc

namespace: test02-namespace

spec:

type: NodePort

selector:

app: web-svc

ports:

- protocol: TCP

nodePort: 30002

port: 8080

targetPort: 80

新增'type: NodePort'和'nodePort: 30002',通过NodePort方式外网访问pod,映射端口为30002,重新kubectl apply

外网访问pod

[root@master ~]# for i in {1..10};do sleep 1;curl 172.27.9.131:30002;done

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-8wbst

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-8wbst

web-svc-58956c55fc-7vnw5

web-svc-58956c55fc-nxt4r

web-svc-58956c55fc-7vnw5

通过node ip + nodePort方式外网访问pod

九、日志查看

使用kubectl logs命令可获取pod日志

1. 查看最近的日志

[root@master ~]# kubectl logs kubernetes-dashboard-7b87f5bdd6-m62r6 -n kube-system --tail=20

'--tail=20':查看命名空间kube-system下kubernetes-dashboard-7b87f5bdd6-m62r6最近20行的日志,

2. 查看前一个容器的日志

[root@master ~]# kubectl logs kubernetes-dashboard-7b87f5bdd6-m62r6 -n kube-system --previous

'--previous':当容器重启时,该参数可以查看前一个容器的日志。

3. 通过标签查看日志

[root@master ~]# kubectl logs -lapp=web

查看标签为'app=web'的日志

'-lapp=web'该日志是标签为'app=web'的合集

十、删除pod

1. 通过删除deployment删除pod

通过deployment创建的pod可以直接删除deployment

[root@master ~]# kubectl delete deployments kubia

deployment.extensions "kubia" deleted

2. 通过删除namespace删除pod

删除namespace中所有资源

[root@master ~]# kubectl delete all --all -n test02-namespace

直接删除namespace

[root@master ~]# kubectl delete ns test01-namespace

总结:

直接删除pod会重建一个新的不同名的pod;

直接删除replicasets会重建同名replicasets,其下所有pod则会删除重建且名字不同;

直接删除deployments则其下的replicasets和pod将一起被删除;

转自https://www.toutiao.com/a6798896814020887052/?timestamp=1583280974&app=news_article&group_id=6798896814020887052&req_id=2020030408161301001404009326C90FD3

喜欢这篇文章?欢迎打赏~~

k8s查找所有pod_k8s---pod常用操作相关推荐

  1. java 字符查找 截断_java字符串常用操作(查找、截取、分割)

    public class 字符串常用操作 { public static void main(String[] args) { /* * 查找子串 */ String str1="dwqae ...

  2. pod概念及常用操作

    pod概念及常用操作 pod概念:什么是pod init容器(初始化容器) pause容器(Infra容器) 修改默认infro容器 普通pod: pod资源限制: pod生命周期介绍 Pending ...

  3. Kubernetes(k8s)常用资源的使用、Pod的常用操作

    1.K8s是如何运行容器的. 答:k8s是通过定义一个Pod的资源,然后在Pod里面运行容器的.K8s最小的资源单位Pod. 2.如何创建一个Pod资源呢? 答:在K8s中,所有的资源单位都可以使用一 ...

  4. k8s、ServiceAccount权限详解、RBAC 详解(基于角色的访问控制),常用操作指令

    文章目录 Service Account应用示例 RBAC 详解(基于角色的访问控制) 创建一个角色(role)---权限 实验二 常用操作指令 Service Account应用示例 概念图权限关系 ...

  5. 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...

  6. Python3 - k8s之深入理解 Pod

    Python3 - k8s之深入理解 Pod 文章目录 Python3 - k8s之深入理解 Pod 一. 静态 Pod 1.1 配置文件 1.2 通过 HTTP 创建静态 Pods 1.3 静态po ...

  7. k8s资源清单和Pod

    k8s资源清单和Pod 1 资源清单-介绍和常用字段 1.1 K8s中的资源分类 1.2 YAML格式 1.3 YAML数据类型 1.4 常用字段的解释 2.资源清单-容器的生命周期解析 2.1 Po ...

  8. 用Python轻松搞定Excel中的20个常用操作

    来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...

  9. 20180929 VIM进入编辑模式、VIM命令模式常用操作

    2019独角兽企业重金招聘Python工程师标准>>> vim进入编辑模式方式 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 a 在当前字符后插入 A 在光标所在行的 ...

  10. UITableView取消选中颜色、常用操作

    UITableView取消选中颜色.常用操作 使用空白view取代cell - (UITableViewCell *)tableView:(UITableView *)tableView cellFo ...

最新文章

  1. 15 位学神争霸!2019 清华本科生特奖答辩入围名单公布
  2. 计算机查找文件的速度,如何快速搜索文件_怎么加快电脑里的文件搜索速度
  3. python的薪资待遇-Python的就业薪资具体多少?发展前景到底如何?
  4. OpenCV检测ArUco标记
  5. nginx的gzip压缩
  6. 深入解读Linux进程调度系列(3)——调度的执行过程
  7. 【低代码平台浅析】钉钉宜搭
  8. 揭秘AI创业江湖里的“师徒帮”:同门师兄弟搭档 导师坐镇后方
  9. 我的团长我的团分集剧情介绍
  10. ArcHydroTools 10.5版本的安装与使用(附下载链接与教程)
  11. Nand2Tetris Project1
  12. c语言数组判断不及格人数,C语言编程 运用数组求不及格人数
  13. 一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最大的一颗?
  14. 美团校招年薪35万!老员工薪资倒挂,如何应对?
  15. 中电海康校招面试数据存储与处理事业部
  16. Vscode配置Vue插件Vetur自动补全和Eslint校验,正在保存“index.vue”: 从 “‘ESLint‘, ‘Vetur‘“ (configure)中获取代码操作
  17. 魔法少女 LJJ——线段树
  18. Flex Programming Tricks 1
  19. Google Play发布android app
  20. 就离谱!使用机器学习预测2022世界杯:小组赛挺准,但冠亚季军都错了 ⛵

热门文章

  1. Python框架:Django写图书管理系统(LMS)
  2. 软件已删除,但在控制面板里还有,就是删不掉.怎么办?
  3. 计算机中c语言的应用特点,计算机中C语言的应用特点分析
  4. 再说《提督的决断4》
  5. Android 快速修复功能,安卓系统修复工具(ReiBoot for Android)v2.1.0免费版
  6. 使用mongoTemplate进行Aggregation聚合查询
  7. spring的IOC类图
  8. 数据挖掘实践 —— OneR 分类算法
  9. Android back按键基础开发
  10. debian linux 7 安装,Debian 7安装设置教程