当前位置: 首页 > article >正文

Kubernetes第二天

1.pod运行一个容器

1.创建目录

mkdir -p /manifests/pod

2.编写pod资源清单文件

vim 01-myweb.yaml

说明:

apiVersion:指的是Api的版本

metadata:资源的元数据

spec:用户期望的资源的运行状态

status:资源实际的运行状态

由于拉取远程镜像失败,这里使用本地部署的harbor的镜像

3.创建pod资源清单

kubectl create -f  01-myweb.yaml

4.查看资源

kubectl get pods -o wide

2.pod运行多个容器

1.编写资源清单

vim 02-nginx-tomcat.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-tomcat
spec:
  containers:
  - name: nginx
    image: harbor.lxcedu.com/base-img/nginx:1.14.2
  - name: tomcat
    image: harbor.lxcedu.com/base-img/tomcat:9-jre8-alpine

2.创建资源清单

kubectl create -f 02-nginx-tomcat.yaml

3.此时可以运行以下命令查看状态

kubectl describe pod nginx-tomcat

结果如图,这里截取部分信息

这个命令可以查看pod构建的容器的信息。

此时的容器属于同一个pod,共享ip。

3.容器使用宿主机网络

容器使用宿主机网络,相当于"docker run --network host"

spec:
  # 使用宿主机网络,相当于"docker run --network host"
  hostNetwork: true

4.由于容器没有阻塞,导致容器一直重启引发的故障的解决办法

containers:
# 给容器分配一个标准输入,默认值为false
  # stdin: true
  # 给容器分配一个启动命令,修改Dockerfile的CMD指令
  # args: ["tail","-f","/etc/hosts"]
  # 也可以修改command字段,相当于修改Dockerfile的ENTRYPOINT指令
  # command: ["sleep","15"]
  # args也可以和command命令搭配使用,和Dockfile的ENTRYPOINT和CMD效果类似
  command:
  - "tail"
  args:
  - "-f"
  - "/etc/hosts"

5.一个资源清单文件运行两个pod

apiVersion: v1
kind: Pod
metadata:
  name: nginx-multiple01
spec:
  containers:
  - name: nginx
    image: harbor.lxcedu.com/base-img/nginx:1.14.2

---


apiVersion: v1
kind: Pod
metadata:
  name: nginx-multiple02
spec:
  containers:
  - name: nginx
    image: harbor.lxcedu.com/base-img/nginx:1.14.2

6.故障案例一

pod清单如图所示

从图中可以得到这pod运行在同一个节点(k8s232),同时都使用了宿主机网络,导致第二个容器启动失败

可以直观看到这两个容器是由于端口占用是的第二个容器启动失败(两个nginx容器都占用了宿主机的80端口),但是实际生产环境可能无法通过清单文件看出来,所以此时需要进入到第二个启动失败的容器进行排查。

步骤一:修改清单文件,让第二个pod的容器保持启动状态

步骤二:创建资源清单并进入容器

kubectl apply -f 04-nginx-nginx.yaml

进入pod,由于只有一个容器,此处不需要指定容器,默认连接第一个容器

kubectl  exec nginx-multiple02 -it -- sh    (i是标准输入,t分配一个终端)

开始排查:

如图可以看出配置文件正确,端口被占用。

7.故障案例二

pod清单如图所示

创建清单之后,发现容器一直处于重启状态

修改配置文件,进入容器查看问题

kubectl exec game03 -it -- sh

排查问题:

nginx发现没有消息提示

进入nginx配置文件,发现nginx配置文件没有server选项

添加server相关选项,发现nginx可以启动

查看entrypoint.sh文件,发现该文件是修改nginx子配置文件的脚本,但却未能执行

手动执行entrypoint.sh,重读nginx配置文件,发现nginx运行成功,且在浏览器可以看到对应的网页。

通过上述排查发现kubernetes加载容器时,没有执行entrypoint.sh

解决:重新书写Dockerfile,重新构建镜像

1.创建文件夹及文件

mkdir scripts

2.将Pod容器的文件拷贝到宿主机

kubectl cp game03:entrypoint.sh ./entrypoint.sh

kubectl cp game03:start.sh ./start.sh

将此两个文件合并,去掉错误部分(原配置文件有一个不必要的22端口占用),命名为start.sh,放在scripts目录中

编写Dockerfile

构建镜像打标签及推送镜像至本地harbor仓库

docker build --tag harbor.lxcedu.com/games/games:v0.5 .

docker push harbor.lxcedu.com/games/games:v0.5

8.一个pod多个容器连接指定容器

kubectl exec -it pod名 -c 容器名 -- sh

早期版本没有提示容器名,可以采取以下方式查看

1.直接查看资源清单文件

2.kubectl describe pod pod名

3.kubectl get pods pod名 -o yaml

9.查看日志相关

查看指定容器日志(以下例子nginx-tomcat是pod名)

kubectl logs -f nginx-tomcat -c nginx

加上时间戳

kubectl logs -f nginx-tomcat -c nginx --timestamps

显示近十分钟日志

kubectl logs -f nginx-tomcat -c nginx   --since=10m

查看一个pod上一个容器的日志,上一个挂掉的容器的日志

kubectl logs -c nginx  -p nginx-tomcat

使用kubectl logs无法查看日志的原因,及解决方法

使用kubectl logs查看的是容器的标准输出或标准错误输出的日志,如果要使用这种方式查看,需要将日志重定向到/dev/stdout或者/dev/stderr

解决办法:

创建软链接

ln -svf /dev/stdout /var/log/nginx/access.log

ln -svf /dev/stderr /var/log/nginx/error.log

10.拷贝本地文件到容器

kubectl cp ./dockerfile nginx-tomcat 

kubectl cp ./dockerfile -c tomcat nginx-tomcat

拷贝之后可以使用以下命令查看

kubectl exec nginx-tomcat -c tomcat -- ls -l

11.拷贝容器文件到本地

kubectl cp -c tomcat nginx-tomcat:/etc ./aa

12.容器的拉取策略

imagePullPolicy:Always(默认值)    本地镜像与远程镜像不同时,优先拉取远程镜像,

imagePullPolicy:IfNotPresent        本地镜像与远程镜像不同时,优先使用本地镜像

imagePullPolicy:Never                   只使用本地镜像


http://www.kler.cn/a/463638.html

相关文章:

  • ES IK分词器插件
  • Alist-Sync-Web 网盘自动同步,网盘备份相互备份
  • Scrum中敏捷项目经理(Scrum Master)扮演什么角色?
  • 嵌入式学习(21)-正点原子脱机下载器Mini-Pro的使用
  • OSPF特殊区域(open shortest path first LSA Type7)
  • Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace
  • JavaScript的diff库详解(示例:vue项目实现两段字符串比对标黄功能)
  • 一文读懂:区块链的原理、技术、应用领域
  • 大型语言模型在金融市场中的预测能力
  • [AI] 深度学习的“黑箱”探索:从解释性到透明性
  • 管理员登录 Ubuntu 图形界面失败
  • Windows提示错误wmvcore.dll缺失要怎么解决?
  • 【每日学点鸿蒙知识】初始化BigInt、包体积瘦身、Tabs嵌套Grid、老年化适配、Release打包失败
  • 【Oracle】数据库 安装与【Qt】驱动编译与连接
  • Navicat和MySQL的安装
  • 在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示
  • Linux之ARM(MX6U)裸机篇----4.C语言LED驱动实验
  • 基础的基础之 pillow与opencv相比的特点与优缺点比较
  • 【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集
  • 如何利用java爬虫获得AMAZON商品详情
  • 基于 Python 的人脸识别景区票务识别系统
  • 使用Qt中的模型视图框架
  • 【Rust自学】9.1. 不可恢复的错误以及panic!
  • 180天Java项目学习路线指引
  • 计算机毕设-基于springboot的花店管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • 低精度只适用于未充分训练的LLM?腾讯提出LLM量化的scaling laws