yaml文件应用于 Kubernetes 集群以创建 Pod

#Kubernetes 将按照定义创建 Pod
kubectl apply -f nginx-pod.yaml

--dry-run=client 标志来模拟应用清单,而无需实际对集群进行更改。

kubectl apply -f web-app.yaml --dry-run=client
kubectl apply -f web-app.yaml -v=7
#-v 标志后跟详细级别,更详细的输出

获取更详细的信息

kubectl get deployments -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                      SELECTOR
nginx-deployment   3/3     3            3           4m58s   nginx        nginx:latest                app=nginx
redis-master       1/1     1            1           108s    master       registry.k8s.io/redis:e2e   app=redis,role=master,tier=backend
web-app            2/2     2            2           2m7s    web          nginx:alpine                app=web
字段含义示例值说明
NAMEDeployment 的名字nginx-deployment区分不同 Deployment
READY当前就绪 Pod 数 / 期望 Pod 数3/3有 3 个 Pod,全部处于 Ready 状态
UP-TO-DATE已经更新到最新模板的 Pod 数量3表示 3 个 Pod 都是最新版本
AVAILABLE可以对外提供服务的 Pod 数量3与 READY 一般相同,但更新时可能不一致
AGEDeployment 运行时长4m58s从创建到现在的时间
CONTAINERSPod 内容器的名称nginxDeployment 模板中定义的容器名
IMAGES容器镜像名称及版本nginx:latest运行容器的镜像
SELECTORLabel 选择器app=nginx用来匹配和管理 Pod 的标签

列出所有服务

kubectl get services
kubectl describe service web-service
Name:              web-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=web
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.98.89.54
IPs:               10.98.89.54
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.8:80,10.244.0.9:80
Session Affinity:  None
Events:            <none>
字段含义示例值说明
NameService 名称web-serviceService 的标识符
Namespace命名空间defaultService 所在的命名空间
Labels标签app=web用于筛选和组织资源
Annotations注解kubectl.kubernetes.io/last-applied-configuration: {...}附加的元数据信息,供工具或运维使用
SelectorPod 选择器app=webService 通过这些 label 找到对应的 Pod
TypeService 类型ClusterIP / NodePort / LoadBalancer决定 Service 如何暴露
IP (ClusterIP)Service 的虚拟 IP10.96.152.34集群内访问 Service 的入口
IP Family Policy / IP Families支持的 IP 协议族SingleStack / IPv4IPv4 或 IPv6 配置
Port(s)端口映射规则80/TCP → 8080Service 端口与 Pod 端口的映射
TargetPortPod 内部端口8080/TCPPod 实际监听的端口
EndpointsService 实际后端 Pod 的 IP:Port

10.244.0.8:80,

10.244.0.9:80

检查服务是否具有端点,并且它们是否与正在运行的 Pod 的 IP 地址相对应。如果没有端点,请对服务的选择器和容器标签进行故障排除。
Session Affinity会话亲和性None / ClientIP是否将同一客户端的请求固定到同一 Pod
Events与 Service 相关的事件Normal EnsuredLoadBalancer用于排查问题的事件信息

启动kubectl proxy

kubectl proxy --port=8080 &

使用 jobs 命令列出后台进程

停止kubectl proxy

#[1] Running kubectl proxy --port=8080
kill %1

出于安全原因,kubectl proxy只能在本地主机 (127.0.0.1) 上访问。它不用于公开服务。

部署 Pod,选择特定的 Pod

# Get a Pod name from the deployment
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')

# Run commands in the deployment's Pod
kubectl exec -it $POD_NAME -- /bin/bash

描述 Pod 以获取更多详细信息:

kubectl describe pods -l app=debug
kubectl logs <pod-name>

描述节点资源

kubectl describe nodes minikube

查看所有集群事件

kubectl get events
# Watch events in real-time
kubectl get events -w

# Get events sorted by timestamp
kubectl get events --sort-by='.metadata.creationTimestamp'


# Filter by event type
kubectl get events --field-selector type=Warning

# Filter by specific resource
kubectl get events --field-selector involvedObject.kind=Deployment

yaml文件

apiVersion: apps/v1 #指定 Kubernetes API 版本
kind: Deployment #定义资源类型(部署)
metadata: #为部署提供名称和标签
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3 #设置 Pod 副本的数量
  selector: #帮助部署管理正确的 Pod
    matchLabels:
      app: nginx
  template: #定义 Pod 规范
    metadata:
      labels:
        app: nginx
    spec:
      containers: #指定容器映像和端口
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

ClusterIP:仅限内部集群访问

NodePort:在每个节点的 IP 上的静态端口上公开服务

验证 Pod 上的当前标签

kubectl get pods --show-labels

使用特定标签选择容器:

kubectl get pods -l app=nginx
#向其中一个 Pod 添加自定义标签
kubectl label pods nginx-deployment-xxx-yyy environment=development
#从容器中移除标签
kubectl label pods nginx-deployment-xxx-yyy environment-

删除服务

# Delete multiple services at once
kubectl delete service nginx-clusterip-service nginx-nodeport-service

Ingress 

Ingress 是一个 API 对象,用于管理对 Kubernetes 集群中服务(通常是 HTTP)的外部访问。Ingress 提供:

负载均衡 :将流量分配给多个后端服务

SSL/TLS 终止 :处理安全连接

基于名称的虚拟主机 :根据主机名将请求路由到不同的服务

基于路径的路由 :根据 URL 路径将请求路由到不同的服务

Ingress 由两个组件组成:

Ingress Resource:定义路由规则的 Kubernetes API 对象

Ingress Controller:强制执行 Ingress 资源中定义的规则的实现

在 Minikube 中启用 Ingress 插件

minikube addons enable ingress

创建部署

kubectl create deployment web1 --image=nginx:alpine
kubectl create deployment web2 --image=httpd:alpine

这些部署公开为服务

kubectl expose deployment web1 --port=80 --type=ClusterIP --name=web1-service
kubectl expose deployment web2 --port=80 --type=ClusterIP --name=web2-service

Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations: #Ingress 控制器的特定配置
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: #定义流量如何路由到服务
    - http:
        paths:
          - path: /web1 #将匹配的网址路径
            pathType: Prefix #路径应如何匹配(Prefix、Exact 或 ImplementationSpecific)
            backend:
              service: #路由到特定的服务器和端口
                name: web1-service
                port:
                  number: 80
          - path: /web2
            pathType: Prefix
            backend:
              service:
                name: web2-service
                port:
                  number: 80

Kubernetes 通过增加 pod 实例(副本)数量,轻松扩展应用规模。

修改yaml文件中的replicas: 3

使用 kubectl scale

假如部署了 nginx-deployment

kubectl scale deployment nginx-deployment --replicas=4

创建一个临时pod测试负载均衡:

kubectl run curl-test --image=curlimages/curl --rm -it -- sh

离开:exit

ClusterIP 服务类型提供内部负载均衡。

水平舱自动扩展器(HPA)

根据负载自动增加或减少 Pod 数量,维持应用的性能与资源利用率。

启用 metrics 服务器插件,对HPA 的正常运行至关重要。

minikube addons enable metrics-server

配置文件中有kind: HorizontalPodAutoscaler,表示这是一个 HPA 对象。

示例

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50

cubectl get hpa

打开load generator

kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

另外一个终端验证,随着 HPA 规模的扩大,pods被新建

kubectl get pods -w

rollout 命令

命令作用
kubectl rollout status deployment web-app查看 Deployment 的滚动更新(Rollout)状态
kubectl rollout history deployment web-app查看历史版本
kubectl rollout undo deployment web-app回滚至上一个版本
kubectl rollout pause deployment web-app暂停滚动更新
kubectl rollout resume deployment web-app恢复更新
// 查看 image version
kubectl get pods -l app=web -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine
// 把 Deployment 中名为 nginx 的容器的镜像更新成 nginx:1.25.0-alpine,并触发滚动更新。

常用命令:

kubectl get services // 查看服务
kubectl describe deployment nginx-deployment //查看部署信息
kubectl describe pods -l app=nginx //每个pods的详细信息
kubectl get events// 查看集群范围的事件
kubectl get events --field-selector involvedObject.kind=Deployment // 筛选Deployment相关的事件
kubectl wait --for=condition=Ready pod -l app=nginx # 等待标签为 app=nginx 的 Pod 变为就绪状态
kubectl logs -f nginx-busybox # 实时查看名为 nginx-busybox 的 Pod 的日志输出
kubectl exec -it nginx-busybox -c nginx -- /bin/sh # 进入名为 nginx-busybox 的 Pod 的 nginx 容器的交互式 shell
kubectl get deployment hello-world -o jsonpath='{.spec.template.spec.containers[0].image}' # 获取名为 hello-world 的部署中第一个容器的镜像名称
kubectl label deployment hello-world environment=development # 为名为 hello-world 的部署添加标签 
kubectl get deployment hello-world --show-labels # 显示名为 hello-world 的部署及其标签
kubectl annotate deployment hello-world owner=team-alpha # 为名为 hello-world 的部署添加注释 owner=team-alpha

Kubernetes RBAC中的三个核心概念:

  • Role:定义了一组权限规则(例如,能对哪些资源做什么操作)。

  • RoleBinding:像一个“授权合同”,将某个 Role 或 ClusterRole 中定义的权限,授予一个或多个用户、组或服务账户

  • ServiceAccount:Pod中运行的应用所使用的身份。

简单来说:Role 说明了“能干什么”,而 RoleBinding 说明了“谁可以这么干”。

ctr images ls与critcl images的区别

命令

作用

输出内容

是否依赖 CRI 配置

ctr images ls

containerd 直接管理镜像

所有 containerd 存储的镜像

❌ 不依赖 CRI 配置

crictl images

Kubernetes CRI 接口

Kubernetes 可用的镜像

✅ 依赖 crictl.yaml 或 runtime-endpoint

(YAML 配置) ---> (ConfigMap) ---> (Pod)
写的资源文件    存配置            使用配置
 

PV(PersistentVolume)——运维配置的“真实存储”

PVC(PersistentVolumeClaim)——用户“申请一块盘”

  • Deployment / Pod 不直接用 PV

  • 它们用 PVC 来申请需要的存储

Pod 是执行容器的单位;Job 是保证“某个任务一定跑完”的控制器。
Job 负责生成 Pod、监控 Pod、Pod 挂了就补 Pod,直到任务完成。

CronJob 就是 按固定时间自动运行 Job 的调度器

schedule: "*/5 * * * *"   # 每 5 分钟执行一次

DaemonSet 

DaemonSet 会确保集群中每个节点(或指定节点)上都运行一个 Pod。

StatefulSet

对比项DeploymentStatefulSet
Pod 身份随机固定(-0, -1)
网络名不稳定稳定 DNS
存储共享或无每 Pod 独立 PVC
启停顺序无序有序
使用场景Web / APIDB / MQ / 存储

Deployment 管“副本数量”,StatefulSet 管“实例身份”

Secret

用来存储和向 Pod 安全地分发敏感数据(密码、Token、证书等)。

Secret 的几种常见类型:

type: Opaque // 最常用
type: kubernetes.io/dockerconfigjson //拉私有镜像
// 证书
type: kubernetes.io/tls
data:
  tls.crt: <base64>
  tls.key: <base64>

ResourceQuota

ResourceQuota 用来限制某个 namespace 能“最多用多少资源 + 创建多少对象”,防止一个团队或应用把集群资源用完。

示例:

资源总量

spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi

LimitRange

该功能用于设置 Kubernetes Pod 中的资源消耗限制,帮助管理分配给 Pod 的资源,防止资源争用问题。

示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: example-limitrange
spec:
  limits:
    - type: Container
      max:
        cpu: "1"
        memory: "1Gi"
      min:
        cpu: "100m"
        memory: "100Mi"
      default:
        cpu: "500m"
        memory: "500Mi"

LimitRange作用于namespace,Pod 只要在这个 Namespace 里创建,就会被 LimitRange 约束

Pod 没写 resources → 注入默认值

Pod 写了 resources,但超出 LimitRange → 直接拒绝创建

Pod 写了 resources,在范围内 → 通过

ca.crt tls.crt

ca.crt / ca.key = 发证的人(CA)
tls.crt / tls.key = 被发的证(服务器或客户端)

CA 用 ca.key 给别人签 tls.crt

node affinity

节点亲和力用于调度符合特定条件的节点上的 pod。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In     #  NotIn反亲和力
                values:
                  - web

Liveness Probe与Readiness Probe

Liveness Probe(存活探针)用来判断容器是不是“还活着”。如果探测失败,kubelet 会直接重启容器,不管这个容器当前是不是还能对外提供服务。

程序卡死了 / 进入异常状态,但进程还在 → Liveness Probe 负责把它“拉起来重来一次”。

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10


Readiness Probe(就绪探针)用来判断:这个 Pod 现在“能不能接收流量”

  • 作用:控制是否对外提供服务

  • 失败后果:不接收流量(但容器继续运行)

  • 恢复后果:自动重新加入 Service

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  periodSeconds: 5

关键参数:

参数含义
initialDelaySeconds启动后多久开始检查
periodSeconds检查间隔
timeoutSeconds单次超时
failureThreshold连续失败多少次变 NotReady
successThreshold连续成功多少次才恢复 Ready
对比项Liveness ProbeReadiness Probe
目的是否需要重启容器是否接收流量
失败后重启容器从 Service Endpoints 中摘除
是否杀进程
使用场景程序卡死、自愈启动慢、依赖未就绪

HorizontalPodAutoscaler

HorizontalPodAutoscaler(HPA) 是 Kubernetes 里用来做「水平自动伸缩 Pod 数量」的控制器。

它会根据设定的指标(CPU、内存、自定义指标等),自动调整某个 Deployment / StatefulSet / ReplicaSet 的副本数。

  • 横向扩缩容:改的是 Pod 数量(replicas),不是 Pod 里的资源规格,也不是节点数。
  • 核心目标:在负载高时自动加 Pod,负载低时自动减 Pod,减少人工调节和资源浪费。

metrics-server 

metrics-server 是 Kubernetes 官方的“资源指标采集组件”,用于实时采集 Node / Pod 的 CPU、内存使用情况,并通过 Metrics API 提供给集群内的其他组件使用。

更多推荐