一个Pod运行单个容器案例:
(1)编写资源清单
mkdir -pv /oldboyedu/manifests/pod && cd /oldboyedu/manifests/pod
cat > 01-pod-nginx.yaml <<'EOF'
# 部署的资源类型
kind: Pod
# API的版本号
apiVersion: v1
# 元数据信息
metadata:
# 资源的名称
name: oldboyedu-linux82-web
# 自定义Pod资源的配置
spec:
# 定义容器相关信息
containers:
# 定义容器的名称
- name: linux82-web
# 定义容器基于哪个镜像启动
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
EOF
(2)创建资源
kubectl create -f 01-pod-nginx.yaml
(3)查看Pod资源
kubectl get pods
kubectl get pods -o wide # 主要查看IP地址
相关字段说明:
NAME
代表的是资源的名称。
READY
代表资源是否就绪。比如 0/1 ,表示一个Pod内有一个容器,而且这个容器还未运行成功。
STATUS
代表容器的运行状态。
RESTARTS
代表Pod重启次数,即容器被创建的次数。
AGE
代表Pod资源运行的时间。
IP
代表Pod的IP地址。
NODE
代表Pod被调度到哪个节点。
其他:
"NOMINATED NODE和"READINESS GATES"暂时先忽略哈。
Pod资源的增删查:
1)创建资源
kubectl create -f 01-pod-nginx.yaml
若资源不存在则创建,若资源已存在则创建失败,报错。
kubectl apply -f 01-pod-nginx.yaml
若资源不存在则创建,若资源已存在则不做任何处理。【推荐使用】
kubectl apply -f .
创建当前目录下的所有yaml资源清单。
2)删除资源
kubectl delete -f 01-pod-nginx.yaml
基于文件的方式删除资源。
kubectl delete po oldboyedu-linux82-web
将名为“oldboyedu-linux82-web”的Pod资源删除。
kubectl delete all --all
删除default名称空间下的所有资源。
kubectl delete -f .
删除当前目录下的所有yaml资源清单。
3)查看Pod资源
kubectl get pods
查看所有pods的基础信息。
kubectl get po -o wide
查看所有Pod的IP地址和NODE节点。
kubectl get po oldboyedu-linux82-web
查看名为“oldboyedu-linux82-web”的Pod资源。
kubectl get po oldboyedu-linux82-web -o wide
查看名为“oldboyedu-linux82-web”的IP地址细腻。
kubectl get po oldboyedu-linux82-web -o yaml
查看名为“oldboyedu-linux82-web”的Pod配置文件。
查看K8S集群支持的资源:
kubectl api-resources
各字段说明:
NAME
资源的名称。
SHORTNAMES
资源的简称,短名称。
APIGROUP
该资源属于哪个API组。
NAMESPACED
该资源属于哪个名称空间。
KIND
资源的类型。
查看K8S各个字段的作用:
kubectl explain pods.spec.containers.image
kubectl explain po.spec.containers.image
kubectl explain po.spec.containers.ports.hostIP
字符串。直接写字符串。
整数。直接写数字。
Pod资源标签配置:
[[email protected] po]# cat 04-pods-labels.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-labels
labels:
school: oldboyedu
class: linux82
address: www.oldboyedu.com
spec:
nodeName: k8s152.oldboyedu.com
hostNetwork: true
containers:
- name: xiaobawang
image: k8s151.oldboyedu.com:5000/oldboyedu-games/xiaobawang:v0.1
[[email protected] po]#
声明式API:
基于配置文件管理资源。
响应式API:
基于命令行的方式管理资源。
标签管理:
1.查看Pods标签
kubectl get po --show-labels
2.修改Pod标签
2.1 基于声明式方式修改【修改配置文件后需要应用后才能生效。推荐使用,方便迁移。】
kubectl apply -f 04-pods-labels.yaml
2.2 基于响应式方式修改【立刻生效,测试时使用】
kubectl label po oldboyedu-linux82-labels hobby-
删除一个名为hobby的标签。
kubectl label po oldboyedu-linux82-labels class- address-
删除class和address对应的标签。
kubectl label po oldboyedu-linux82-labels class=linux82 address=ShaHe
创建多个标签。
kubectl label po oldboyedu-linux82-labels --overwrite school=oldboyedu-2022
修改已存在的标签。
扩展:
kubectl get no --show-labels
查看nodes节点的标签信息。
kubectl label nodes --all school=oldboyedu
给所有的nodes节点打标签。
kubectl label nodes k8s151.oldboyedu.com school-
将"k8s151.oldboyedu.com"节点的school的KEY进行删除。
故障排查相关命令: - describe
kubectl describe -f 04-pods-labels.yaml
查看某个资源清单文件创建资源的的详细信息。
kubectl describe pods oldboyedu-linux82-games
查看名称为"oldboyedu-linux82-games"的Pod信息。
kubectl describe pod/oldboyedu-linux82-nginx-alpine
查看名称为"oldboyedu-linux82-nginx-alpine "的Pod信息。
故障排查相关命令: - exec
kubectl exec oldboyedu-linux82-labels -- ls -l
查看容器的根路径文件。
kubectl exec oldboyedu-linux82-labels -it -- sh
连接到容器进行操作,和docker优点类似。
kubectl exec oldboyedu-linux82-nginx-alpine -itc linux82-alpine -- sh
指定连接到"oldboyedu-linux82-nginx-alpine"Pod的"linux82-alpine"容器内。
当一个Pod有多个容器时,我们可以指定链接到哪个容器,通过"-c"选项。
故障排查相关命令: - cp
kubectl cp kube-flannel.yml -c linux82-web oldboyedu-linux82-nginx-alpine:/usr/share/nginx/html/
将本地文件拷贝到"oldboyedu-linux82-nginx-alpine"的Pod内"linux82-web"容器的"/usr/share/nginx/html/"路径。
kubectl cp kube-flannel.yml oldboyedu-linux82-nginx-alpine:/usr/share/nginx/html/oldboyedu.html
将本地文件拷贝到"oldboyedu-linux82-nginx-alpine"的Pod的"/usr/share/nginx/html/oldboyedu.html"路径(若是文件则会进行重命名)。
kubectl cp oldboyedu-linux82-nginx-alpine:/usr/share/nginx/html/50x.html -c linux82-web ./test/2222
将容器的文件拷贝到宿主机。
kubectl cp oldboyedu-linux82-nginx-alpine:/usr/share/nginx/html/ -c linux82-web ./test/
将容器的目录拷贝到宿主机
故障排查相关命令: - logs
kubectl logs -f --timestamps oldboyedu-linux82-nginx-alpine -c linux82-web --since=30m
查看最近30分钟之内产生的日志信息。
kubectl logs -f --timestamps oldboyedu-linux82-nginx-alpine -c linux82-web --since-time=2022-09-06T09:16:15.150295607Z
查看指定的某个时间点到当前时间的所有日志。
常见选项说明:
-f:
实时查看日志内容。
--timestamps:
查看时间戳信息。
-c:
指定容器。
--since:
指定查看某个时间范围内的日志。比如说最近20分钟的日志。
--since-time:
指定某个时间点到当前时间所有的日志。
启动容器的指令command和args:
[[email protected] po]# cat 05-pods-command-args.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-args-command-005
spec:
nodeName: k8s152.oldboyedu.com
containers:
- image: k8s151.oldboyedu.com:5000/oldboyedu-games/huangjinkuanggong:v0.1
name: huangjinkuangong
- name: xiaobawang
image: k8s151.oldboyedu.com:5000/oldboyedu-games/xiaobawang:v0.1
# 相当于Dockerfile的ENTRYPOINT指令
# command:
# - tail
# - -f
# - /etc/hosts
# 相当于Dockerfile的CMD指令
# args:
# - sleep
# - "3600"
# 当command和args联合使用时,args将作为参数传递给command
# command:
# - tail
# - -f
# args:
# - /etc/hosts
# 对于字符串数组也支持下面的写法
command: ["tail"]
args: ["-f","/etc/hosts"]
[[email protected] po]#
常见的报错:
ErrImagePull:
报错原因:
通常情况下是由于没有去往目标镜像对应主机的路由。
解决方案:
检查镜像名称是否指定正确。
ImagePullBackOff:
报错原因:
镜像拉取失败。
解决方案:
上传镜像。
CrashLoopBackOff:
报错原因:
Pod内有容器未正常启动。
解决方案:
基本上都是镜像的问题,比如说无法阻塞等情况,请检查镜像。
今日内容回顾:
- Pod:
是K8S集群部署的最小单元。
一个Pod内可以有多个容器,Pod的网络基础镜像是:"registry.aliyuncs.com/google_containers/pause:3.1"
- 常用的命令
- kubectl create
- kubectl apply
- kubectl delete
- kubectl get
- kubectl describe
- kubectl logs
- kubectl cp
- kubectl exec
- kubectl explain
- 资源清单文件的编写:
apiVersion:
kind:
metadata:
name:
labels:
spec:
nodeName:
hostNetwork:
containers:
- name:
image:
stdin:
args:
command: