kubernetes概念-Pod基本概念

k8s中yaml配置

控制器模板配置
# 创建一个简单的模板
# --dry-run=client(只尝试运行,不实际创建,参数client在kubectl自己测试,参数server提交到k8s API测试)
[root@k8s-master1 ~]# kubectl create deployment web --image=nginx --dry-run=client -o yaml > deployment.yaml
# 编辑生成的文件
[root@k8s-master1 ~]# vim deployment.yaml
# 将不需要的配置去掉,改成如下的配置

在这里插入图片描述
效果就是这样
在这里插入图片描述
查看他们的标签
在这里插入图片描述

service模板配置
# 配置services
[root@k8s-master1 ~]# kubectl expose deployment web2 --port=80 --target-port=80 --type=NodePort --dry-run=client -o yaml > services.yaml
[root@k8s-master1 ~]# vim services.yaml

删除不需要的
在这里插入图片描述
在这里插入图片描述

卸载
# 卸载刚刚创建的资源
[root@k8s-master1 ~]# kubectl delete -f deployment.yaml 
deployment.apps "web2" deleted
[root@k8s-master1 ~]# kubectl delete -f services.yaml 
service "web2" deleted
整合
# 可以将这两个整合为一个yaml文件
[root@k8s-master1 ~]# cat deployment.yaml services.yaml > all.yaml
# 但是要注意格式,多个apiVersion之间使用---分割,不然只会创建最后一个apiVersion
# 生成
[root@k8s-master1 ~]# kubectl apply -f all.yaml 
deployment.apps/web2 created
service/web2 created

在这里插入图片描述

如果说在yaml文件中有写字段的单词忘记了,可以使用以下命令进行查找

小技巧
# 是可以一层一层 往下寻找
# 查看pods.spec.containers支持那些字段
kubectl explain pods.spec.containers
# 查看deployment支持那些字段
kubectl explain deployment

pod资源了解

部署一个应用涉及最常用的资源有三个(Pod、Deployment、Service)
这节说下Pod的概念

Pod基本概念
Pod的特点
  • 一个Pod可以理解为是一个应用实例,提供服务
  • Pod中容器始终部署在一个Node上
  • Pod中容器共享网络、存储资源
Pod资源共享实现机制

  在一组Pod中正常是可以有多组容器的,那么这些容器中如何进行资源交互的操作呢
  首先拿"日志采集"来说,日志监控可能需要读取容器中的日志文件,但是容器之间是具有隔离性的,那么如何实现这种方式呢,可以通过"Volume"(共享存储),将文件或目录通过数据卷共享数据的方式解决
  那么"服务监控"呢,可能需要调用一些服务接口,来进行监控,但是首先容器具有隔离性,我可以通过指定IP的方式进行接口的对接,但是如果容器重构呢?IP变化了难道需要从新修改么,这里面引用了Infra这个容器(这个容器通过kubectl get …是没有体现的),他就是这个Pod中独立的网络命名空间,而该Pod内的其他容器使用类似于docker中"–net=host"的方式,与该容器进行关联,也就是说,我采集业务容器的监控容器不需要在指定固定的IP了,直接通过本地循环+端口的形式来调取业务容器的IP(因为他们在同一个网络中,想想docker的–net=host模式)

Pod小实例

先来了解下Pod的基本使用命令
注:因为Pod中是有多个容器的,-c这个参数可以指定要查看或者进入的容器名称,例如有两个容器名称为web和nginx,我要进入nginx这个使用如下命令:
kubectl exec <Pod名称> -c nginx – bash

含义命令
创建Podkubectl apply -f pod.yaml 或 kubectl run nginx --image=nginx
查看Podkubectl get pods
查看详情kubectl describe pod <Pod名称>
查看日志kubectl logs <Pod名称> [-c CONTAINER] (可以加上 “-f” 进行实时输出)
进入容器终端kubectl exec -it <Pod名称> [-c CONTAINER] – bash
删除Podkubectl delete pod <Pod名称>
# 我们通过Pod的一个实例来验证下上面的解释
# 先生成一个yaml
[root@k8s-master1 ~]# kubectl run web3 --image=nginx --dry-run=client -o yaml > Pod.yaml

在这里插入图片描述
pod-test就是我创建的Pod,可以看到其中有两个容器
在这里插入图片描述
登录进去看看,来验证是否共用网络和路径是否挂载

# 现在nginx容器中创建一个index.html文件(因为我的nginx中没有默认页面)
[root@k8s-master1 ~]# kubectl exec -it pod-test -c web -- bash
root@pod-test:/# cd /usr/share/nginx/html/
root@pod-test:/usr/share/nginx/html# echo "aaa" > index.html
# 创建完成后去bs容器中wget下载这个页面,并查看(busybox没有bash,所以使用sh登录)
[root@k8s-master1 ~]# kubectl exec -it pod-test -c bs -- sh
/ # wget 127.0.0.1
/ # cat index.html 
# 可以看到是我刚刚创建的文件内容(这一点说明虽然是两个容器,但是他们共用着一个网络)
aaa
# 还可以通过netstat来查看
/ # netstat -antp
# 可以看出bs这个容器本地也是在监听80端口的,更一步证实了网络是共用的
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 :::80                   :::*                    LISTEN      -

重启策略+健康检查

重启策略
参数含义
Always当容器终止退出后,总是重启容器,默认策略
OnFailure当容器异常退出(退出状态码非0)时,才重启容器
Never当容器终止退出,从不重启容器
健康检查类型
参数含义
livenessProbe(存活检查)如果检查失败,将杀死容器,根据pod的restartPolicy来操作
readinessProbe(就绪检查)如果检查失败,kubernetes会把Pod从service endpoints中剔除
startupProbe(启动检查)检查成功才由存活检查接手,用于保护慢启动容器
支持检查的方法
参数含义
httpGet发送HTTP请求,返回200-400范围状态码为成功
exec执行Shell命令返回状态码是0为成功
tcpSocket发起TCP Socket建立成功
健康检查小案例
创建基本模板

先创建pod,编写好模板后apply生成即可
在这里插入图片描述

在这里插入图片描述

创建service模板,用来负载创建好的三个pod
在这里插入图片描述
在这里插入图片描述

验证

咱们从pod日志,ep状态,pod状态等方面来查看它实现的情况如何

分别实时输出这几个指标的情况
在这里插入图片描述
在这里插入图片描述
pod日志
在这里插入图片描述

开始模拟某个pod挂掉
在这里插入图片描述
首先就可以看到pod日志已经抛出403后退出(退出是因为重启策略生效了,Pod重建了,相当于重新部署了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环境变量

[root@k8s-master1 ~]# vim pod-env.yaml

这段内容是我在官网上荡下来改了下,地址
在这里插入图片描述

# 进入容器中进行验证(在yaml文件中设置的env变量都有体现出来)
[root@k8s-master1 ~]# kubectl exec -it pod-env -- sh
/ # env | grep MY
MY_POD_SERVICE_ACCOUNT=default
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.169.159
MY_NODE_NAME=k8s-node2
MY_POD_NAME=pod-env
/ # echo $ABC
123456

Init Container(初始化容器)

Init Container: 顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务

  • 支持大部分应用容器配置,但不支持健康检查
  • 优先应用容器执行

应用场景

  • 环境检查: 例如确保应用容器依赖的服务启动后在启动应用容器
  • 初始化配置:例如给应用容器准备配置文件

.这个初始化容器就可pod的辅助容器似的,在一个Pod中在启动一个容器用来辅助主业务
比如说业务容器需要引用一个文件或目录,可以通过init container容器来辅助实现(结合数据卷)

案例

部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取放到应用容器中(仅做参考用,实际环境不建议)

可以使用下面这个模板,或者使用官方提供的模板,在搜索中搜索initcontainer,地址如下地址,点开第一个即可
在这里插入图片描述
这个就表示在运行初始化容器,当初始化容器结束后,就会运行主业务的容器,并且他会退出,类似于一次任务,所以会看到和pod-test这个不通,他有两个容器一直在运行着
容器运行后可以正常访问下,会发现页面时百度的页面
在这里插入图片描述
注意,因为这个是一次性的,所以像健康检查什么的是不可以使用的

通过上述,我们知道了两种Pod的类型,initContainers和Containers
而还有一种容器,叫做"Infrastructure Container",这个呢是一个基础容器,你可以随便找一台k8s节点,使用这条命令查看下"docker ps | grep pause",这些都是up状态,这个在部署应用的时候根本就没有使用它,这个镜像就是"Infrastructure Container"启的镜像,它维护了一个网络的名命空间,好让其他网络加入进来,这个咱是不进行操作的

Pod中支持的几种类型容器我在总结下

Pod支持类型含义
Infrastructure Container基础容器,维护整个Pod网络空间
InitContainers初始化容器,先于业务容器开始执行
Containers业务容器,并行运行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值