洞悉 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。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

请编程输出无向无权图各个顶点的度 ← 链式前向星存图

【题目描述】请利用链式前向星存图,编程输出无向无权图各个顶点的度。【输入样例】 5 6 1 3 2 1 1 4 2 3 3 4 5 1【输出样例】 4 2 3 2 1【算法分析】 本例需要用到基于链式前向星的广度优先搜索(BFS)。 链式前向星广度优先搜索(B…

JavaScript 实现飞机大战

文章目录 一些关键点概览:核心模块的具体实现示例:飞机类(Plane)的基本结构:子弹类(Bullet)的基本结构:敌机类(Enemy)的基本结构: 基于前面定义的…

Idea创建Maven项目

Maven安装配置步骤: 解压安装 bin目录 : 存放的是可执行命令。(mvn 命令重点关注) conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改) lib目录 :存放Maven依赖的j…

Python快速入门系列-2(Python的安装与环境设置)

第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

bat文件给多个Android设备安装apk

本文是安装一个apk 1、确保以下3个文件在同一个目录下 1>要安装的apk,这里是mmb.apk 2>设备名单,保存在.txt文件中,一行一个设备名,设备名通过adb devices获取,截图中是两个设备 txt文件中的样式 3>要运行…

基于springboot实现大学外卖管理系统项目【项目源码+论文说明】

基于springboot实现大学外卖管理系统演示 摘要 如今,信息化不断的高速发展,社会也跟着不断进步,现今的社会,各种工作都离不开信息化技术,更离不开电脑的管理。信息化技术也越来越渗透到各小型的企业和公司中&#xff…

AI 资讯 | GPT-4 时代终结!Claude 3 一举成为地表最强 AI 模型,今天就能用上!

AI 的飞速发展,对开发者而言意义重大。为此,我们精心筛选了最新 AI 相关资讯与大家分享交流。 未来,Apifox 也将时刻关注 AI 领域发展动态,及时呈现全面的 AI 资讯,与大家一起把握 AI 机遇。希望 在这些资讯中&#xf…

3.9Code

基于顺序存储结构的图书信息表的图书去重 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;int …

J8 - Inception v1算法

目录 理论知识Inception卷积计算 模型结构模型实现inception 结构GoogLeNet模型打印模型结构 模型效果总结与心得体会 理论知识 GoogLeNet首次出现就在2014年的ILSVRC比赛中获得冠军&#xff0c;最初的版本为InceptionV1。共有22层深&#xff0c;参数量5M。 可以达到同时期VGG…

【C++进阶】哈希的应用 --- 布隆过滤器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

申请公众号上限是多少

一般可以申请多少个公众号&#xff1f;公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因&#xff0c;确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个&#xff0c;对于新媒体公司来说&#xff0c;这导致做不了公…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的种类&#xff1a; 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…

【Python+Selenium学习系列5】Selenium特殊元素定位之-鼠标悬停操作

前言 Selenium模拟用户在浏览器中的操作&#xff0c;比如点击按钮。在某些场景下&#xff0c;我们需要模拟鼠标悬停的操作&#xff0c;来触发一些隐藏的元素。本文将介绍Python Selenium实现鼠标悬停操作。 鼠标悬停&#xff0c;即当光标与其名称表示的元素重叠时触发的事件&…

菜鸟笔记-14Python绘图颜色使用

Python中绘图主要依赖于各种库&#xff0c;其中matplotlib是最常用且功能强大的一个。在matplotlib中&#xff0c;你可以使用各种颜色来表示不同的数据点、线条或填充区域。下面我将详细介绍如何在Python中使用matplotlib来设置绘图颜色&#xff0c;并给出具体的例子。 14.1颜…

HTML5:七天学会基础动画网页10

继续介绍3D转换: 3D转换:rotate3d 方法与说明 rrotateX(angle)otate3d(x,y,z,angle[角度]) 3D转换&#xff0c;正常取值0/1&#xff0c;0代表当前轴线不进行旋转&#xff0c;1反之&#xff0c;例:rotate3d(1,1,1,30deg)&#xff0c;代表三个轴线都要旋转30度 rotate3d(0…

.text .data .bss .stack 和 heap

.text .data .bss .stack 和 heap 1.1 代码->可执行文件1.2 ELF可执行文件的结构1.3 内存区域1.4 各段在内存中的位置 1.1 代码->可执行文件 一个程序从代码到可执行文件的过程&#xff0c;包括 预处理、编译、汇编&#xff0c;链接。可执行文件有多重类型&#xff0c;有…

深入解读可视化运维的内容、领域、价值和系统搭建

大家好&#xff0c;我是贝格前端工场&#xff0c;接触过很多可视化运维项目&#xff0c;包括IT、电力、物流、生产制造等&#xff0c;本文系统总结一下可视化运维相关知识&#xff0c;老规矩别忘了关注转发&#xff0c;有事请私信。 一、可视化运维定义 可视化运维是指通过可视…

寻找完全平方数——浮点数陷阱

【题目描述】 输出所有形如aabb的4位完全平方数&#xff08;即前两位数字相等&#xff0c;后两位数字也相等&#xff09;。 【解析】 一、问题分析 从问题出发&#xff0c;题目要求输出的是满足一定条件的数。数在计算机中是要占存储空间的&#xff0c;要在计算机中表示一个…

linux 查看打开使用了哪些端口

你可以使用 netstat 命令来查看Linux系统中正在使用的端口。例如&#xff0c;要查看所有正在使用的TCP和UDP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tulpn如果你只想查看所有正在使用的TCP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tpln 如果你只…

滴滴一面:Keepalived+Nginx高可用,如何实现IP跳跃?(1)

尼恩说在前面 HashMap的工作原理是目前java面试问的较为常见的问题之一&#xff0c;在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格&#xff0c;遇到很多很重要的面试…