Kubernetes (k8s) 实战指南

Kubernetes 是当前最流行的容器编排平台,广泛应用于生产环境。以下从集群部署、应用管理、监控调试等方面提供实战指导。

集群部署

使用 kubeadm 快速部署生产级集群。准备至少 2 台 Linux 机器(1 master + 1 worker),确保系统满足以下要求:

  • 2GB 以上内存
  • 2核以上CPU
  • 禁用 swap 分区
  • 唯一主机名和MAC地址

在所有节点安装 docker 和 kubeadm:

# 安装docker
apt-get update && apt-get install -y docker.io

# 安装kubeadm
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl

在 master 节点初始化集群:

kubeadm init --pod-network-cidr=10.244.0.0/16

在 worker 节点加入集群(使用 init 命令输出的 join 指令):

kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>

安装网络插件(以 flannel 为例):

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

应用部署

通过 Deployment 管理 Pod 副本。创建 nginx 部署示例:

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.14.2
        ports:
        - containerPort: 80

使用 Service 暴露应用。创建 ClusterIP 和 NodePort 服务:

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

存储管理

使用 PersistentVolume 和 PersistentVolumeClaim 管理持久化存储。创建本地存储示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1

创建对应的 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-local
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: local-storage

监控与日志

使用 Prometheus 和 Grafana 搭建监控系统。通过 Helm 快速安装:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack

查看 Pod 日志:

kubectl logs <pod-name> -n <namespace>

实时查看多个容器日志:

kubectl logs -f <pod-name> -c <container-name> --tail=100

故障排查

常见问题诊断命令:

  • 查看 Pod 详细状态:
kubectl describe pod <pod-name>

  • 检查集群事件:
kubectl get events --sort-by=.metadata.creationTimestamp

  • 进入容器调试:
kubectl exec -it <pod-name> -- /bin/sh

  • 检查网络连通性:
kubectl run busybox --image=busybox --rm -it --restart=Never -- ping <service-name>

安全实践

实施最小权限原则。创建 ServiceAccount 和 Role:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: limited-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
subjects:
- kind: ServiceAccount
  name: limited-user
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

启用网络策略控制 Pod 间通信:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

自动伸缩

配置 HPA 实现自动扩缩容:

kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10

查看 HPA 状态:

kubectl get hpa

CI/CD 集成

在 Jenkins 中配置 Kubernetes 插件,使用如下 Pipeline 示例:

pipeline {
  agent {
    kubernetes {
      label 'jenkins-agent'
      yaml """
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: jnlp
            image: jenkins/inbound-agent:4.3-4
          - name: docker
            image: docker:19.03
            command: ['cat']
            tty: true
          - name: kubectl
            image: bitnami/kubectl:1.17
            command: ['cat']
            tty: true
        """
    }
  }
  stages {
    stage('Build') {
      steps {
        container('docker') {
          sh 'docker build -t my-app .'
        }
      }
    }
    stage('Deploy') {
      steps {
        container('kubectl') {
          sh 'kubectl apply -f k8s-manifests/'
        }
      }
    }
  }
}

更多推荐