云原生k8s(二)——核心组件详解与基础命令

Kubernetes 核心组件详解与基础命令

让我用开餐厅的比喻,帮你彻底理解这些组件之间的关系:

记忆技巧

"三层楼"模型

三层楼:Ingress (招牌) ← 顾客访问

二层楼:Service (前台) ← 内部路由

一层楼:Deployment (经理) ← Pod (员工) ← ConfigMap/Secret (手册)

地下室:PVC/PV (仓库)

"餐厅运营"口诀

招员工(Pod)靠经理(Deployment)

找员工靠前台(Service)

员工知识靠手册(ConfigMap/Secret)

员工储物靠仓库(PVC/PV)

顾客进门靠招牌(Ingress)

"创建顺序"口诀

先有手册(ConfigMap/Secret)和仓库(PV/PVC)

再招员工(Pod)和管理(Deployment)

然后设前台(Service)

最后挂招牌(Ingress)

Pod - 最小部署单元

Pod的含义:Kubernetes中的最小计算单元,包含一个或多个紧密相关的容器
Pod的作用:

  • 运行应用容器

  • 为容器提供共享网络和存储空间

  • 容器生命周期的管理


Pod的使用场景:

  • 运行单个容器应用

  • 运行需要共享资源的多个容器(如主应用+日志收集器)

  • 临时任务或一次性作业


Pod的基础命令

bash 复制代码
# 查看所有Pod
kubectl get pods

# 查看Pod详情
kubectl describe pod <pod-name>

# 创建Pod(通过YAML文件)
kubectl apply -f pod.yaml

# 查看Pod日志
kubectl logs <pod-name>

# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash

# 删除Pod
kubectl delete pod <pod-name>

# 简单Pod YAML示例
cat > nginx-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
EOF

Deployment - Pod的控制器

Deployment的含义:管理Pod副本集的更高级抽象,确保指定数量的Pod始终运行

Deployment的作用:

  • 声明式管理Pod副本数量

  • 自动故障恢复(自愈)

  • 滚动更新和回滚

  • 版本控制


使用场景:

  • 无状态应用的部署(如Web服务器)
  • 需要高可用的服务
  • 需要平滑升级的应用

Deployment的基础命令:

bash 复制代码
# 创建Deployment
kubectl create deployment nginx --image=nginx:latest

# 查看Deployment
kubectl get deployments

# 查看Deployment详情
kubectl describe deployment <deployment-name>

# 扩展副本数
kubectl scale deployment nginx --replicas=3

# 更新镜像(触发滚动更新)
kubectl set image deployment/nginx nginx=nginx:1.19

# 查看更新状态
kubectl rollout status deployment/nginx

# 回滚到上一版本
kubectl rollout undo deployment/nginx

# 查看历史版本
kubectl rollout history deployment/nginx

# Deployment YAML示例
cat > nginx-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80
EOF

Service - 服务发现与负载均衡

Service的含义:为一组Pod提供稳定的网络访问端点
Service的作用:

  • 服务发现:通过DNS名称访问
  • 负载均衡:流量分发到多个Pod
  • 抽象:隐藏Pod的IP变化

Service的类型:

  • ClusterIP(默认):集群内部访问
  • NodePort:节点端口暴露
  • LoadBalancer:云提供商负载均衡器
  • ExternalName:外部服务别名

Service的使用场景:

  • 微服务间的通信
  • 外部访问集群内服务
  • 负载均衡多个Pod实例

Service的基础命令:

bash 复制代码
# 创建Service
kubectl expose deployment nginx --port=80 --type=ClusterIP

# 查看Service
kubectl get services
kubectl get svc

# 查看Service详情
kubectl describe service <service-name>

# 端口转发(临时外部访问)
kubectl port-forward service/nginx 8080:80

# 创建NodePort Service
kubectl expose deployment nginx --port=80 --type=NodePort

# Service YAML示例
cat > nginx-service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
EOF

ConfigMap - 配置管理

ConfigMap的含义:存储非敏感配置数据的键值对
ConfigMap的作用:

  • 将配置与容器镜像分离
  • 动态更新应用配置
  • 支持多种使用方式(环境变量、配置文件)

ConfigMap的使用场景:

  • 应用配置文件(如application.properties)
  • 环境变量配置
  • 命令行参数

ConfigMap的基础命令:

bash 复制代码
# 从文件创建ConfigMap
kubectl create configmap app-config --from-file=config.properties

# 从字面值创建
kubectl create configmap app-config --from-literal=LOG_LEVEL=DEBUG

# 查看ConfigMap
kubectl get configmaps
kubectl get cm

# 查看内容
kubectl describe configmap app-config
kubectl get configmap app-config -o yaml

# 更新ConfigMap
kubectl edit configmap app-config

# 删除ConfigMap
kubectl delete configmap app-config

# ConfigMap使用示例
cat > configmap-demo.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  # 属性方式
  log.level: "INFO"
  app.name: "MyApp"
  
  # 配置文件方式
  application.properties: |
    server.port=8080
    db.host=database
    db.port=5432
EOF

Secret - 敏感信息管理

Secret的含义:存储敏感数据(密码、令牌、密钥)
Secret的作用:

  • 安全存储敏感信息
  • 自动Base64编码
  • 多种类型支持(Opaque、TLS、docker-registry)

Secret的使用场景:

  • 数据库密码
  • API密钥
  • TLS证书
  • Docker registry认证信息

Secret的基础命令:

bash 复制代码
# 从文件创建Secret
kubectl create secret generic db-secret --from-file=./password.txt

# 从字面值创建
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password='S3cr3t!'

# 创建TLS Secret
kubectl create secret tls tls-secret \
  --cert=./tls.crt \
  --key=./tls.key

# 查看Secret
kubectl get secrets

# 查看内容(注意:值是Base64编码的)
kubectl get secret db-secret -o yaml

# 解码查看
kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 --decode

# 删除Secret
kubectl delete secret db-secret

# Secret使用示例
cat > secret-demo.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=  # admin
  password: UzNjcjN0IQ==  # S3cr3t!
EOF

存储基础

PV(PersistentVolume)- 持久卷

PV的含义:集群中的存储资源,由管理员预先配置
PV的作用:

  • 提供独立于Pod生命周期的存储
  • 抽象底层存储细节
  • 支持多种存储后端(NFS、云存储、本地存储)

PV的使用场景:

  • 数据库持久化存储
  • 文件共享
  • 日志持久化

PVC(PersistentVolumeClaim)- 持久卷声明

PVC的含义:用户对存储资源的请求
PVC的作用:

  • 为用户申请存储空间
  • 绑定到合适的PV
  • 在Pod中作为卷使用

PV和PVC的基础命令:

bash 复制代码
# 查看PV和PVC
kubectl get pv
kubectl get pvc

# 查看详情
kubectl describe pv <pv-name>
kubectl describe pvc <pvc-name>

# 删除PVC(通常会自动删除对应PV的数据)
kubectl delete pvc <pvc-name>

# PV和PVC示例
cat > storage-demo.yaml <<EOF
---
# 1. 先定义PV(通常由管理员创建)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: "/mnt/data"
---
# 2. 用户申请PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: manual
---
# 3. 在Deployment中使用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
EOF

Ingress - 外部访问入口

Ingress的含义:管理外部访问集群内部服务的HTTP/HTTPS路由规则
Ingress的作用:

  • 基于域名或路径的路由
  • TLS/SSL终止
  • 负载均衡
  • 外部访问的统一入口
    重要:Ingress需要Ingress Controller才能工作(如Nginx Ingress Controller)

Ingress的使用场景:

  • 一个IP多个应用(基于域名区分)
  • HTTPS网站
  • 复杂的路由规则
    Ingress 的基础命令:
bash 复制代码
# 查看Ingress
kubectl get ingress
kubectl get ing

# 查看Ingress详情
kubectl describe ingress <ingress-name>

# 创建Ingress Controller(以Nginx为例)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

# Ingress示例
cat > ingress-demo.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  # TLS配置
  tls:
  - hosts:
    - myapp.example.com
    secretName: tls-secret
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 8080
EOF
相关推荐
ChineHe3 小时前
Docker基础篇001_Docker入门指南(基于官方教程,5W字详细版)
运维·docker·微服务·容器·云计算·devops
Zsr10233 小时前
POD控制器:集群的“自动化运维管家”
docker·容器·kubernetes
汪碧康3 小时前
一文掌握k8s容器的资源限制
docker·云原生·容器·golang·kubernetes·k8s·xkube
可爱又迷人的反派角色“yang”3 小时前
k8s(七)
java·linux·运维·docker·云原生·容器·kubernetes
optimistic_chen3 小时前
【Docker入门】namespace 空间隔离
linux·运维·docker·容器·空间隔离
骇客野人3 小时前
Linux通过自动脚本自动化推送k8s Docker镜像
linux·kubernetes·自动化
Java程序员威哥3 小时前
Spring Boot 3.x 云原生终极适配:GraalVM 原生镜像构建 + Serverless 生产级部署(完整实战+最优模板)
java·开发语言·spring boot·后端·云原生·serverless·maven
萧曵 丶3 小时前
Kubernetes(k8s)搭建指南
云原生·容器·kubernetes
周壮13 小时前
01 一探究竟:从架构的演变看微服务化架构
微服务·云原生·架构