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 只使用本地镜像