Kubernetes 技术栈的深度解析,涵盖架构设计、核心组件、生态工具及二次开发实践,结合实战案例说明其内在关联:
kubectl apply
→ API Server → etcd 持久化# Calico 配置示例(/etc/cni/net.d/10-calico.conf)
{
"name": "k8s-pod-network",
"cniVersion": "0.3.1",
"plugins": [{
"type": "calico",
"etcd_endpoints": "http://etcd:2379"
}]
}
helm install my-app ./chart --set replicaCount=3 # 部署时覆盖参数
type EtcdCluster struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata"`
Spec EtcdSpec `json:"spec"` // 期望状态
Status EtcdStatus `json:"status"` // 实际状态
}
定义 CRD(redis-operator.yaml):
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: redisclusters.redis.io
spec:
scope: Namespaced
group: redis.io
versions: [{name: v1, served: true, storage: true}]
names: {kind: RedisCluster, plural: redisclusters}
Controller 核心逻辑(伪代码):
func Reconcile(ctx context.Context, req Request) (Result, error) {
cluster := &redisv1.RedisCluster{}
if err := client.Get(ctx, req.NamespacedName, cluster); err != nil {
return Result{}, err
}
// 检查集群状态
currentNodes := getRedisNodes(cluster)
if len(currentNodes) < cluster.Spec.Replicas {
createRedisPod(cluster) // 扩容
}
updateStatus(cluster, currentNodes) // 更新 Status
return Result{RequeueAfter: 5*time.Minute}, nil
}
部署与测试:
kubectl apply -f redis-cluster-cr.yaml # 创建自定义资源实例
kubectl get redisclusters # 查看 Operator 维护状态
实战建议:从修改 kube-scheduler 策略(如自定义调度器)或开发简单 Operator(如 MySQL 备份)入手,逐步深入 K8s 内核开发。
以下是 Kubernetes 技术栈各组件的核心作用解析,结合生产级实战案例说明其协作关系:
// 监听 Pod 创建事件
informer := cache.NewSharedIndexInformer(
&cache.ListWatch{},
&v1.Pod{},
30*time.Second,
cache.Indexers{},
)
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
pod := obj.(*v1.Pod)
fmt.Println("Detected new Pod:", pod.Name)
},
})
kubectl get pods
命令卡顿# 检查 etcd 集群状态
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 endpoint status
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: cuda-container
resources:
limits:
nvidia.com/gpu: 2 # 请求 2 张 GPU 卡
nodeSelector:
accelerator: nvidia-tesla-p100 # 选择 GPU 节点
journalctl -u kubelet | grep “Failed to start container”
# 常见原因:镜像拉取失败/存储卷挂载冲突
# 查看 IPVS 规则
ipvsadm -Ln | grep -A 1 10.96.0.1 # ClusterIP 为 10.96.0.1 的服务
技术 | 作用 |
---|---|
Namespace | 网络/进程/挂载点隔离 |
Cgroups | 限制 CPU/内存/磁盘 I/O |
OverlayFS | 容器分层文件系统 |
# 查看容器进程树
docker run -d --name test nginx
pstree -a $(pgrep docker) # 显示 containerd-shim 子进程
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-db-access
spec:
podSelector:
matchLabels: role: frontend
policyTypes: [Egress]
egress:
- to:
- podSelector:
matchLabels: role: backend # 只允许访问 backend
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: db-snapshot
spec:
volumeSnapshotClassName: ebs-snapclass
source:
persistentVolumeClaimName: mysql-pvc # 备份 PVC
mychart/
├── values.yaml # 默认参数
├── Chart.yaml # 版本描述
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # 模板函数
└── charts/ # 子Chart依赖
func (r *RedisClusterReconciler) Reconcile() {
// 检测集群状态
currentMasters := countRedisMasters()
if currentMasters < 3 {
r.createRedisPod("master") // 自动修复
}
// 滚动升级处理
if cluster.Spec.Version != runningVersion {
upgradeRedisCluster()
}
}
终极实践建议:在 K8s 二次开发时,优先通过 API Server 扩展 CRD 和 Controller(Operator),而非修改内核源码。例如开发一个 MySQL 备份 Operator,通过 CronJob 定时触发 mysqldump 并推送至 S3。
Helm 是 Kubernetes 的 包管理工具,核心作用在于解决应用在 K8s 上的 定义、部署、版本控制 问题,大幅简化复杂应用的交付流程。以下通过其核心能力结合实战场景展开说明:
templates/
目录)values.yaml
集中管理参数(如镜像版本、副本数)# values.yaml
replicaCount: 3
image: nginx:1.25 # 仅修改此处即可升级版本
Chart.yaml
中声明依赖项(如 dependencies: - name: mysql
)helm install my-site bitnami/wordpress \
--set mariadb.enabled=true # 自动部署依赖的 MariaDB
helm install/upgrade
生成带版本号的 Release(记录当前部署状态)# 升级到新版本
helm upgrade my-app ./app-chart -f values-v2.yaml
# 检查历史
helm history my-app
# 回滚到版本2
helm rollback my-app 2
helm.sh/hook: pre-install
)apiVersion: batch/v1
kind: Job
metadata:
name: db-init
annotations:
"helm.sh/hook": pre-install # 在安装主应用前执行
my-chart/
├── values-dev.yaml # 开发环境(低资源)
├── values-prod.yaml # 生产环境(高可用配置)
└── templates/
helm install dev-env ./my-chart -f values-dev.yaml
helm install prod-env ./my-chart -f values-prod.yaml
helm package ./app-chart # 打包
helm push app-chart.tgz my-repo # 推送
helm search repo my-repo/nginx
helm install my-nginx my-repo/nginx
# _helpers.tpl(通用模板函数)
{{- define "securityContext" -}}
securityContext:
runAsNonRoot: true # 强制非 root 运行
{{- end -}}
containers:
- name: app
{{- include "securityContext" . | nindent 12 }}
graph TD
A[开发者] --> |1. 编写模板| B(Helm Chart)
B --> |2. 注入配置| C(values.yaml)
C --> |3. helm install| D[K8s API Server]
D --> |4. 渲染为实际 YAML| E[Deployment/Service等资源]
E --> |5. 创建 Release 记录| F[Helm Storage
(Secrets/ConfigMap)]
D --> |6. 部署应用| G[K8s 集群]
技术本质:Helm 的核心是 模板引擎 + 版本化状态管理,将 K8s 资源部署从“手工操作”升级为“软件工程化”。
问题场景 | 传统 K8s 方案 | Helm 方案 |
---|---|---|
部署多个关联组件 | 手动依次应用多份 YAML | helm install 一键安装依赖 |
应用升级 | 手动修改 YAML 并重新应用 | helm upgrade 自动化更新 |
回滚故障版本 | 重新部署旧版 YAML(易出错) | helm rollback 精准回滚 |
多环境参数管理 | 复制并修改多份 YAML | -f values-env.yaml 动态切换 |
结论:Helm 是 Kubernetes 应用交付的事实标准工具,尤其在微服务架构、持续交付流水线中大幅降低复杂度。