一、Kubernetes 入门基础

Kubernetes 是一个开源的容器编排平台,就好比是一个超级大管家,能帮我们管理好多好多的容器。容器呢,你可以把它想象成一个个小盒子,里面装着应用程序和它运行所需要的环境。

1. 安装 Kubernetes

要开始学习 Kubernetes,首先得把它安装到你的电脑或者服务器上。这里以在 Linux 系统上安装为例。

技术栈:Linux

# 安装 Docker(Kubernetes 依赖 Docker)
sudo apt-get update
sudo apt-get install docker.io -y

# 配置 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 安装 kubeadm、kubelet 和 kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

这段代码的作用是先安装 Docker,因为 Kubernetes 依赖 Docker 来运行容器。然后配置 Docker 服务,让它开机自启。接着安装 kubeadm、kubelet 和 kubectl 这三个 Kubernetes 的重要组件。

2. 基本概念

Kubernetes 有几个很重要的基本概念,比如 Pod、Node 和 Deployment。

Pod

Pod 是 Kubernetes 中最小的可部署单元,你可以把它看成是一组紧密关联的容器。举个例子,假如你有一个 Web 应用和一个数据库,它们可以放在同一个 Pod 里。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: web-container
    image: nginx  # 使用 Nginx 镜像
    ports:
    - containerPort: 80  # 暴露 80 端口

这个 YAML 文件定义了一个名为 my-pod 的 Pod,里面有一个使用 Nginx 镜像的容器,并且暴露了 80 端口。

Node

Node 是 Kubernetes 集群中的一个工作节点,就像是一个工人,负责运行 Pod。一个集群可以有多个 Node。

Deployment

Deployment 是用来管理 Pod 的,它可以保证 Pod 按照我们期望的数量运行。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3  # 期望运行 3 个 Pod
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx
        ports:
        - containerPort: 80

这个 YAML 文件定义了一个名为 my-deployment 的 Deployment,期望运行 3 个 Pod,每个 Pod 里有一个使用 Nginx 镜像的容器。

二、Kubernetes 中级进阶

1. 服务发现与负载均衡

在 Kubernetes 里,服务发现和负载均衡是很重要的功能。服务发现可以让不同的 Pod 之间相互找到对方,负载均衡可以把请求均匀地分配到多个 Pod 上。

技术栈:Kubernetes

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

这个 YAML 文件定义了一个名为 my-service 的 Service,它会把请求转发到带有 app: my-app 标签的 Pod 上,并且使用 LoadBalancer 类型的服务来实现负载均衡。

2. 存储管理

Kubernetes 提供了多种存储方式,比如 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)。

PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/my-pv

这个 YAML 文件定义了一个名为 my-pv 的 PV,它的存储容量是 1GB,访问模式是 ReadWriteOnce,回收策略是 Retain,使用 hostPath 存储。

PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

这个 YAML 文件定义了一个名为 my-pvc 的 PVC,它请求 500MB 的存储,访问模式是 ReadWriteOnce。

3. 配置管理

Kubernetes 可以通过 ConfigMap 和 Secret 来管理应用的配置。

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  app.properties: |
    database.url=jdbc:mysql://localhost:3306/mydb
    database.username=root
    database.password=password

这个 YAML 文件定义了一个名为 my-config 的 ConfigMap,里面包含了一个应用的配置信息。

Secret

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: cm9vdA==  # base64 编码的 root
  password: cGFzc3dvcmQ=  # base64 编码的 password

这个 YAML 文件定义了一个名为 my-secret 的 Secret,里面包含了用户名和密码的 base64 编码。

三、Kubernetes 高级应用

1. 自动伸缩

Kubernetes 可以根据应用的负载情况自动调整 Pod 的数量。

技术栈:Kubernetes

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

这个 YAML 文件定义了一个名为 my-hpa 的 HorizontalPodAutoscaler,它会根据 CPU 利用率自动调整 my-deployment 的 Pod 数量,最小为 1 个,最大为 10 个,当 CPU 利用率达到 50% 时就会进行伸缩。

2. 滚动更新与回滚

Kubernetes 支持滚动更新和回滚应用。

滚动更新

kubectl set image deployment/my-deployment my-container=nginx:1.19

这个命令会把 my-deployment 里的 my-container 镜像更新为 nginx:1.19,Kubernetes 会逐个替换 Pod,实现滚动更新。

回滚

kubectl rollout undo deployment/my-deployment

这个命令可以把 my-deployment 回滚到上一个版本。

3. 安全管理

Kubernetes 有很多安全机制,比如 RBAC(基于角色的访问控制)。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

这个 YAML 文件定义了一个名为 pod-reader 的 Role,它可以在 default 命名空间里对 Pod 进行 get、watch 和 list 操作。

四、Kubernetes 应用场景

1. 微服务架构

在微服务架构中,Kubernetes 可以很好地管理各个微服务的容器。比如一个电商系统,有商品服务、订单服务、用户服务等,每个服务都可以打包成容器,使用 Kubernetes 进行部署和管理。

2. 大数据处理

Kubernetes 可以用于大数据处理场景,比如运行 Hadoop、Spark 等大数据框架。可以根据任务的负载情况动态调整资源,提高资源利用率。

3. 人工智能训练

在人工智能训练场景中,Kubernetes 可以管理训练任务的容器,根据训练的进度和资源需求进行调度。

五、Kubernetes 技术优缺点

优点

  • 自动化管理:Kubernetes 可以自动管理容器的部署、伸缩、更新等,大大提高了开发和运维的效率。
  • 高可用性:通过副本机制和自动故障转移,保证应用的高可用性。
  • 可扩展性:可以轻松地添加或删除节点和 Pod,适应不同的业务需求。

缺点

  • 学习成本高:Kubernetes 有很多概念和组件,学习起来比较复杂。
  • 部署和维护复杂:需要一定的技术能力和经验来部署和维护 Kubernetes 集群。

六、注意事项

1. 资源管理

要合理分配资源,避免资源浪费和不足。可以根据应用的需求设置合适的资源请求和限制。

2. 安全配置

要重视安全配置,比如使用 RBAC 进行访问控制,加密敏感数据等。

3. 版本兼容性

要注意 Kubernetes 各个组件的版本兼容性,避免出现版本不兼容导致的问题。

七、文章总结

Kubernetes 是一个非常强大的容器编排平台,它可以帮助我们更好地管理容器化应用。从入门的基础概念和安装,到中级的服务发现、存储管理和配置管理,再到高级的自动伸缩、滚动更新和安全管理,Kubernetes 提供了丰富的功能。在实际应用中,Kubernetes 适用于微服务架构、大数据处理和人工智能训练等场景。虽然它有一些缺点,比如学习成本高和部署维护复杂,但只要我们掌握了正确的学习路径和注意事项,就可以充分发挥它的优势。