Kubernetes 高级运维与有状态应用管理核心

📅 2026/7/7 5:45:42
Kubernetes 高级运维与有状态应用管理核心
一、Kubernetes 授权管理Authorization1.1 API 访问控制全景每个 API 请求必经三阶段认证Authentication确认请求者身份普通用户或 ServiceAccount。鉴权Authorization基于策略判定操作许可RBAC/ABAC/Node/Webhook 等。准入控制Admission Control对请求进行修改或验证如 LimitRanger、PodSecurityPolicy。Kubernetes不存储普通用户对象用户信息由外部认证插件如 X509 证书、OIDC、Webhook提供集群仅信任由 CA 签发的证书中的 CNCommon Name作为用户名。1.2 用户认证实战X509 客户端证书客户端准备# 安装 kubectl版本与集群一致aptinstall-ykubectl1.30.2-1.1# 生成私钥和 CSR证书签名请求openssl genrsa-outlaoma.key2048openssl req-new-keylaoma.key-outlaoma.csr-subj/CNlaoma/Okubernetes管理员签署证书并生成 kubeconfig# 使用集群 CA 签名openssl x509-req-inlaoma.csr-CA/etc/kubernetes/pki/ca.crt-CAkey/etc/kubernetes/pki/ca.key-CAcreateserial-outlaoma.crt-days1095# 方法一基于模板使用 kubectl config 命令设置集群、凭据、上下文kubectl config set-cluster kubernetes--kubeconfigconfig --certificate-authorityca.crt --embed-certs--serverhttps://10.1.8.30:6443 kubectl config set-credentials laoma--kubeconfigconfig --client-keylaoma.key --client-certificatelaoma.crt --embed-certs kubectl config set-context laomakubernetes--kubeconfigconfig--clusterkubernetes--userlaoma--namespacedefault绑定权限与回收# 授予 cluster-admin 权限kubectl create clusterrolebinding laoma-admin--clusterrolecluster-admin--userlaoma# 删除权限后用户即被禁止kubectl delete clusterrolebinding laoma-admin⚠️ 删除 ClusterRoleBinding 后用户立即失去权限但证书仍有效可通过 CA 黑名单彻底吊销。1.3 RBAC 鉴权模型鉴权模式kube-apiserver 通过--authorization-modeNode,RBAC启用。四种内置模式AlwaysAllow、AlwaysDeny、Node节点专用、ABAC、RBAC、Webhook。核心资源对象类型作用域用途RoleNamespace定义特定命名空间内的操作权限ClusterRole集群定义集群级或跨命名空间的权限RoleBindingNamespace将 Role 绑定到用户/组/SAClusterRoleBinding集群将 ClusterRole 绑定到用户/组/SARole 定义示例apiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:namespace:defaultname:pod-rolerules:-apiGroups:[]# 核心 API 组resources:[pods]verbs:[get,list,watch]关键字段说明apiGroups空字符串代表核心组v1apps代表 Deployment 等batch代表 Job/CronJob。resources可指定子资源如pods/status、deployments/scale。resourceNames限定具体资源实例如--resource-namereadablepod。verbs常见操作get、list、watch、create、update、patch、delete、deletecollection、exec。ClusterRole 与预定义角色view只读权限get/list/watch于绝大多数资源。edit在 view 基础上增加 create/update/patch/delete。admin命名空间内几乎所有资源的完整权限。cluster-admin集群超级管理员权限。绑定示例# RoleBinding命名空间内绑定kubectl create rolebinding default-pod-laoma--rolepod-role--userlaoma-ndefault# ClusterRoleBinding集群绑定kubectl create clusterrolebinding laoma-pod-role--clusterrolepod-role--userlaoma 实践要点ClusterRole 若绑定到特定命名空间的用户依然拥有集群级权限因为 ClusterRole 本身就是集群范围仅通过 RoleBinding 限定时实际只赋予该命名空间内的权限。1.4 服务账户ServiceAccount本质Pod 中进程访问 API 的身份标识由 Kubernetes API 管理。与用户账号区别用户账号针对人集群范围服务账户针对 Pod命名空间范围。默认行为每个命名空间存在defaultSAPod 自动挂载令牌卷Token Volume。令牌机制演进v1.22使用 TokenRequest API 获取短期、绑定 Pod 生命周期的令牌默认 1 小时通过投射卷挂载。旧版基于 Secret 的长期令牌kubernetes.io/service-account-token仍可手动创建但推荐短期令牌。SA 创建与授权kubectl create sa sa1-nauth kubectl create clusterrolebinding auth-sa1-cluster-admin--clusterrolecluster-admin--serviceaccountauth:sa1# 在 Pod 中指定 SAspec: serviceAccountName: sa1手动创建长期 Secret 令牌不推荐生产apiVersion:v1kind:Secretmetadata:name:sa1-secretannotations:kubernetes.io/service-account.name:sa1type:kubernetes.io/service-account-token二、Kubernetes Dashboard 与 Kuboard2.1 Kuboard第三方 UI推荐自学特点多集群管理、LDAP/GitHub 认证、微服务分层展示、图形化编辑 YAML、监控/日志套件、操作审计。安装方式独立容器适用于生产mkdir/kuboard-data nerdctl run-d--namekuboard-p80:80-p10081:10081\-eKUBOARD_ENDPOINThttp://10.1.8.30:80\-eKUBOARD_AGENT_SERVER_TCP_PORT10081\-v/kuboard-data:/data\eipwork/kuboard:v3默认登录admin / Kuboard123导入集群~/.kube/config后即可管理。2.2 Kubernetes Dashboard官方 Web UI部署wgethttps://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml kubectl apply-frecommended.yaml暴露访问NodePort 方式kubectl edit svc kubernetes-dashboard-nkubernetes-dashboard# 修改 type: NodePort登录令牌获取新版只支持 Bearer Token# 创建管理员 SA 并绑定 cluster-admincatdashboard-admin.yamlEOF apiVersion: v1 kind: ServiceAccount metadata: name: kubernetes-dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard-admin namespace: kubernetes-dashboard EOFkubectl apply-fdashboard-admin.yaml kubectl-nkubernetes-dashboard create token kubernetes-dashboard-admin Token 默认有效期 24 小时过期需重新生成。权限分析默认 Dashboard 部署的 SAkubernetes-dashboard仅绑定了一个低权限 Role只能操作 secrets/configmaps/proxy因此默认 Token 无法查看 Pod。需通过上方管理员 SA 获取完整权限。三、动态卷供应Dynamic Volume Provisioning3.1 核心概念静态卷管理员提前手动创建 PV。动态卷用户创建 PVC 时系统根据StorageClass自动调用Provisioner制备器创建对应 PV 并绑定。3.2 StorageClass存储套餐关键字段provisioner制备器名称内置如kubernetes.io/aws-ebs或第三方如rancher.io/local-path、fuseim.pri/ifs。reclaimPolicyDeletePVC 删除时自动清理后端存储或Retain保留数据。volumeBindingModeImmediatePVC 创建即绑定适用于共享存储。WaitForFirstConsumer延迟绑定等首个 Pod 调度后再创建 PV适用于本地存储确保节点亲和性。mountOptions挂载附加参数如debug、noatime。allowVolumeExpansion是否允许 PVC 扩容。3.3 部署 Local Path Provisioner本地存储适用场景使用节点本地磁盘作为存储后端。wgethttps://github.com/rancher/local-path-provisioner/blob/v0.0.35/deploy/local-path-storage.yaml kubectl apply-flocal-path-storage.yaml验证# 创建 PVC 并关联 Deploymentkubectl create-f-EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: local-path-pvc spec: storageClassName: local-path accessModes: [ReadWriteOnce] resources: requests: storage: 5Gi EOF⚠️ 因volumeBindingMode: WaitForFirstConsumerPVC 会保持 Pending 直到 Pod 调度完成之后 PV 会在 Pod 所在节点的/opt/local-path-provisioner/下创建目录。3.4 部署 NFS ProvisionerNFS 存储NFS 无内置 Provisioner需部署外部制备器。步骤概览搭建 NFS 服务器共享/shares。创建 ServiceAccount 和 RBAC 权限操作 PV/PVC/Events 等。部署 Deployment镜像registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2环境变量指定 NFS 服务器和路径。创建 StorageClassprovisioner设为fuseim.pri/ifs与 Deployment 中PROVISIONER_NAME一致。StorageClass 示例apiVersion:storage.k8s.io/v1kind:StorageClassmetadata:name:nfs-storageprovisioner:fuseim.pri/ifsreclaimPolicy:DeleteallowVolumeExpansion:truevolumeBindingMode:Immediateparameters:onDelete:retain# 保留数据测试验证创建 PVC 后自动生成 NFS 子目录如/shares/default-webclaim-pvc-uid/挂载到 Pod 后数据可持久化。四、StatefulSet 有状态应用管理4.1 无状态 vs 有状态对比特性无状态Deployment有状态StatefulSet身份随机名称可互换固定序号如 mysql-0网络共享 Service IPHeadless Service 固定 DNSpod-name.service-name存储可选共享卷每个 Pod 独立 PVCvolumeClaimTemplates扩缩容任意并行顺序缩容从大到小顺序扩容从小到大更新滚动更新无顺序按序号倒序更新可设置 partition4.2 StatefulSet 核心组件Headless ServiceclusterIP: None为 Pod 提供 DNS 记录格式pod-name.service-name.namespace.svc.cluster.local。volumeClaimTemplates为每个 Pod 自动生成 PVC命名规则template-name-statefulset-name-ordinal。有序 Pod 管理创建/删除/更新均按序号顺序执行确保依赖关系。4.3 实践案例案例1Nginx 静态内容集群3 副本Headless ServiceapiVersion:v1kind:Servicemetadata:name:nginxspec:clusterIP:Noneselector:app:nginxports:-port:80StatefulSet 与 PVC 模板apiVersion:apps/v1kind:StatefulSetmetadata:name:nginxspec:serviceName:nginxreplicas:3template:spec:containers:-name:nginximage:nginxvolumeMounts:-name:nginx-datamountPath:/usr/share/nginx/htmlvolumeClaimTemplates:-metadata:name:nginx-dataspec:storageClassName:nfs-storageaccessModes:[ReadWriteOnce]resources:requests:storage:10Gi验证每个 Pod 拥有独立 PVC 和 NFS 子目录删除重建后数据依然存在且 DNS 解析稳定。案例2Etcd 集群3 节点静态 PV关键环境变量用于集群发现env:-name:ETCD_NAMEvalueFrom:fieldRef:fieldPath:metadata.name-name:ETCD_INITIAL_CLUSTERvalue:etcd-0http://etcd-0.etcd.statefulset.svc.cluster.local:2380,etcd-1...,etcd-2...-name:ETCD_INITIAL_ADVERTISE_PEER_URLSvalue:http://$(ETCD_NAME).etcd.statefulset.svc.cluster.local:2380验证集群成员kubectlexecetcd-0 -- etcdctl member list删除 Pod 后重新加入集群成员 ID 不变因数据持久化。案例3Redis 主从 Sentinel1 主 2 从利用 StatefulSet 序号判断角色redis-0为主其余为从。启动脚本动态生成redis.conf和sentinel.conf从节点配置replicaof redis-0.redis...。Sentinel 监控主节点实现自动故障切换。验证主从kubectlexecredis-0 -- redis-cli-aredis123 info replication故障切换测试删除redis-0Sentinel 会将某个从节点提升为新主。案例4MySQL 5.7 主从2 节点静态 PV需注意生产环境密码应使用 Secret不可明文。验证持久化创建数据库后删除 Pod重建后数据仍然存在因 PVC 保留。主从同步配置需额外初始化脚本主节点执行CHANGE MASTER TO...语句本笔记中未展开留作扩展。4.4 StatefulSet 注意事项配置变更限制serviceName、volumeClaimTemplates等字段不可直接修改需删除重建PVC 可保留。缩容风险按序号从大到小删除若需保留数据建议提前备份 PV。存储选型测试可用 NFS生产建议使用高可用存储如 Ceph RBD、云盘以避免单点故障。升级策略支持RollingUpdate默认和OnDelete可通过spec.updateStrategy.rollingUpdate.partition控制灰度更新序号。五、环境清理与资源回收最佳实践删除命名空间可一键清理所有资源kubectl delete ns ns。动态 PVreclaimPolicy: Delete删除 PVC 后自动清理后端存储数据若使用Retain需手动清理。清理 NFS 存储残留目录时注意匹配 PVC UID避免误删其他数据。各类示例中清理命令汇总kubectl delete stsnamekubectl delete svcheadless-svc[cluster-svc]kubectl delete pvcpvc-name-0pvc-name-1... kubectl deletepvpv-name-0...rm-rf/shares/subdir/*