Kubernetes 简介

Kubernetes 简介

Kubernetes (简称 K8s) 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。

核心概念

1. 集群架构

bash 复制代码
Master Node (控制平面)
├── API Server      # 集群入口,处理REST请求
├── etcd           # 分布式键值存储,保存集群状态
├── Scheduler      # 调度器,决定Pod运行在哪个节点
└── Controller Manager # 控制器管理器,维护集群状态

Worker Node (工作节点)
├── kubelet        # 节点代理,管理Pod生命周期
├── kube-proxy     # 网络代理,处理服务发现和负载均衡
└── Container Runtime # 容器运行时 (Docker/containerd)

2. 核心资源对象

Pod - 最小部署单元

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Deployment - 管理Pod副本

yaml 复制代码
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.20
        ports:
        - containerPort: 80

Service - 服务发现和负载均衡

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP  # ClusterIP/NodePort/LoadBalancer

ConfigMap - 配置管理

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_host: "mysql.example.com"
  database_port: "3306"
  config.yaml: |
    server:
      port: 8080
      host: 0.0.0.0

Secret - 敏感信息管理

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  username: YWRtaW4=  # base64编码的admin
  password: MWYyZDFlMmU2N2Rm  # base64编码的密码

常用 kubectl 命令

1. 集群信息

bash 复制代码
# 查看集群信息
kubectl cluster-info

# 查看节点状态
kubectl get nodes

# 查看节点详细信息
kubectl describe node <node-name>

# 查看集群版本
kubectl version

2. 资源管理

bash 复制代码
# 创建资源
kubectl create -f deployment.yaml
kubectl apply -f deployment.yaml  # 推荐使用

# 查看资源
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get all  # 查看所有资源

# 查看详细信息
kubectl describe pod <pod-name>
kubectl describe deployment <deployment-name>

# 删除资源
kubectl delete pod <pod-name>
kubectl delete deployment <deployment-name>
kubectl delete -f deployment.yaml

3. Pod 操作

bash 复制代码
# 查看Pod日志
kubectl logs <pod-name>
kubectl logs -f <pod-name>  # 实时查看
kubectl logs <pod-name> -c <container-name>  # 多容器Pod

# 进入Pod执行命令
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec <pod-name> -- ls -la

# 端口转发
kubectl port-forward <pod-name> 8080:80

# 查看Pod资源使用情况
kubectl top pods
kubectl top nodes

4. 命名空间操作

bash 复制代码
# 查看命名空间
kubectl get namespaces

# 创建命名空间
kubectl create namespace <namespace-name>

# 在指定命名空间操作
kubectl get pods -n <namespace-name>
kubectl apply -f deployment.yaml -n <namespace-name>

# 设置默认命名空间
kubectl config set-context --current --namespace=<namespace-name>

完整应用部署示例

1. 创建一个完整的Web应用

yaml 复制代码
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  default.conf: |
    server {
        listen 80;
        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }

2. 部署应用

bash 复制代码
# 应用配置
kubectl apply -f nginx-deployment.yaml

# 查看部署状态
kubectl get deployments
kubectl get pods
kubectl get services

# 查看服务详情
kubectl describe service nginx-service

高级特性

1. Ingress - 外部访问管理

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

2. HorizontalPodAutoscaler - 自动扩缩容

yaml 复制代码
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

3. PersistentVolume - 持久化存储

yaml 复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath:
    path: /data/mysql

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard

监控和日志

1. 资源监控

bash 复制代码
# 安装metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 查看资源使用情况
kubectl top nodes
kubectl top pods
kubectl top pods --sort-by=cpu

2. 日志收集

bash 复制代码
# 查看Pod日志
kubectl logs <pod-name>
kubectl logs -f <pod-name>
kubectl logs --previous <pod-name>  # 查看前一个容器的日志

# 查看多个Pod日志
kubectl logs -l app=nginx

故障排查

1. 常用调试命令

bash 复制代码
# 查看事件
kubectl get events
kubectl get events --sort-by=.metadata.creationTimestamp

# 检查Pod状态
kubectl get pods -o wide
kubectl describe pod <pod-name>

# 检查服务连通性
kubectl exec -it <pod-name> -- nslookup <service-name>
kubectl exec -it <pod-name> -- wget -qO- <service-name>

2. 常见问题解决

bash 复制代码
# Pod无法启动
kubectl describe pod <pod-name>  # 查看事件和状态
kubectl logs <pod-name>          # 查看容器日志

# 服务无法访问
kubectl get svc                  # 检查服务配置
kubectl get endpoints           # 检查端点

# 资源不足
kubectl top nodes               # 检查节点资源
kubectl describe node <node-name>  # 查看节点详情

最佳实践

1. 资源管理

  • 为所有容器设置资源请求和限制
  • 使用命名空间隔离环境
  • 定期清理不需要的资源

2. 安全性

  • 使用RBAC控制访问权限
  • 不在容器中以root用户运行
  • 定期更新镜像和K8s版本

3. 部署策略

  • 使用滚动更新策略
  • 配置健康检查
  • 使用ConfigMap和Secret管理配置

4. 监控和日志

  • 部署监控系统(Prometheus + Grafana)
  • 集中化日志收集(ELK Stack)
  • 设置告警规则

Kubernetes 是一个功能强大的容器编排平台,掌握这些基本概念和操作命令,就能够有效地管理和部署容器化应用程序。建议从简单的应用开始实践,逐步深入学习高级特性。

Similar code found with 1 license type

相关推荐
Most662 小时前
kubesphere安装使用
kubernetes
Kentos(acoustic ver.)4 小时前
云原生 —— K8s 容器编排系统
云原生·容器·kubernetes·云计算·k8s
__Smile°10 小时前
k8s-MongoDB 副本集部署
云原生·容器·kubernetes
Jy_062210 小时前
k8s 中的 deployment,statefulset,daemonset 控制器的区别
云原生·容器·kubernetes
果子⌂1 天前
Kubernetes 服务发布进阶
linux·运维·服务器·云原生·容器·kubernetes·云计算
Gold Steps.1 天前
K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
云原生·容器·kubernetes
许墨の小蝴蝶1 天前
k8s怎么找deploy历史版本?
kubernetes
云游1 天前
K8s:离线部署Kubernetes1.26.12及采用外部Harbor
云原生·容器·kubernetes
W@Lucky1 天前
谷粒商城篇章13--P340-P360--k8s/KubeSphere【高可用集群篇一】
云原生·容器·kubernetes·devops