Kubectl快速实战

kubectl是Kubernetes的“瑞士军刀”,使用kubectl通过连接API Server完成对集群的所有交互。深入探索之前,需要先了解其常用命令。
kubectl官方使用文档:https://kubernetes.io/zh-cn/docs/reference/kubectl/

1.Kubectl基础命令

Hands-ON:

# 查看kubectl客户端版本
kubectl version

# 查看集群状态
kubectl cluster-info

# 查看集群所有节点
kubectl get nodes	

实用技巧:

#设置别名
alias k=kubectl

# 启用自动补全
source <(kubectl completion bash)

2.Namespace

Namespace(命名空间)用于进行资源的逻辑隔离。

核心概念:

  • 默认namespace:default(未指定时使用)
  • 系统namespace:kube-system(系统组件)、kube-public(公共资源)
  • 逻辑隔离优势:不同namespace的资源可以同名不冲突

Hands-On:

# 查看所有namespace
kubectl get ns
# 简写了kubectl get namespace

# 创建namespace
kubectl create ns my-ns

# 查看特定namespace的资源
kubectl get pods -n my-ns
kubectl get all -n my-ns

# 切换到某个namespace
kubectl config set-context --current --namespace=my-ns
# 之后所有命令默认在该namespace执行

# 删除namespace
kubectl delete ns my-ns
# 这么做会将该namespace下的资源一并删除

# 查看当前所在的namespace
kubectl config view --minify | grep namespace:

YAML示例:

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: my-ns
# 通过YAML创建
kubectl apply -f namespace.yaml

3.Pod

Pod是Kubernetes的最小调度单元,一个Pod包含一个或多个容器(通常是一个)。

核心特点:

  • 共享网络:Pod中容器共享IP和端口资源
  • 共享存储:Pod中容器可共享存储
  • 生命周期:Pod是最小创建和销毁的单位

Hands-On:

# 查看所有Pod
kubectl get pods
kubectl get pods -A  # 查看所有namespace的Pod

# 查看Pod详情信息
kubectl describe pod nginx-pod

# 查看Pod日志
kubectl logs nginx-pod
kubectl logs -f nginx-pod  #实时查看(-f)

# 进入Pod容器
kubectl exec -it nginx-pod -- /bin/bash
kubectl exec nginx-pod -- ls /  #执行单个命令

# 创建临时Pod
kubectl run nginx-pod --image=nginx --restart=Never

# 删除Pod
kubectl delete pod nginx-pod

状态说明:

kubectl get pods
  • Running:正常运行
  • Pending:等待调度
  • ContainerCreating:正在创建容器
  • CrashLoopBackOff:容器反复崩溃
  • ImagePullBackOff:镜像拉取失败

YAML示例:

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80
# 创建Pod
kubectl apply -f pod.yaml

# 查看Pod
kubectl get pods
kubectl describe pod nginx-pod

# 测试访问
kubectl port-forward nginx-pod 8080:80
# 浏览器访问 http://localhost:8080

4.Deployment

Deployment是Pod的控制器,用于管理多个Pod的多个副本和更新策略。

核心特点:

  • 副本管理:确保指定数量的Pod副本运行
  • 滚动更新:无中断更新应用版本
  • 版本回滚:一键回退至历史版本

Hands-On

# 创建Deployment
kubectl create deployment <name> --image=<image>
# 示例:kubectl create deployment nginx --image=nginx:alpine

# 查看Deployment
kubectl get deployments
kubectl get deploy  # 简写

# 查看关联的Pod
kubectl get pods -l app=<deployment-name>

# 扩容/缩容
kubectl scale deployment <name> --replicas=3

# 更新镜像(触发滚动更新)
kubectl set image deployment <name> <container>=<new-image>
# 示例:kubectl set image deployment nginx nginx=nginx:alpine

# 查看更新状态
kubectl rollout status deployment <name>

# 版本回滚
kubectl rollout undo deployment <name>

# 删除Deployment
kubectl delete deployment <name>

YAML示例

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
# 所有这些修改都只需要重新apply:
spec:
  replicas: 5                    # ✓ 副本数
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.22        # ✓ 镜像版本
        resources:               # ✓ 资源限制
          limits:
            memory: "256Mi"
        env:                     # ✓ 环境变量
        - name: DEBUG
          value: "true"
        ports:                   # ✓ 端口
        - containerPort: 8080
        livenessProbe:           # ✓ 健康检查
          httpGet:
            path: /health
# 应用配置
kubectl apply -f deployment.yaml

# 查看创建的资源
kubectl get deploy,rs,pod
# 会看到:Deployment -> ReplicaSet -> Pod 三层结构

不知道YAML文件的格式,可以通过kubectl edit deploy nginx查看默认生成的模板。

5.Service

Service为Pod提供稳定的网络访问,实现服务发现和负载均衡。
Service类型:

类型 用途 访问方式
ClusterIP (默认) 集群内部访问 集群内IP
NodePort 外部访问节点 节点IP:端口
LoadBalancer 云服务负载均衡 云厂商LB IP
ExternalName 外部服务别名 DNS别名

基本命令

# 查看所有Service
kubectl get svc
kubectl get services

# 创建Service(ClusterIP)
kubectl expose deployment <deployment-name> --port=<service-port> --target-port=<pod-port>

# 创建Service(NodePort)
kubectl expose deployment <deploy-name> --type=NodePort --port=80
# target-port不指定时,默认与port一致

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

# 查看Service的Endpoint(后端Pod)
kubectl get endpoints <service-name>

# 删除Service
kubectl delete svc <service-name>

YAML示例(ClusterIP)

# nginx-clusterip.yaml (最常用)
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    app: nginx  # 选择器:匹配Pod的标签
  ports:
  - name: http
    port: 80        # Service端口
    targetPort: 80  # Pod内容器端口
  type: ClusterIP   # 默认类型,可不写

YAML示例(NodePort)

# nginx-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    app: nginx  # 选择器:匹配Pod的标签
  ports:
  - name: http
    port: 80        # Service端口
    targetPort: 80  # Pod内容器端口
    nodePort: 30001	# Service暴露在宿主机上的端口,可选范围30000-32767
  type: NodePort

6.Volume

Volume 是 Kubernetes 为 Pod 提供的存储抽象,允许容器通过文件系统访问和持久化数据。

Volume类型核心概念

Volume类型 概念 存储位置
emptyDir Pod临时存储空间 节点本地临时目录
hostPath 节点文件系统路径挂载 节点指定路径
configMap 配置数据文件化挂载 K8s etcd集群存储
secret 加密数据文件化挂载 K8s etcd加密存储
NFS 网络文件系统挂载 远程NFS服务器
PVC 持久化存储卷声明 云存储/网络存储系统

在云原生架构中,应用应尽可能保持无状态(Stateless),将数据存储至外部服务(如数据库、缓存、对象存储等)。Volume 主要用于特定场景:

  • 有状态应用的数据持久化(数据库、中间件)
  • 配置文件、密钥的统一管理
  • 临时文件处理或节点级数据访问

如需深入学习Volume的详细配置,参考:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

7.ConfigMap

ConfigMap是Kubernetes中用来存储非敏感配置数据的API对象。将环境配置信息和容器镜像解耦,便于应用配置的修改。

ConfigMap使用方式:

  • 环境变量
  • 配置文件挂载
  • 命令行参数方式

Hands-On

# 创建ConfigMap
kubectl create cm nginx-config \
  --from-literal=key1=value1 \	# 字面值创建
  --from-literal=key2=value2 \
  --from-file=nginx.conf \	# 从文件创建
  --from-file=configs/	# 从目录创建(目录下所有文件)

# 查看ConfigMap
kubectl get configmaps
# 可以简写为kubectl get cm

# 查看详情
kubectl describe configmap nginx-config

# 查看YAML
kubectl get cm nginx-config -o yaml

# 使用ConfigMap(环境变量方式)
kubectl set env deployment/nginx --from=configmap/nginx-config

# 删除ConfigMap
kubectl delete cm nginx-config

8.Secret

Secret 是 Kubernetes 中用于存储和管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥等。
Secret使用方式:

  • 环境变量
  • 配置文件挂载

Secret类型:

类型 命令 用途
generic create secret generic 通用键值对(默认)
tls create secret tls TLS 证书和私钥
docker-registry create secret docker-registry Docker 镜像仓库认证

Hands-On

# 创建Secret
# 方式1:从字面值创建(通用类型)
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password='P@ssw0rd!'
# 方式2:从文件创建
kubectl create secret generic tls-secret \
  --from-file=tls.crt=./cert.pem \
  --from-file=tls.key=./key.pem
# 方式3:TLS 类型(专用)
kubectl create secret tls web-tls \
  --cert=./cert.pem \
  --key=./key.pem
# 方式4:Docker 注册表认证
kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=admin \
  --docker-password=secret

# 查看Secret(内容隐藏)
kubectl get secret

# 查看详情(不显示具体值)
kubectl describe secret db-secret

# 使用Secret(环境变量方式)
kubectl set env deployment/myapp --from=secret/db-secret

9.Ingress

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

Ingress架构流程:

ingress

注意:Ingress Controller也要通过LoadBalancer Service去连接外部负载均衡器。

Ingress的核心价值:用一个统一的"前台Service"代理所有后端的"业务Service",实现智能路由和成本优化。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐