Kubernetes资源对象和Pod资源
Kubernetes资源对象和Pod资源

Kompose 是一个转换工具,可将 compose (即 Docker Compose)所组装的所有内容转换成容器编排器(Kubernetes 或 OpenShift)可识别的形式。
Kompose 官网 http://kompose.io
名称空间
内置默认名称空间
- default
默认工作空间,不指定 namespace 时,资源都建在这里。
- kube-system
集群系统核心组件专属空间:kube-apiserver、etcd、kube-proxy、CoreDNS、网络插件等,禁止手动删改。
- kube-public
公共只读命名空间,所有用户可访问,存放集群公共信息(如集群 ConfigMap)。
- kube-node-lease
节点租约对象,用于节点心跳健康检测,维持节点在线状态。
常用操作命令
# 查看所有命名空间
kubectl get ns
# 创建命名空间
kubectl create ns 名称
# 指定命名空间创建/查看资源
kubectl get pod -n 名称
# 设置默认命名空间(后续不用加 -n)
kubectl config set-context --current --namespace=名称
创建Namespace资源
指令式命令创建
使用指令式命令 kubectl create 可以直接创建名称空间,只需指定名称空间名称
[root@master1 ~]#kubectl create namespace namespace-test1
namespace/namespace-test1 created
[root@master1 ~]#kubectl get namespace namespace-test1
NAME STATUS AGE
namespace-test1 Active 4s
注意:实际生产中不建议使用指令式命令和配置,直接使用声明式就可以。
指令式配置创建
kubectl create -f </path/to/namespace-obj.yaml 实现创建
此方式生产不建议使用,执行此命令需要指定的namespace不存在
[root@master1 ~]#cat namespace-test2.yaml
apiVersion: v1
kind: Namespace
metadata:
name: namespace-test2
[root@master1 ~]#kubectl create -f namespace-test2.yaml
namespace/namespace-test1 created
声明式配置创建
范例: 方法1
[root@master1 ~]#cat namespace-test2.yaml
apiVersion: v1
kind: Namespace
metadata:
name: namespace-test2
[root@master1 ~]#kubectl apply -f namespace-test2.yaml
namespace/namespace-test1 created
[root@master1 ~]#kubectl get namespace namespace-test2
NAME STATUS AGE
namespace-test2 Active 4m12s
范例: 方法2
[root@ubuntu2204 ~]#kubectl get ns default -o yaml > default-ns.yaml
[root@ubuntu2204 ~]#vim default-ns.yaml
[root@ubuntu2204 ~]#cat default-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
[root@ubuntu2204 ~]#kubectl apply -f default-ns.yaml
namespace/demo created
[root@ubuntu2204 ~]#kubectl get ns demo
NAME STATUS AGE
demo Active 7s
删除Namespace资源
注意: 删除 Namespace 会级联删除此名称空间的所有资源,非常危险
#方法1
[root@master1 ~]#kubectl delete namespaces namespace-test1
namespace "namespace-test1" deleted
#方法2
[root@master1 ~]#kubectl delete -f namespace-test2.yaml
namespace "namespace-test2" deleted
删除指定名称空间的资源
使用 kubectl 管理资源时,如果提供了名称空间选项,就表示此管理操作仅针对指定名称空间进行,而删除 Namespace 资源则会级联删除其包含的所有其他资源对象。
| 命令格式 | 功能 |
|---|---|
| kubectl delete TYPE RESOURCE -n | 删除指定名称空间内的指定资源 |
| kubectl delete TYPE --all -n | 删除指定名称空间内的指定类型的所有资源 |
| kubectl delete all -n | 删除指定名称空间内的所有资源 |
| kubectl delete all --al | 删除所有名称空间中的所有资源 |
pod资源
Pod资源基础
什么是pod
Pod 是 K8s 最小调度单元,不是容器,是一组紧密关联容器的封装。一个 Pod 里可以跑1 个主容器(最常用)或多个协作容器。
一个 Pod 里可以跑1 个主容器(最常用)或多个协作容器。
每个Pod中的容器依赖于一个特殊名为pause容器事先创建出可被各应用容器共享的基础环境,包括Network、IPC和UTS名称空间共享给Pod中各个容器,PID名称空间也可以共享,但需要用户显式定义,Mount和User是不共享的,每个容器有独立的Mount,User的名称空间
Pod的组成形式有两种
单容器Pod:除Pause容器外,仅含有一个容器
多容器Pod:除Pause容器外,含有多个具有“超亲密”关系的容器,一般由主容器和辅助容器(比如:sidecar容器)构成
pod的特点
- 同一 Pod 内所有容器:
- 共享网络命名空间(同 IP、同端口、互通用localhost)
- 共享存储卷 Volume
- 调度、启停原子化:一起创建、一起销毁、一起调度到同一节点
- 生命周期短暂:随时可能被重建、迁移,不持久化业务数据
- 不会自愈,靠控制器管理(Deployment/StatefulSet 等),不直接裸用 Pod
Pod 生命周期状态
Pending:已创建,未调度 / 镜像拉取中
Running:已调度到节点,容器正常运行
Succeeded:一次性任务跑完,正常退出
Failed:容器异常退出
Unknown:节点失联,状态未知
探针(健康检查)
存活探针 livenessProbe:容器死了就重启 Pod
就绪探针 readinessProbe:没就绪就不接入流量
探测方式:HTTPGet、TCPSocket、Exec 命令
Pod 资源限制
requests:调度最低需要的 CPU / 内存(调度依据)
limits:最大可用上限,超了会被限流 / 杀掉
pod网络
每个 Pod独占集群独立 IP
集群内 Pod 之间直接互通,无需端口映射
Pod 完整生命周期流程
创建 Pod → 提交 yaml 到 apiserver
调度调度器 → 选出合适 Node 节点
节点拉取镜像 → 下载容器镜像
初始化容器 InitContainer 依次执行,全部成功才往下走
启动主业务容器
就绪探针 readinessProbe 检测通过 → 加入 Service 接收流量
运行中:存活探针 livenessProbe 持续巡检
删除 Pod → 先执行优雅终止(默认 30s),停止容器、清理资源
节点故障后不具有自动调度至其它节点的故障自愈能力
由Workload Controller 管控的 Pod
比如: 由Deployment控制器管理的Pod
节点故障后具有自动调度至其它节点的故障自愈能力
静态 Pod
由kubelet加载配置信息后,自动在对应的节点上创建的Pod
用于实现Master节点上的系统组件API Server 、Controller-Manager 、Scheduler 和Etcd功能的Pod
相关配置存放在控制节点的 /etc/kubernetes/manifests 目录下
自主式 Pod
自主式Pod是由Pod本身去控制本身,不受其它资源如控制器控制的 Pod
这种Pod本身不具有自我修复功能,当自主式Pod被创建后,都会被Kubernetes调度到集群的Node上。
不论是否故障,都会在此Node节点上存在,直到Pod的进程终止和被删掉
中间如果Pod即使出了故障, Pod也不会被调度至其它节点实现自愈
可以支持三种方法创建自主式pod
指令式命令
指令式对象配置文件
声明式对象配置文件
指令式命令创建 Pod
通过kubectl 命令行工具指定选项创建 Pod,适合临时性工作
基本语法
kubectl run NAME --image=image [--port=port] [--replicas=replicas]
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dryrun=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
[options]
#参数详解
--image='' #指定容器要运行的镜像
--port='' #设定容器暴露的端口
--dry-run=true #以模拟的方式来进行执行命令
--env=[] #执行的时候,向对象中传入一些变量
--labels='' #设定pod对象的标签
--limits='cpu=200m,memory=512Mi' #设定容器启动后的资源配置
--replicas=n #设定pod的副本数量,新版不再支持
--command=false #设为true,将 -- 后面的字符串做为命令代替容器默认的启动命令,而非做为默认启动命令的参数
-it #打开交互终端
--rm #即出即删除容器
--restart=Never #不会重启
范例:
#初始化一个Pod对象,包含一个nginx容器
[root@master1 ~]#kubectl run nginx01 --image=registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0
pod/nginx01 created
#查看pod状态
[root@master1 ~]#kubectl get pod nginx01
NAME READY STATUS RESTARTS AGE
nginx01 0/1 ContainerCreating 0 19s
#创建Busybox的Pod,默认busybox没有前台进程,需要指定前台程序才能持继运行
[root@master1 ~]#kubectl run busybox --image registry.cnbeijing.aliyuncs.com/wangxiaochun/busybox:1.32.0 -- sleep 3600
[root@master1 ~]#kubectl get pod busybox
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 9m37s
范例:在命令行创建pod 引用环境变量,之后可以通过$(VAR_NAME)在容器中获取变量
#运行pod时定义一个变量
[root@master1 ~]#kubectl run pod-conf --image=registry.cnbeijing.aliyuncs.com/wangxiaochun/nginx:1.20.0 --env="NAME=wangxiaochun"
#验证变量
[root@master1 ~]#kubectl exec -it pod-conf -- sh
# echo $NAME
wangxiaochun
[root@master1 ~]#kubectl delete pod pod-conf
创建时用户通过 kubectl apply/create 命令将创建请求提交到 API server 并将其保存至集群状态存储系统 etcd 中,而后由调度器将创建请求调度到最佳的目标 node,并被运行于该 node 的 kubelet 借助于容器引擎创建并启动 pod。
创建pod资源清单文件
手动创建pod资源清单文件
[root@master1 ~]#vim pod-test1.yaml
[root@master1 ~]#cat pod-test1.yaml
apiVersion: v1 #指定API版本,此为固定值
kind: Pod #指定资源类型 pod
metadata: #元数据类型
name: pod-test1 # 指定pod名称
namespace: default #指定名称空间,如果不指定为default
spec: #表述信息
containers: #容器信息
- name: nginx-web01 #容器名称为APP
image: registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0 #运行的是nginx 镜像,可以同时运行多个容器
自己编写资源定义文件有些繁琐,可以利用现有的pod生成yaml清单文件,再修改即可
[root@master1 ~]#kubectl get pod pod-test1 -o yaml --export > pod-test1-export.yaml
#命令解析
-o yaml #以yaml的格式显示当前资源的所有属性信息。
--export #在导出信息的时候,会忽略掉有系统生成的信息,这个功能在1.19版本之后被移除了
#修改生成的文件,只保留需要的内容
[root@master1 ~]#vim pod-test1-export.yaml
[root@master1 ~]#cat pod-test1-export.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test2
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/wangxiaochun/nginx:1.20.0
name: nginx-web02
扩容和缩容
#把myweb扩容到3个
kubectl scale deployment myweb --replicas=3
#把myweb缩容容到1个
kubectl scale deployment myweb --replicas=1
deployment-test
范例: 基于声明清单文件实现升级和降级
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-test
spec:
replicas: 3
selector:
matchLabels:
app: rs-test
template:
metadata:
labels:
app: rs-test
spec:
containers:
- name: pod-test
image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1
起了三个pod

查看版本

升级版本
把image更换成v0.2

回滚上一个版本
#回滚上一个操作
[root@master1 ~]#kubectl rollout undo deployment deployment-test
deployment .apps/deployment-test rolled back
确认回滚


[root@master1 pod]# kubectl annotate deployment deployment-test kubernetes.io/change-cause="v1.0" --overwrite
deployment.apps/deployment-test annotated
[root@master1 pod]#
[root@master1 pod]#
[root@master1 pod]# kubectl rollout history deployment deployment-test
deployment.apps/deployment-test
REVISION CHANGE-CAUSE
5 <none>
6 <none>
7 v1.0
[root@master1 pod]#
是 老版本 Kubernetes(1.24 及以下) 用 --record=true 才会出来的效果!
[root@master1 pod]# kubectl annotate deployment deployment-test kubernetes.io/change-cause='kubectl set image deployment/deployment-test pod-test=registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.3 --record=true' --overwrite
deployment.apps/deployment-test annotated
[root@master1 pod]#
[root@master1 pod]# kubectl rollout history deployment deployment-test
deployment.apps/deployment-test
REVISION CHANGE-CAUSE
5 <none>
6 <none>
7 kubectl set image deployment/deployment-test pod-test=registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.3 --record=true

更多推荐
所有评论(0)