洞悉 Kubernetes 高阶奥秘:掌控资源、网络、存储,玩转容器化应用!

昨天我们已经入门了K8S,今天带大家学习一下资源、网络、存储这几个进阶的知识点模块内容。这几天陆陆续续会把K8S从头到尾讲一遍,最后会带大家实战一下,下面就开始今天的学习吧。

高级资源和控制器

Kubernetes 提供了一系列高级资源和控制器,用于满足更复杂的需求。本指南将深入探讨 StatefulSet、DaemonSet、Job 等高级资源的使用,以及自定义控制器的概念和创建,帮助您全面掌握 Kubernetes 的高级功能,并构建更强大的应用。

1. 高级资源详解

1.1 StatefulSet:

StatefulSet 用于部署和管理有状态应用,例如数据库、缓存等。它可以为每个 Pod 提供持久化存储,并保证 Pod 的顺序启动和终止。

示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-db
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-db
  template:
    metadata:
      labels:
        app: my-db
    spec:
      containers:
      - name: my-db
        image: mysql:latest
        volumeMounts:
        - name: db-data
          mountPath: /var/lib/mysql
      volumes:
      - name: db-data
        persistentVolumeClaim:
          claimName: my-db-pvc

1.2 DaemonSet:

DaemonSet 确保每个 Node 上都运行一个 Pod。它常用于部署守护进程,例如日志收集、监控等。

示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-logger
spec:
  selector:
    matchLabels:
      app: my-logger
  template:
    metadata:
      labels:
        app: my-logger
    spec:
      containers:
      - name: my-logger
        image: my-logger:latest
        volumeMounts:
        - name: log-data
          mountPath: /var/log
      volumes:
      - name: log-data
        emptyDir: {}

1.3 Job:

Job 用于运行一次性任务,例如批量处理、数据导入等。它完成后会自动清理所有 Pod。

示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  template:
    metadata:
      labels:
        app: my-job
    spec:
      containers:
      - name: my-job
        image: my-job:latest
        command: ["/bin/sh", "-c", "echo 'Hello, world!'"]

2. 自定义控制器:扩展 Kubernetes 功能

2.1 概念解析:

自定义控制器是一种扩展 Kubernetes 功能的机制。它可以监视自定义资源,并根据资源的状态执行相应的操作。

2.2 创建步骤:

  1. 定义自定义资源类型 (CRD)。

  2. 创建控制器代码。

  3. 部署控制器。

示例:

定义CRD:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: webhooks.example.com
spec:
  group: example.com
  version: v1
  names:
    kind: Webhook
    plural: webhooks
  scope: Namespaced

创建控制器代码:

package main

import (
  "fmt"
  "k8s.io/apimachinery/pkg/api/errors"
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  "k8s.io/apimachinery/pkg/runtime"
  "k8s.io/apimachinery/pkg/watch"
  "k8s.io/client-go/kubernetes"
  "k8s.io/client-go/tools/cache"
)

func main() {
  // 创建 Kubernetes 客户端
  client, err := kubernetes.NewForConfig(nil)
  if err != nil {
    fmt.Println(err)
    return
  }

  // 创建 Webhook 资源的 informer
  informer := cache.NewSharedInformerFactory(client, 0, nil).Apps().V1().Webhooks().Informer()

  // 添加事件处理函数
  informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
    // 处理新增事件
    AddFunc: func(obj interface{}) {
      webhook := obj.(*example.com/v1.Webhook)
      fmt.Println("Webhook added:", webhook.Name)
    },
    // 处理更新事件
    UpdateFunc: func(oldObj, newObj interface{}) {
      oldWebhook := oldObj.(*example.com/v1.Webhook)
      newWebhook := newObj.(*example.com/v1.Webhook)
      fmt.Println("Webhook updated:", oldWebhook.Name, newWebhook.Name)
    },
    // 处理删除事件
    DeleteFunc: func(obj interface{}) {
      webhook := obj.(*example.com/v1.Webhook)
      fmt.Println("Webhook deleted:", webhook.Name)
    },
  })

  // 启动 informer
  informer.Run(nil)

  // 等待控制器退出
  select {}
}

部署控制器:

kubectl apply -f controller.yaml

测试控制器:

kubectl create -f webhook.yaml

结果

Webhook added: my-webhook

 

高级网络和服务发现

Network Policies:精细化流量控制

a.1 概念解析:

Network Policy 是一种基于 Pod 的网络控制机制,用于限制 Pod 之间的流量。它可以帮助您提高应用安全性,并防止网络攻击。

a.2 使用步骤:

  1. 定义 Network Policy 资源。

  2. 应用 Network Policy 到 Pod。

a.3 扩展知识点:

  • Network Policy 支持多种协议,包括 TCP、UDP、ICMP 等。

  • Network Policy 可以使用标签选择器来匹配 Pod。

  • Network Policy 可以使用优先级来控制多个策略的应用顺序。

示例:

1. 定义 Network Policy 资源:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web-traffic
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - ports:
    - protocol: TCP
      port: 80
    from:
    - podSelector:
        matchLabels:
          app: frontend
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432

2. 应用 Network Policy 到 Pod:

kubectl apply -f network-policy.yaml

Service Mesh:服务治理新范式

b.1 概念解析:

Service Mesh 是一种用于控制服务间通信的专用网络。它可以提供流量路由、负载均衡、故障转移、安全认证等功能,帮助您构建更可靠、更高效的服务架构。

b.2 Istio 简介:

Istio 是最流行的 Service Mesh 之一。它提供了丰富的功能,可以帮助您轻松管理和治理服务。

b.3 Istio 基本使用:

  1. 安装 Istio。

  2. 部署 Istio 代理。

  3. 配置 Istio 路由规则。

b.4 扩展知识点:

  • Istio 支持多种流量路由策略,例如轮询、哈希、随机等。

  • Istio 可以使用负载均衡来分发流量到多个 Pod 实例。

  • Istio 可以使用故障转移来确保服务始终可用。

  • Istio 可以使用安全认证来控制服务之间的访问。

示例:

1. 安装 Istio:

kubectl apply -f istio-install.yaml

2. 部署 Istio 代理:

kubectl apply -f istio-deployment.yaml

3. 配置 Istio 路由规则:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
  - my-service.example.com
  gateways:
  - my-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: my-service
        port: 80
  - match:
    - uri:
        prefix: /api
    route:
    - destination:
        host: my-api
        port: 8080

其他高级网络和服务发现功能

  • DNS 服务: Kubernetes 提供了一个内置的 DNS 服务,可以用于将服务名称解析为 IP 地址。

  • 负载均衡: Kubernetes 可以使用多种负载均衡器来分发流量到多个 Pod 实例。

  • 服务发现: Kubernetes 提供了多种服务发现机制,例如 Service 和 Endpoints,帮助 Pod 找到其他服务。

Kubernetes 持久化存储

Kubernetes 提供了多种持久化存储机制,用于存储 Pod 的数据,即使 Pod 重新启动或终止,数据也能持久存在。下面来带兄弟们了解一下Persistent Volumes (PV) 和 Persistent Volume Claims (PVC) ,以及动态存储和 Storage Classes 的概念,帮助你们全面掌握 Kubernetes 持久化存储的精髓,并根据应用需求选择合适的存储方案。

图片

Persistent Volumes 和 Persistent Volume Claims

a.1 概念解析:

  • Persistent Volume (PV): 由管理员预先配置的存储资源,可以被 Pod 使用。

    • 回收策略

      • retain:保留策略,当删除pvc的时候,保留pv与外部存储资源。

      • delete:删除策略,当与pv绑定的pvc被删除的时候,会从k8s集群中删除pv对象,并执行外部存储资源的删除操作。

      • resycle(已废弃)

    • pv状态迁移

      • available --> bound --> released

    • 特点:

      • 容量:存储空间大小,例如 1Gi。

      • 访问模式:Pod 如何访问 PV,例如 ReadWriteOnce(读写一次)或 ReadOnlyMany(只读多)。

      • 存储类型:本地磁盘、网络存储、云存储等。

      • 绑定状态:PV 可以处于未绑定或已绑定状态。

  • Persistent Volume Claim (PVC): Pod 对存储资源的请求,可以绑定到 PV 上。

    • 特点:

      • 存储类:定义 PV 的类型和特性,例如性能、可用性等。

        • 资源需求:Pod 所需的存储空间大小,例如 1Gi。

    • 绑定状态:PVC 可以处于未绑定、绑定或正在绑定状态。

a.2 使用步骤:

  1. 创建 PV。

  2. 创建 PVC。

  3. 将 PVC 绑定到 Pod。

a.3 完整示例:

1. 创建 PV:

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

2. 创建 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: my-storage-class
  resources:
    requests:
      storage: 1Gi

3. 将 PVC 绑定到 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-app
    image: my-app:latest
    volumeMounts:
    - name: my-data
      mountPath: /data
  volumes:
  - name: my-data
    persistentVolumeClaim:
      claimName: my-pvc

动态存储和 Storage Classes

b.1 概念解析:

  • 动态存储: Kubernetes 可以自动创建和管理 PV,无需管理员手动配置。

    • 实现: 使用存储供应器(Provisioner)来创建 PV,例如 Kubernetes 本身的 GCE PD 供应器或其他第三方供应器。

    • 优势: 简化 PV 管理,提高运维效率。

  • Storage Class: 用于定义存储资源的类型和特性,例如性能、可用性等。

    • 作用: 为 PVC 提供选择依据,让 Pod 可以根据需求选择合适的存储类型。

    • 参数: 不同存储类型支持不同的参数,例如本地磁盘的类型、云存储的区域等。

b.2 使用步骤:

  1. 创建 Storage Class。

  2. 在 PVC 中指定 Storage Class。

b.3 完整示例:

1. 创建 Storage Class:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-storage-class
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zone: us-central1-a

2. 在 PVC 中指定 Storage Class:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: my-storage-class
  resources:
    requests:
      storage: 1Gi

VolumeAttachment

VolumeAttachment 记录了pv的相关挂载信息,如挂载到哪个node节点,由哪个volume plugin来挂载等。

AD Controller 创建一个 VolumeAttachment,而 External-attacher 则通过观察该 VolumeAttachment,根据其状态属性来进行存储的挂载和卸载操作。

apiVersion: storage.k8s.io/v1
kind: VolumeAttachment
metadata:
  name: csi-123456
spec:
  attacher: cephfs.csi.ceph.com
  nodeName: 192.168.1.10
  source:
    persistentVolumeName: pvc-123456
status:
  attached: true

 

CSINode

CSINode 记录了csi plugin的相关信息(如nodeId、driverName、拓扑信息等)。

当Node Driver Registrar向kubelet注册一个csi plugin后,会创建(或更新)一个CSINode对象,记录csi plugin的相关信息。

apiVersion: storage.k8s.io/v1
kind: CSINode
metadata:
  name: 192.168.1.10
spec:
  drivers:
  - name: cephfs.csi.ceph.com
    nodeID: 192.168.1.10
    topologyKeys: null
  - name: rbd.csi.ceph.com
    nodeID: 192.168.1.10
    topologyKeys: null

其他持久化存储选项

  • Local Persistent Volumes: 使用本地磁盘作为存储。

  • Network Storage: 使用 NFS、GlusterFS 等网络存储系统。

  • Cloud Storage: 使用 AWS EBS、Azure Disk 等云存储服务


今天深入探讨了 K8S 高级资源和控制器、高级网络和服务发现、持久化存储等功能的使用,并提供了详细的示例,帮助兄弟们进一步的全面掌握 Kubernetes 的高级功能。

关注我,让我们一起继续深入讨论K8S。

想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值