2.k8s-概念和基本操作
·
Kubernetes Pod概念详解
Pods概念
Pod是K8S集群调度的最小单元
- Pod分别包含:基础容器、初始化容器、业务容器
命令行操作
获取master组件
kubectl get cs
kubectl get cs -o wide
查看worker组件
kubectl get no
kubectl get no -o wide
查看k8s内置的资源
kubectl api-resources
查看pod列表及其详细信息
kubectl get po
kubectl get po -o wide
删除pod
kubectl delete po <pod_name>
kubectl delete po --all
创建pod
kubectl run xiuxian --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
kubectl set image po xiuxian xiuxian=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
查看pod资源状态
kubectl describe pod xiuxian
报错故障排查
使用命令 kubectl describe pod xiuxian 查看错误信息,然后进入对应的容器中排查。
如上所示,根据报错信息,发现kubelet说’Failed to pull image’(拉取镜像失败)。
解决方案:
- 检查镜像是否合法,比如镜像写错可能会导致这个错误,远程仓库压根就不存在该镜像;
- 如果镜像是正确的,可能是你的虚拟机无法联网,导致下载失败;
- 可能是权限错误,说白了,这个镜像可能是私有仓库,需要登录后才能下载;
书写资源清单
vim 01-pods-xiuxian.yaml
# 指定资源的版本
apiVersion: v1
# 指定资源的类型
kind: Pod
# 指定资源的元数据
metadata:
# 指定资源的名称
name: xixi
# 期望资源的运行状态
spec:
# 定义运行的容器信息
containers:
# 容器的名称
- name: c1
# 指定容器的镜像
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
启动和删除资源
kubectl apply -f 01-pods-xiuxian.yaml
kubectl delete -f 01-pods-xiuxian.yaml
容器的三种状态
容器有三种状态,分别对应为:Waiting,Running,Terminating。
- Running:表示容器处于正常运行状态。
- Terminating:表示容器处于终止状态,一般情况下在删除时才会出现。
- Waiting:表示既没有Running,也没有Terminating,属于一种等待状态,比如容器无法正常启动,或者正在拉取镜像。
案例:端口冲突问题
基础架构为c1和c2同时提供网络名称空间,但是80端口仅有一个,因此c2无法启动成功!
[root@master231 pods]# cat 02-pods-multiple-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: haha
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- name: c2
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
此时用 kubectl describe pod haha 查看到c2的状态会变成waiting,容器被终止。
当查看Pod状态时,有CrashLoopBackOff关键字时,说明该Pod内有容器正在重启。
此时我们去该服务对应的worker节点查看docker的运行状态:
- A. 虽然我们写了2个容器c1和c2,但是去对应的worker233节点发现有三个容器。
- B. c1容器正常运行Up,c2容器Exited。
- C. 还有一个基础架构容器,为Pod提供名称空间(ipc,net,time,user)。
此时进行删除操作:
- 删除业务容器时,发现会自动重启,且IP地址并不会发生变化。
- 删除基础架构容器后,业务容器也会重启,IP地址会发生变化。所以c1和c2都共享网络,80端口冲突导致c2无法启动。
所以进行改进:
[root@master231 pods]# cat 03-pods-multiple-xiuxian-command.yaml
apiVersion: v1
kind: Pod
metadata:
name: hehe
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- name: c2
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
# 修改容器的启动命令,相当于替换了Dockerfile的ENTRYPOINT指令。
command: ["sleep","360d"] # 睡觉了,先启动
再去连接指定容器修改配置文件的端口信息:
[root@master231 pods]# kubectl exec hehe -c c2 -it -- sh
nginx -t # 发现在 include /etc/nginx/conf.d/*.conf; 当中
sed -i '/listen/s#80#81#' /etc/nginx/conf.d/default.conf
grep listen /etc/nginx/conf.d/default.conf
nginx # 直接输入nginx可以重新启动容器
响应式pod标签书写
命令行操作
查看标签:
kubectl get po --show-labels
kubectl get po --show-labels -o wide
直接打标签:
kubectl label pod hehe app=v1
kubectl label pod hehe app=v2 --overwrite
删除标签:
kubectl label pod hehe app-
基于标签的过滤:
kubectl get pods -o wide --show-labels -l app=v2
基于标签删除pod:
kubectl delete pods -l app=v2
标签的资源清单
在基础的资源清单上,然后在metadata行下面增加labels:
[root@master231 pods]# cat 04-pods-labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
# 为Pod添加标签
labels:
apps: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
---
apiVersion: v1
kind: Pod
metadata:
name: haha
labels:
apps: v2
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
Pod三种重启策略
指定Pod的重启策略,有效值为:Always, OnFailure, Never
- Always:当Pod内的容器退出时,始终重启容器。发现30s后重启。
- Never:当Pod内的容器退出时,始终不重启容器。发现30s后不重启。
- OnFailure:当容器异常退出时,则会重启容器(比如把该docker进程杀死)。如果正常退出会显示complete,则不会重启容器。
回顾:Docker中ENTRYPOINT和CMD的区别
ENTRYPOINT 和 CMD 都是用于指定容器启动时运行的命令
- 当没有显式地提供docker run命令时,ENTRYPOINT将被自动执行。
- 如果提供了CMD,则这些命令会被作为ENTRYPOINT的参数传递;如果没有提供CMD,ENTRYPOINT通常期望接收一些参数。
- 示例:
ENTRYPOINT ["myapp", "-c"]表示容器启动时运行"myapp"并传入"-c"参数。
什么是Pod,什么是容器
- k8s资源清单当中:如果指定了kind是Pod,那么这个就用来定义pod的。
- 一个pod中可以有多个容器:pod启动时,里面所有的容器都会启动,停止时容器全部停止。
- Pod是Kubernetes的基本工作单元:每个Pod包含一个或多个紧密相关的容器,这些容器共享存储、网络和命名空间等资源。
- 容器是应用程序的运行实例:容器是轻量级、可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
更多推荐




所有评论(0)