Kubernetes速成指南:从入门到实践

全面介绍Kubernetes核心概念、组件架构和实用技巧,帮助读者快速掌握容器编排技术。

Kubernetes速成指南:从入门到实践

引言

Kubernetes(简称K8s)是当今最流行的容器编排平台,已成为云原生技术栈的核心组件。它能够自动化容器的部署、扩展和管理,极大地简化了微服务架构的运维工作。本文将带领读者快速了解Kubernetes的核心概念、架构组件、常用命令和实践技巧,帮助你在短时间内掌握这一强大的技术。

一、Kubernetes基础概念

1.1 什么是Kubernetes?

Kubernetes是一个开源的容器编排平台,由Google公司开发并捐赠给Cloud Native Computing Foundation(CNCF)。它的名称来源于希腊语,意为"舵手"或"飞行员",寓意着它对容器集群的掌控能力。

Kubernetes的主要功能包括:

  • 容器自动部署和扩缩容
  • 服务发现和负载均衡
  • 存储编排
  • 自动滚动更新和回滚
  • 自动完成装箱计算
  • 自我修复(自动重启失败容器)
  • 密钥和配置管理

1.2 核心概念

在深入Kubernetes之前,需要了解以下核心概念:

Pod

Pod是Kubernetes中最小的部署单元,一个Pod可以包含一个或多个容器,这些容器共享网络命名空间和存储卷。Pod中的容器总是被一起调度到同一节点上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

Service

Service是一种抽象,定义了一组Pod的访问方式。它提供了稳定的IP地址和DNS名称,负载均衡流量到后端Pod。

Deployment

Deployment是最常用的工作负载控制器,它提供了声明式的Pod管理,可以轻松实现Pod的部署、扩缩容和更新。

ReplicaSet

ReplicaSet确保在任何时候都有指定数量的Pod副本正在运行。

Namespace

Namespace提供了资源隔离机制,可以将集群资源划分为多个命名空间,避免资源命名冲突。

ConfigMap和Secret

ConfigMap用于存储非敏感的配置信息,Secret用于存储敏感信息(如密码、密钥等)。

Volume

Volume是Pod中容器可访问的文件目录,支持多种存储后端。

二、Kubernetes架构

2.1 控制平面组件

控制平面负责集群的全局决策和监控,包含以下组件:

API Server

API Server是Kubernetes控制平面的前端,提供了HTTP RESTful API,是所有组件交互的枢纽。

etcd

etcd是一个分布式键值存储系统,保存了整个集群的状态信息。

Scheduler

Scheduler负责监视新创建的未分配Pod,并选择合适的节点来运行它们。

Controller Manager

Controller Manager运行各种控制器,如Node Controller(节点控制器)、Replication Controller(副本控制器)、Endpoints Controller(端点控制器)等,负责维护集群的期望状态。

2.2 节点组件

节点组件在每个工作节点上运行,负责维护Pod并提供Kubernetes运行环境:

kubelet

kubelet是运行在每个节点上的代理,确保容器按照PodSpec运行。

kube-proxy

kube-proxy是网络代理,维护节点上的网络规则,实现服务的负载均衡。

Container Runtime

容器运行时负责容器的实际运行,支持Docker、containerd、CRI-O等。

三、快速上手Kubernetes

3.1 环境搭建

本地开发环境

对于学习和开发,可以使用以下工具快速搭建Kubernetes环境:

  • Minikube:单一节点的Kubernetes集群,适合本地开发和测试

    1
    
    minikube start
    
  • kind (Kubernetes in Docker):在Docker容器内运行Kubernetes集群

    1
    
    kind create cluster
    
  • Docker Desktop:内置了Kubernetes支持,开启后即可使用

生产环境

生产环境可以使用以下工具部署Kubernetes集群:

  • kubespray:基于Ansible的自动化部署工具
  • k3s:轻量级Kubernetes发行版,适合边缘计算和资源受限环境
  • 云厂商托管服务:如GKE、EKS、AKS等

3.2 配置kubectl

kubectl是Kubernetes的命令行工具,用于与Kubernetes集群交互。配置步骤:

  1. 安装kubectl
  2. 配置kubeconfig文件(通常位于~/.kube/config
  3. 验证连接
1
2
3
4
5
# 验证集群连接
kubectl cluster-info

# 查看节点
kubectl get nodes

四、常用kubectl命令

4.1 基本命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看资源列表
kubectl get pods
kubectl get services
kubectl get deployments
kubectl get nodes

# 查看资源详情
kubectl describe pod <pod-name>
kubectl describe service <service-name>

# 创建资源
kubectl apply -f <file-name.yaml>

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

# 查看日志
kubectl logs <pod-name>
kubectl logs -f <pod-name>  # 实时查看日志

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

4.2 进阶命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 扩展Deployment
kubectl scale deployment <deployment-name> --replicas=3

# 更新Deployment镜像
kubectl set image deployment/<deployment-name> <container-name>=<new-image>

# 回滚Deployment
kubectl rollout undo deployment/<deployment-name>

# 查看资源标签
kubectl get pods --show-labels

# 给资源添加标签
kubectl label pods <pod-name> key=value

# 查看节点污点
kubectl describe nodes | grep Taints

# 给节点添加污点
kubectl taint nodes <node-name> key=value:NoSchedule

五、常见工作负载

5.1 Deployment

Deployment是最常用的工作负载,用于管理无状态应用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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

5.2 StatefulSet

StatefulSet用于管理有状态应用,如数据库:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-statefulset
spec:
  serviceName: "mysql"
  replicas: 3
  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-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

5.3 DaemonSet

DaemonSet确保所有(或某些)节点都运行一个Pod的副本,常用于日志收集、监控等:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-ds
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:v1.4-debian-1

六、网络模型

6.1 Kubernetes网络模型要求

Kubernetes网络模型有以下要求:

  • Pod之间可以直接通信,无需使用NAT
  • 节点可以与Pod直接通信
  • Pod内部看到的IP地址应该与外部看到的一致

6.2 常用网络插件

  • Calico:基于BGP的网络方案,提供高性能网络和网络策略
  • Flannel:简单易用的overlay网络方案
  • Cilium:基于eBPF的网络和安全解决方案
  • Weave Net:简单的多主机容器网络

6.3 服务类型

Kubernetes提供了多种服务类型:

  • ClusterIP:默认类型,创建集群内部可访问的服务
  • NodePort:在所有节点上打开一个端口,转发到服务
  • LoadBalancer:使用云厂商的负载均衡器,创建外部可访问的服务
  • ExternalName:通过CNAME记录将服务映射到外部域名

七、存储系统

7.1 卷类型

Kubernetes支持多种卷类型:

  • emptyDir:简单的空目录,Pod删除时数据丢失
  • hostPath:挂载节点上的文件或目录
  • PersistentVolumeClaim:持久化存储的抽象
  • ConfigMapSecret:挂载配置和敏感信息
  • CSI:容器存储接口,支持各种存储系统

7.2 PersistentVolume和PersistentVolumeClaim

PersistentVolume (PV) 是集群中的一块存储,可以由管理员静态创建,也可以由StorageClass动态创建。

PersistentVolumeClaim (PVC) 是用户对存储的请求,类似于Pod对CPU和内存的请求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2

# 创建PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

八、安全最佳实践

8.1 Pod安全策略

使用Pod Security Context限制容器权限:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
  containers:
  - name: nginx
    image: nginx
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true

8.2 网络策略

使用NetworkPolicy控制Pod间通信:

1
2
3
4
5
6
7
8
9
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

8.3 密钥管理

使用Secret存储敏感信息,但避免将敏感数据直接写入YAML文件:

1
2
3
4
# 创建Secret
kubectl create secret generic db-credentials --from-literal=username=admin --from-literal=password=secret

# 在Pod中使用Secret

九、监控与日志

9.1 监控

  • Prometheus:开源监控系统,收集和存储指标数据
  • Grafana:可视化监控数据
  • cAdvisor:容器资源使用监控

9.2 日志

  • ELK Stack:Elasticsearch、Logstash、Kibana
  • EFK Stack:Elasticsearch、Fluentd、Kibana
  • Loki:轻量级日志聚合系统

十、Kubernetes实战技巧

10.1 故障排除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看Pod事件
kubectl describe pod <pod-name>

# 检查节点资源
kubectl describe node <node-name>

# 查看集群事件
kubectl get events --sort-by=.metadata.creationTimestamp

# 检查DNS解析
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes.default

10.2 性能优化

  • 使用资源请求和限制
  • 合理设置Pod优先级
  • 使用HorizontalPodAutoscaler实现自动扩缩容
  • 优化存储访问模式

10.3 CI/CD集成

Kubernetes与CI/CD工具结合,可以实现自动化部署:

  • Jenkins:通过Jenkins Pipeline实现自动化部署
  • GitLab CI/CD:与GitLab无缝集成
  • ArgoCD:GitOps持续部署工具
  • Flux:GitOps工具,与Kubernetes深度集成

总结

本文介绍了Kubernetes的核心概念、架构组件、常用命令和实践技巧,希望能帮助读者快速入门Kubernetes。Kubernetes是一个功能强大且复杂的系统,需要不断实践和学习才能掌握。建议读者在学习过程中多动手实验,通过解决实际问题来加深理解。

在云原生时代,掌握Kubernetes已成为运维工程师和开发人员的必备技能。通过合理使用Kubernetes,可以显著提高应用的可靠性、可扩展性和运维效率,为企业数字化转型提供有力支持。

延伸学习资源

CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计