昨天我们已经入门了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 创建步骤:
-
定义自定义资源类型 (CRD)。
-
创建控制器代码。
-
部署控制器。
示例:
定义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 使用步骤:
-
定义 Network Policy 资源。
-
应用 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 基本使用:
-
安装 Istio。
-
部署 Istio 代理。
-
配置 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 使用步骤:
-
创建 PV。
-
创建 PVC。
-
将 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 使用步骤:
-
创建 Storage Class。
-
在 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。
想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料