第一部分Service 与服务发现一、Service 概述解决的问题Pod 是临时资源IP 会变化Deployment 动态创建销毁 Pod客户端无法直接追踪 Pod 地址。Service 的核心作用提供固定的虚拟 IP 和端口为 Pod 提供负载均衡屏蔽后端 Pod 变化对客户端透明二、Service 基本管理创建 Deploymentkubectl create deployment web--imagehttpd--replicas3创建 ClusterIP 类型 Servicekubectl createserviceclusterip web--tcp8080:80# --tcp8080:80 表示访问 Service 的 8080 端口转发到 Pod 的 80 端口验证负载均衡# 修改每个 Pod 主页后循环访问查看分发情况foriin{1..60};docurl-s10.103.19.150:8080;done|sort|uniq-c关键点Service 通过Selector标签选择器关联 Pod只要 Pod 标签匹配无论通过 Deployment 还是kubectl run创建都会被 Service 纳入后端kubectl expose可通过--selector指定标签选择器三、Service 发现的三种方式1. 通过 IP 访问直接使用 Service 的 ClusterIP:Port 访问。2. 通过环境变量访问Service 创建后Kubernetes 会向 Pod 注入环境变量MYSQL_SERVICE_HOST10.111.69.45 MYSQL_SERVICE_PORT3306Pod 中可通过$(MYSQL_SERVICE_HOST)引用。限制Service 必须先于 Pod 创建环境变量才会注入。3. 通过 DNS 名称访问推荐CoreDNS 为 Service 自动添加 DNS 记录SERVICE_NAME.NAMESPACE.svc.cluster.local 同一 namespace 可简写为SERVICE_NAME四、Service 类型类型说明适用场景ClusterIP仅集群内部访问默认内部服务通信NodePort通过节点物理端口暴露30000-32767外部访问、测试环境LoadBalancer云厂商 LB ClusterIP NodePort生产环境外部访问ExternalNameDNS CNAME 映射到外部域名访问外部服务HeadlessClusterIPNone无负载均衡StatefulSet 直接访问 PodNodePort 端口说明nodePort节点监听的端口物理机端口portClusterIP 监听的端口targetPortPod 监听的端口五、会话保持Session Affinity配置方式kubectl patch svc web-p{spec:{sessionAffinity:ClientIP}}工作原理首次访问记录客户端 IP 与 Pod 的映射关系后续请求转发到同一个 Pod默认超时时间 10800 秒3 小时适用场景有状态服务Web 登录状态、WebSocket、购物车六、金丝雀发布核心思路通过标签区分版本Service 通过标签选择器同时关联稳定版和灰度版通过调整副本数控制流量比例。# 稳定版标签 track: stable# 灰度版标签 track: canary# Service 选择器app: web, tier: frontend流量比例控制kubectl scale deployment web-28--replicas8# 稳定版 80% 流量kubectl scale deployment web-29--replicas2# 灰度版 20% 流量第二部分kube-proxy 工作原理一、三种工作模式对比模式地位性能适用场景iptables默认模式中服务数 1000小规模集群IPVS推荐模式极高服务数 10w中大规模生产Userspace已废弃低仅兼容旧版二、IPVS 模式生产推荐特点基于内核哈希表查找效率 O(1)支持多种调度算法rr轮询、wrr加权轮询、lc最少连接、sh源地址哈希切换 IPVS 模式# 修改 ConfigMapkubectl edit configmap-nkube-system kube-proxy# 将 mode 改为 ipvs# 重启 kube-proxykubectl rollout restart daemonset-nkube-system kube-proxy# 验证kubectl logs-nkube-system kube-proxy-xxx|grepUsing ipvs Proxier查看 IPVS 规则ipvsadm-LntService-IP:Port调度算法与 sessionAffinity 的关系Service 配置sessionAffinity: ClientIP→ IPVS 自动使用sh算法不配置时使用scheduler指定的算法如rr三、iptables 模式默认核心流程客户端访问 ClusterIP →KUBE-SERVICES链 →KUBE-SVC-XXX服务链概率负载均衡→KUBE-SEP-XXX端点链DNAT→ 后端 Pod性能瓶颈每增加一个 Service/Endpoint 就增加规则超过 1000 个服务时规则链膨胀CPU 飙升。第三部分Ingress一、Ingress 概述解决的问题NodePort 端口有限且不便于管理LoadBalancer 成本高需要七层路由能力域名、路径分流。核心概念Ingress 资源定义路由规则相当于 Nginx 配置Ingress Controller实际处理流量的负载均衡器相当于 Nginx 进程工作流程Controller 监听 Ingress 资源变化 → 生成 Nginx 配置 → reload二、Ingress 规则实践1. 多域名虚拟主机apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:multi-host-ingressspec:ingressClassName:nginxrules:-host:webapp01.laoma.cloudhttp:paths:-path:/pathType:Prefixbackend:service:name:webapp01port:number:80-host:webapp02.laoma.cloudhttp:paths:-path:/pathType:Prefixbackend:service:name:webapp02port:number:802. 同一域名多路径分流rules:-host:www.laoma.cloudhttp:paths:-path:/pathType:Prefixbackend:service:name:webapp01port:number:80-path:/gamespathType:Prefixbackend:service:name:webapp02port:number:803. 路径重写生产常用metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target:/$1nginx.ingress.kubernetes.io/use-regex:truespec:rules:-host:www.laoma.cloudhttp:paths:-path:/webapp01/(.*)pathType:ImplementationSpecificbackend:service:name:webapp01port:number:804. HTTPS 强制跳转# 生成自签名证书openssl genrsa-outwww.key2048openssl req-new-keywww.key-outwww.csr-subj/CNwww.laoma.cloudopenssl x509-req-days3650-inwww.csr-signkeywww.key-outwww.crt# 创建 Secretkubectl create secret tls www-tls--certwww.crt--keywww.keymetadata:annotations:nginx.ingress.kubernetes.io/ssl-redirect:truenginx.ingress.kubernetes.io/force-ssl-redirect:truespec:tls:-hosts:-www.laoma.cloudsecretName:www-tlsrules:-host:www.laoma.cloudhttp:paths:-path:/pathType:Prefixbackend:service:name:webapp01port:number:80三、生产常用注解速查注解作用force-ssl-redirect: true80 端口强制跳转 HTTPSrewrite-target: /$1路径重写剥离路由前缀whitelist-source-range: 10.0.0.0/8IP 白名单访问控制limit-rps: 20单 IP 每秒请求数限流limit-connections: 50单 IP 最大并发连接数enable-cors: true开启跨域proxy-read-timeout: 60读超时设置x-forwarded-for: true透传真实客户端 IP第四部分Kubernetes 网络策略NetworkPolicy一、核心概念默认行为所有 Pod 入站和出站流量都允许非隔离。隔离机制一旦 Pod 被 NetworkPolicy 选中该方向的流量默认变为拒绝只放行策略中明确允许的流量。策略相加性多个 NetworkPolicy 的规则是累加的不会冲突。二、核心字段spec:podSelector:# 策略作用的 Pod空表示 namespace 所有 PodmatchLabels:role:dbpolicyTypes:# Ingress 入站 / Egress 出站-Ingress-Egressingress:# 入站规则-from:# 来源-podSelector:{}# 同 namespace 的 Pod-namespaceSelector:{}# 其他 namespace 的 Pod-ipBlock:# IP 网段cidr:10.0.0.0/16except:-10.0.1.0/24ports:# 端口限制-protocol:TCPport:6379egress:# 出站规则-to:-ipBlock:cidr:10.0.0.0/24三、常见场景配置1. 允许特定 Pod 访问同 namespaceingress:-from:-podSelector:matchLabels:run:testports:-protocol:TCPport:802. 允许特定 namespace 访问ingress:-from:-namespaceSelector:matchLabels:project:myprojectports:-protocol:TCPport:803. 允许所有 namespace 访问ingress:-from:-namespaceSelector:{}4. IP 网段限制ingress:-from:-ipBlock:cidr:10.1.8.0/24except:-10.1.8.128/265. 默认拒绝所有入站流量spec:podSelector:{}policyTypes:-Ingress# 不配置 ingress 规则默认全部拒绝四、注意事项需要支持 NetworkPolicy 的网络插件如 Calico策略是白名单机制只能添加允许规则不能显式拒绝ipBlock对 Service IP 可能失效因为 SNAT/DNAT 发生在策略评估之前无法阻塞 localhost 或节点到 Pod 的流量第五部分Pod 调度Scheduler一、调度流程过滤Filter找到满足 Pod 资源、端口、选择器等需求的节点打分Score对候选节点按规则评分选最高分节点绑定Bind将 Pod 绑定到选中的节点二、控制 Pod 运行位置的四种方式方式优先级说明nodeName最高直接指定节点名不推荐nodeSelector推荐基于节点标签的简单选择节点亲和性灵活支持软硬约束、复杂表达式Pod 亲和性/反亲和性高级基于已有 Pod 的调度约束三、节点亲和性nodeAffinity两种类型requiredDuringSchedulingIgnoredDuringExecution硬约束必须满足preferredDuringSchedulingIgnoredDuringExecution软约束尽量满足示例affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:CPUoperator:Invalues:-L1-L2preferredDuringSchedulingIgnoredDuringExecution:-weight:1preference:matchExpressions:-key:MEMoperator:Invalues:-L1-L2支持的操作符In、NotIn、Exists、DoesNotExist、Gt、Lt四、Pod 间亲和性/反亲和性关键概念topologyKey拓扑域标签如kubernetes.io/hostname、topology.kubernetes.io/zonelabelSelector匹配已有 Pod 的标签**示例Pod 反亲和性每个节点最多一个副本**raffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:appoperator:Invalues:-storetopologyKey:kubernetes.io/hostname五、污点Taint与容忍度Toleration关系类比nodeAffinity Pod 选 NodeTaint Node 选 Pod污点效果effect值说明NoSchedule新 Pod 不能调度上来已有 Pod 不受影响PreferNoSchedule软性 NoSchedule尽量不调度NoExecute新 Pod 不能调度已有不匹配 Pod 立即驱逐设置污点kubectl taint nodes worker31CPUL1:NoSchedule kubectl taint nodes worker31 CPU:NoSchedule-# 移除Pod 容忍度tolerations:-key:CPUoperator:Equalvalue:L1effect:NoSchedule多污点匹配规则过滤掉匹配的污点后剩余污点中存在任一NoSchedule则 Pod 不能调度到该节点。内置污点自动添加node.kubernetes.io/not-ready节点未就绪node.kubernetes.io/unreachable节点不可达node.kubernetes.io/memory-pressure内存压力node.kubernetes.io/disk-pressure磁盘压力六、节点维护操作命令作用kubectl cordon NODE标记节点不可调度新 Pod 不会调度上来kubectl uncordon NODE恢复节点可调度kubectl drain NODE驱逐节点上所有 Pod cordon用于维护drain 常用选项kubectl drain worker31 --ignore-daemonsets# 忽略 DaemonSet 管理的 Podkubectl drain worker31 --pod-selectorappweb# 只驱逐特定 Pod第六部分Metrics Server一、功能与定位用途收集 Node 和 Pod 的 CPU、内存资源使用指标通过 Metrics API 提供给 HPA水平自动扩缩容使用支持kubectl top命令查看资源使用定位仅用于自动扩缩容不适用于监控告警系统。二、部署wgethttps://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml# 添加 kubelet-insecure-tls 跳过证书验证sed-i/metric-resolution/a\ - --kubelet-insecure-tlscomponents.yaml# 替换镜像地址sed-is/registry.k8s.io/hub.laoma.cloud/gcomponents.yaml kubectl apply-fcomponents.yaml三、使用# 查看节点资源使用kubectltopnodeNAME CPU(cores)CPU% MEMORY(bytes)MEMORY% master30.laoma.cloud 97m4% 1328Mi35%# 查看 Pod 资源使用kubectltoppods-nkube-system单位说明1 CPU 1000m毫核环境清理命令汇总kubectl delete ns services kubectl delete ns network web laoma kubectl delete ns scheduler kubectl delete ns metric kubectl delete ns ingress核心命令速查命令说明kubectl create service clusterip NAME --tcpport:targetPort创建 ClusterIP Servicekubectl expose deployment NAME --portport --target-porttargetPort --typeType暴露 Servicekubectl get svc查看 Servicekubectl describe svc NAME查看 Service 详情含 Endpointskubectl patch svc NAME -p {spec:{sessionAffinity:ClientIP}}开启会话保持kubectl get cm -n kube-system kube-proxy -o yaml查看 kube-proxy 配置kubectl get netpol查看 NetworkPolicykubectl label nodes NODE KEYVALUE给节点打标签kubectl taint nodes NODE KEYVALUE:EFFECT给节点打污点kubectl cordon/drain/uncordon NODE节点维护操作kubectl top node/pod查看资源使用需 Metrics Server