从零实战K8s:基于Minikube的容器化应用部署与Helm管理指南

news2026/5/1 2:10:56
1. 从零到一为什么我们需要一个实战导向的K8s教程如果你在搜索引擎里敲下“Kubernetes 教程”大概率会得到两种结果一种是官方文档那种严谨但略显枯燥的“百科全书”另一种是各种博客里零散的“最佳实践”片段。前者体系完整但上手门槛高容易让人迷失在概念海洋里后者虽然实用但缺乏连贯性新手很难拼凑出完整的知识地图。我自己在学习和教授K8s的过程中深感这种割裂。很多朋友卡在“理论都懂一动手就懵”的尴尬境地这正是我动手整理这个实战教程库的初衷。这个名为guangzhengli/k8s-tutorials的项目核心目标非常明确通过一行行可运行的代码和渐进式的修改带你亲手把一套服务从最简单的容器一路部署成由 Helm 管理的、可在 K8s 集群中稳定运行的生产级应用。它不谈空泛的理论而是聚焦于container-pod-deployment-service-ingress-configmap/secret-helm这条清晰的进阶路径。每一个环节你都会先写一段 YAML 或代码然后运行它观察结果再修改它理解背后的“为什么”。这种“做中学”的方式是掌握任何复杂系统最有效的方法。本教程假设你已有基本的容器概念知道 Docker 是什么但对 K8s 的具体操作感到陌生。它将是你从“知道 K8s 名词”到“能在 K8s 上部署和管理应用”之间的那座桥。无论你是开发人员想把自己的服务上云还是运维工程师需要拓展技能栈这个循序渐进的实战指南都能提供直接的帮助。接下来我们就从最基础的准备工作开始一步步搭建起你的实验环境。2. 环境准备打造你的专属K8s实验沙盒在开始敲代码之前一个稳定、隔离的实验环境至关重要。我们不建议直接在公有云或生产环境里摸索那样成本高且风险大。本地搭建一个轻量级 K8s 集群是最佳选择。2.1 核心工具选型为什么是 Minikube 和 Docker对于本地开发和学习Minikube 是公认的首选。它是一个工具能在你的笔记本电脑上快速创建一个单节点的 Kubernetes 集群。它模拟了多节点集群的核心功能但资源消耗小启动速度快。与之相对的是kind(Kubernetes in Docker) 或k3s它们也各有优势。我选择 Minikube 作为教程环境主要基于以下几点考量生态成熟文档丰富Minikube 历史最久遇到任何问题几乎都能在社区找到解决方案这对初学者极其友好。最接近生产环境Minikube 创建的集群组件如 kube-apiserver, etcd与生产环境使用的更为相似学到的经验迁移性更好。驱动灵活它支持 Docker、Hyper-V、VirtualBox 等多种驱动能适应不同操作系统macOS, Linux, Windows。而容器运行时我们选择 Docker。虽然 K8s 已经支持 containerd 等更多运行时但 Docker 的桌面版Docker Desktop在 macOS 和 Windows 上提供了开箱即用的体验并且集成了 Kubernetes 支持虽然我们不用它的 K8s 功能。在 Linux 上安装 Docker Engine 也很简单。它是目前最普及的容器工具链学习和排查问题时的社区资源也最多。注意确保你的机器满足基本要求。建议至少 2 核 CPU、4GB 内存和 20GB 空闲磁盘空间。虚拟机软件如 VirtualBox如果你在 Windows 或 Linux 上使用 Minikube 的 VirtualBox 驱动也需要提前安装好。2.2 一步步安装与初始化下面是在 macOS/Linux 系统上使用 Homebrew 安装的步骤。Windows 用户可以通过 Chocolatey 或直接下载安装包逻辑类似。# 1. 安装 Docker Desktop (或 Docker Engine) # 访问 https://www.docker.com/products/docker-desktop 下载并安装。 # 安装后启动 Docker确保它在运行。 # 2. 安装 Minikube # 使用 Homebrew 是最简单的方式 brew install minikube # 3. 启动 Minikube 集群 # 这里我们指定使用 docker 作为驱动并分配稍多的资源以保证流畅度 minikube start --driverdocker --memory4096 --cpus2 # 4. 验证集群状态 minikube status运行minikube status后你应该看到host,kubelet,apiserver都是Running状态。第一次启动会下载镜像需要一些时间。接下来我们需要一个命令行工具来与集群交互那就是kubectl。# 安装 kubectl brew install kubectl # 验证安装并配置 kubectl version --client # Minikube 会自动为 kubectl 配置好上下文context指向它创建的集群 kubectl cluster-info看到 Kubernetes control plane 的地址信息说明kubectl已经能成功连接到你的 Minikube 集群了。2.3 可选但强烈推荐的效率工具k9s在终端里反复输入kubectl get pods、kubectl describe pod xxx会很繁琐。k9s是一个终端 UI 工具它提供了交互式界面来查看和管理你的 K8s 资源像看仪表盘一样直观。# 安装 k9s brew install derailed/k9s/k9s # 运行 k9s k9s进入k9s后你可以用方向键选择资源类型Pod、Deployment、Service等回车键查看详情d键查看描述l键查看日志s键进入 Pod 的 shell。它极大提升了日常管理和问题排查的效率尤其适合在教程中观察资源状态的变化。至此你的实验沙盒就准备好了。它包含了一个单节点 K8s 集群Minikube、容器运行时Docker、集群管理客户端kubectl以及一个可视化终端k9s。接下来我们将从 K8s 世界的“原子”——容器开始。3. 基石篇理解容器与 PodKubernetes 不直接运行容器它管理的是 Pod。但要想理解 Pod必须先搞清楚容器。这一章我们从编写一个最简单的 Go 语言 Web 服务开始把它装进容器再放进 Pod。3.1 从代码到容器镜像首先我们创建一个简单的 HTTP 服务器。新建一个目录hellok8s并在里面创建main.gopackage main import ( fmt net/http ) func main() { http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, Hello, Kubernetes! Im running in a container.\n) }) fmt.Println(Server starting on port 3000...) http.ListenAndServe(:3000, nil) }这个服务会在 3000 端口响应一个简单的文本。接下来我们需要一个 Dockerfile 来定义如何构建容器镜像# 使用官方的轻量级 Go 镜像作为构建环境 FROM golang:1.19-alpine AS builder WORKDIR /app COPY . . # 静态链接减少运行时依赖生成一个独立的可执行文件 RUN go build -o hellok8s main.go # 使用更小的运行时镜像 FROM alpine:latest WORKDIR /root/ # 从构建阶段复制可执行文件 COPY --frombuilder /app/hellok8s . # 暴露端口 EXPOSE 3000 # 启动命令 CMD [./hellok8s]这个 Dockerfile 采用了多阶段构建最终生成的镜像只包含alpine系统和我们的可执行文件体积非常小约 10MB。在项目根目录执行构建docker build -t hellok8s:v1 .-t参数给镜像打上标签hellok8s:v1。构建完成后可以运行测试docker run -d -p 3000:3000 --name test-hellok8s hellok8s:v1 curl http://localhost:3000 # 应该输出Hello, Kubernetes! Im running in a container.测试成功后停止并删除这个测试容器docker rm -f test-hellok8s。实操心得养成给镜像打上明确版本标签如v1,latest的习惯。在生产中避免使用latest因为它是流动的可能导致不可预期的部署。使用具体的版本号或 Git 提交哈希是更佳实践。3.2 创建你的第一个 PodPod 是 K8s 中最小的可部署单元它可以包含一个或多个紧密关联的容器。现在我们为这个单容器应用创建一个 Pod 定义文件pod.yamlapiVersion: v1 kind: Pod metadata: name: hellok8s-pod spec: containers: - name: hellok8s-container image: hellok8s:v1 ports: - containerPort: 3000这个 YAML 文件定义了一个 Pod其元数据metadata中的名字是hellok8s-pod。在规约spec中我们定义了一个容器使用我们刚刚本地构建的镜像hellok8s:v1并声明容器内部监听 3000 端口。由于我们使用的是本地构建的镜像Minikube 内部的 Docker 守护进程是访问不到我们主机上的镜像的。有两种解决方案1) 将镜像推送到公共/私有仓库2) 让 Minikube 使用主机的 Docker 守护进程或者直接构建到 Minikube 的 Docker 环境中。这里我们用第二种更简便的方法# 确保 Minikube 使用宿主机的 Docker 环境如果启动时未指定默认就是 eval $(minikube docker-env) # 重新构建镜像这次会直接存入 Minikube 的 Docker 环境 docker build -t hellok8s:v1 . # 应用 Pod 配置 kubectl apply -f pod.yaml使用kubectl get pods查看 Pod 状态等到STATUS变为Running。然后我们可以通过kubectl port-forward将 Pod 的端口映射到本地来访问服务kubectl port-forward pod/hellok8s-pod 8080:3000在另一个终端执行curl http://localhost:8080就能看到和之前容器测试一样的结果了。恭喜你的第一个 Pod 正在 K8s 里运行注意事项kubectl port-forward是一个强大的调试工具但它只是临时的隧道不适合生产访问。生产环境需要通过 Service 来暴露服务。另外直接管理 Pod 是脆弱的如果 Pod 所在的节点宕机Pod 就消失了且不会自动恢复。因此我们几乎从不直接创建裸 Pod而是通过更高层级的控制器来管理比如接下来要讲的 Deployment。4. 进阶管理使用 Deployment 与 Service裸 Pod 缺乏自愈和扩缩容能力。Deployment 是管理 Pod 副本集ReplicaSet的控制器它为我们提供了声明式的更新、回滚以及最重要的——副本数量维护能力。4.1 用 Deployment 管理 Pod 生命周期让我们创建一个deployment.yaml来替代之前的裸 PodapiVersion: apps/v1 kind: Deployment metadata: name: hellok8s-deployment spec: replicas: 2 # 指定我们想要运行 2 个相同的 Pod 副本 selector: matchLabels: app: hellok8s # 这个选择器必须匹配下面 template 中的 labels template: # 这是 Pod 的模板 metadata: labels: app: hellok8s # 给 Pod 打上标签便于 Service 识别 spec: containers: - name: hellok8s-container image: hellok8s:v1 ports: - containerPort: 3000应用这个配置kubectl apply -f deployment.yaml。然后观察变化kubectl get deployments kubectl get pods你会看到名为hellok8s-deployment的 Deployment以及它创建的两个 Pod名字会带有随机后缀。Deployment 确保始终有 2 个 Pod 实例在运行。你可以尝试删除其中一个 Podkubectl delete pod pod-name观察几秒后Deployment 控制器会立刻创建一个新的 Pod 来满足replicas: 2的期望状态。这就是自愈能力。滚动更新演示现在我们修改main.go的输出信息为Hello, Kubernetes! Im from Deployment v2.构建新镜像hellok8s:v2并更新deployment.yaml中的image字段为hellok8s:v2再次应用。K8s 会执行滚动更新逐步用新 Pod 替换旧 Pod期间服务不会中断。可以通过kubectl rollout status deployment/hellok8s-deployment来观察更新过程。4.2 引入 Service为 Pod 提供稳定的网络端点Pod 是短暂的IP 地址会变。Service 定义了一组 Pod 的逻辑集合和访问它们的策略。我们创建一个service.yamlapiVersion: v1 kind: Service metadata: name: hellok8s-service spec: selector: app: hellok8s # 这个选择器匹配 Deployment 中 Pod 的标签 ports: - port: 80 # Service 对集群内暴露的端口 targetPort: 3000 # Pod 容器内监听的端口 type: ClusterIP # 默认类型仅在集群内部可访问应用它kubectl apply -f service.yaml。现在在集群内部其他 Pod 或组件可以通过服务名hellok8s-service和端口80来访问我们的应用而不需要关心后端具体是哪个 Pod 的 IP。我们可以进入一个临时 Pod 来测试服务发现kubectl run curl-test --imageradial/busyboxplus:curl -i --tty --rm在打开的临时容器 shell 中执行curl hellok8s-service:80你将看到来自后端某个 Pod 的响应。Service 的负载均衡器会自动将请求分发到后端的健康 Pod 上。常见问题如果curl命令返回Connection refused请检查1) Service 的selector是否与 Pod 的labels完全匹配2) 目标 Pod 的containerPort是否与 Service 的targetPort一致3) Pod 内的应用是否真的在指定端口上成功启动查看 Pod 日志kubectl logs pod-name。4.3 向外暴露服务NodePort 与 LoadBalancerClusterIP类型的 Service 只能在集群内访问。要让外部流量进来有两种常用方式。NodePort在每个集群节点上打开一个静态端口默认范围 30000-32767并将该端口的流量转发到 Service。# 修改 service.yaml或新建一个 service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: hellok8s-service-nodeport spec: selector: app: hellok8s ports: - port: 80 targetPort: 3000 nodePort: 30080 # 手动指定节点端口可选在范围内即可 type: NodePort应用后你可以通过Minikube-IP:30080访问服务。获取 Minikube IPminikube ip。LoadBalancer在支持云提供商负载均衡器的环境中如 AWS, GCP, AzureK8s 可以自动创建一个外部负载均衡器并将流量导向 Service。在 Minikube 中可以通过minikube tunnel命令来模拟这个功能需要管理员权限运行# 先将 Service 类型改为 LoadBalancer kubectl patch svc hellok8s-service -p {spec:{type:LoadBalancer}} # 在另一个终端运行隧道命令 minikube tunnel运行kubectl get svc在EXTERNAL-IP列会显示一个 IP如 10.96.0.0通过这个 IP 和端口 80 即可访问。minikube tunnel命令会创建一个网络路由将主机流量导向集群的 LoadBalancer。实操心得在本地开发测试时NodePort最直接。minikube tunnel虽然能模拟LoadBalancer但有时会不太稳定如果遇到问题重启命令或检查网络配置。在生产环境LoadBalancer是托管于云上的标准方式而NodePort通常作为其底层机制或用于特定边缘场景。5. 高级路由与配置Ingress 与 ConfigMap/Secret当你有多个服务需要对外提供时为每个服务都创建LoadBalancer成本高昂且管理不便。Ingress 充当了集群入口的智能路由层。同时应用配置和敏感信息也不应硬编码在镜像中ConfigMap 和 Secret 就是为此而生。5.1 使用 Ingress 定义路由规则Ingress 本身不是服务它是一组规则需要一个Ingress Controller来具体实现这些规则。Minikube 内置了 Nginx Ingress Controller启用它minikube addons enable ingress等待所有相关的 Pod 变为 Running 状态kubectl get pods -n ingress-nginx。假设我们有两个服务hellok8s-servicev1版本和另一个假设的hellok8s-v2-service。我们创建一个ingress.yaml来根据访问路径进行路由apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hellok8s-ingress spec: rules: - host: hellok8s.local # 本地测试用的域名 http: paths: - path: / pathType: Prefix backend: service: name: hellok8s-service port: number: 80 - path: /v2 pathType: Prefix backend: service: name: hellok8s-v2-service # 假设这是 v2 版本的服务 port: number: 80应用配置kubectl apply -f ingress.yaml。为了让本地浏览器能解析hellok8s.local需要修改本机的 hosts 文件/etc/hosts或C:\Windows\System32\drivers\etc\hosts添加一行minikube-ip hellok8s.local获取minikube-ip用minikube ip。现在访问http://hellok8s.local会路由到 v1 服务访问http://hellok8s.local/v2则会路由到 v2 服务你需要先部署对应的 v2 服务。Ingress 实现了基于主机名和路径的七层路由是管理外部访问的推荐方式。5.2 使用 ConfigMap 管理应用配置将配置与代码分离是十二要素应用的原则。ConfigMap 用于存储非机密的配置数据。例如我们的 Go 服务可以读取一个环境变量来决定返回的消息。修改main.gopackage main import ( fmt net/http os ) func main() { message : os.Getenv(HELLO_MESSAGE) if message { message Hello, Default Message! } http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, %s\n, message) }) fmt.Println(Server starting on port 3000...) http.ListenAndServe(:3000, nil) }构建新镜像hellok8s:config。然后创建一个 ConfigMap# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: hellok8s-config data: hello.message: Hello from ConfigMap!更新 Deployment将 ConfigMap 的数据作为环境变量注入容器# 在 deployment.yaml 的 container 部分添加 ... spec: containers: - name: hellok8s-container image: hellok8s:config ports: - containerPort: 3000 env: - name: HELLO_MESSAGE valueFrom: configMapKeyRef: name: hellok8s-config key: hello.message应用更新后访问服务返回的消息就变成了 “Hello from ConfigMap!”。这样修改应用配置就无需重新构建镜像只需更新 ConfigMap 并滚动更新 Deployment。5.3 使用 Secret 管理敏感信息Secret 用于存储敏感信息如密码、令牌、密钥等。其用法与 ConfigMap 类似但数据会以 Base64 编码存储仅是一种简单的编码并非加密。创建一个 Secret# 通过命令行创建数据会自动被 base64 编码 kubectl create secret generic hellok8s-secret --from-literalapi-keymy-super-secret-key-123或者在 YAML 中定义注意YAML 中的 data 字段也需要是 base64 编码后的值# secret.yaml apiVersion: v1 kind: Secret metadata: name: hellok8s-secret type: Opaque data: api-key: bXktc3VwZXItc2VjcmV0LWtleS0xMjM # echo -n my-super-secret-key-123 | base64然后以环境变量或卷挂载的方式注入 Pod。以环境变量为例在 Deployment 中添加env: - name: HELLO_MESSAGE valueFrom: configMapKeyRef: name: hellok8s-config key: hello.message - name: API_KEY # 注入 Secret valueFrom: secretKeyRef: name: hellok8s-secret key: api-key在容器内API_KEY环境变量的值就是解码后的my-super-secret-key-123。重要安全提示虽然 Secret 的data字段是 base64 编码但在 Kubernetes 集群内默认情况下它是以非加密形式存储在 etcd 中的。为了生产环境的安全必须配置 etcd 的加密静态存储并确保只有授权的 Pod 才能访问 Secret。在本地 Minikube 环境中学习时也请养成良好的安全习惯不要将真实的敏感信息提交到版本库。6. 打包与部署升华使用 Helm当应用越来越复杂包含多个 Deployment、Service、ConfigMap 等资源时手动管理一堆 YAML 文件会变得非常繁琐。Helm 是 Kubernetes 的包管理器它允许你将一组相关的 K8s 资源定义打包成一个Chart通过变量Values进行配置实现一键安装、升级和回滚。6.1 Helm 核心概念与初体验首先安装 Helm。可以通过包管理器如brew install helm。Helm 有三个核心概念Chart一个 Helm 包包含了创建 Kubernetes 应用所需的所有资源定义模板。RepositoryChart 的存储库可以从中查找和下载 Chart。Release在 Kubernetes 集群中运行的一个 Chart 实例。同一个 Chart 可以安装多次每次安装都会创建一个新的 Release。我们可以从一个最简单的 Chart 开始。使用 Helm 创建一个我们自己的 Chart 骨架helm create my-hellok8s-chart这会生成一个包含标准目录结构的 Chartmy-hellok8s-chart/ ├── Chart.yaml # Chart 的元数据名称、版本等 ├── values.yaml # 默认的配置值 ├── templates/ # 模板文件目录 │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ └── ... └── charts/ # 依赖的子 Chart可选6.2 定制化我们的 Chart我们不需要 Helm 生成的所有模板。清空templates/目录然后基于我们之前写的 YAML 文件来创建模板。关键在于将文件中那些可能变化的值如镜像标签、副本数、服务端口替换成 Helm 的模板表达式{{ .Values.xxx }}。例如创建一个简化的templates/deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deployment spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Release.Name }} template: metadata: labels: app: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: {{ .Values.service.port }} env: - name: HELLO_MESSAGE value: {{ .Values.config.message | quote }}对应的修改values.yaml来定义这些变量的默认值replicaCount: 2 image: repository: hellok8s tag: v1 service: port: 3000 config: message: Hello from Helm Chart!可以看到{{ .Release.Name }}会在安装时被替换为 release 的名字{{ .Values.image.tag }}则从values.yaml中读取。| quote是一个模板函数确保字符串被引号包裹。6.3 安装、升级与回滚在 Chart 目录下使用 Helm 安装我们的应用# 安装并命名为 my-release helm install my-release ./my-hellok8s-chart # 查看 release 状态 helm list helm status my-release # 查看实际生成的 K8s 资源 kubectl get all -l appmy-release现在如果你想升级镜像版本只需修改values.yaml中的image.tag然后执行helm upgrade my-release ./my-hellok8s-chartHelm 会计算差异并执行滚动更新。如果升级后出现问题可以轻松回滚到上一个版本# 查看历史版本 helm history my-release # 回滚到版本 1 helm rollback my-release 1这种基于模板和值文件的管理方式使得配置管理变得清晰、可版本化并且便于在不同环境开发、测试、生产间复用 Chart只需覆盖不同的values.yaml文件即可。避坑技巧在将 Chart 投入生产前务必使用helm template .命令渲染模板检查生成的 YAML 是否符合预期。也可以使用helm lint进行基本的语法检查。对于复杂的 Chart考虑将values.yaml拆分为values-dev.yaml、values-prod.yaml等使用-f参数指定helm install -f values-prod.yaml ...。7. 实战问题排查与运维技巧理论学得再多不如踩一次坑。在这一章我分享一些在实战中高频出现的问题和排查思路这些是文档里不会写的“血泪经验”。7.1 Pod 启动失败镜像拉取与健康检查问题现象kubectl get pods显示 Pod 状态一直是ImagePullBackOff或ErrImagePull。排查kubectl describe pod pod-name查看Events部分。最常见原因是镜像名称错误或私有镜像仓库认证失败。解决确认镜像名和标签正确。对于私有仓库需要创建docker-registry类型的 Secretkubectl create secret docker-registry ...并在 Pod spec 的imagePullSecrets字段中引用。在 Minikube 中确保使用了eval $(minikube docker-env)后构建的镜像或者将镜像推送到可公开访问的仓库。问题现象Pod 状态是Running但服务无法访问或者频繁重启CrashLoopBackOff。排查查看日志kubectl logs pod-name查看应用日志。如果容器立刻退出加-p参数查看前一个容器的日志。检查就绪和存活探针如果配置了livenessProbe或readinessProbe可能因为探针检查失败导致容器重启或被踢出服务端点。kubectl describe pod查看探针状态。进入容器调试kubectl exec -it pod-name -- /bin/sh进入容器内部检查进程、端口、配置文件等。解决根据日志修复应用 bug。调整探针的配置如初始延迟initialDelaySeconds、超时时间timeoutSeconds确保它们符合应用的实际启动和健康状态。7.2 服务无法访问网络与 DNS 排查问题现象通过 Service 名称无法访问其他服务。排查确认 Service 的selector与 Pod 的labels完全匹配包括大小写。确认 Pod 是Running且Readykubectl get pods显示1/1。在客户端 Pod 内执行nslookup service-name或cat /etc/resolv.conf检查集群 DNS通常是 CoreDNS是否正常工作是否能解析 Service 名称。检查 Service 的targetPort是否与 Pod 的containerPort一致。解决修正标签选择器或端口配置。如果 DNS 有问题检查kube-dns或corednsPod 是否正常运行。问题现象Ingress 配置不生效。排查kubectl get ingress查看 Ingress 资源状态ADDRESS字段是否为空。kubectl describe ingress ingress-name查看Events是否有警告或错误。检查 Ingress Controller 的 Pod 是否运行正常kubectl get pods -n ingress-nginx。检查 Ingress 规则中定义的host是否能在客户端正确解析到 Ingress Controller 的 IP通常是 LoadBalancer 的 IP 或 Node IP。解决确保 Ingress Controller 已正确安装并运行。对于 Minikube确认minikube addons enable ingress已成功执行并且隧道或端口转发配置正确。7.3 资源管理与优化问题现象节点资源不足Pod 处于Pending状态。排查kubectl describe node查看节点的Allocatable和已分配的资源。kubectl describe pod pending-pod查看Events通常会有Insufficient cpu/memory的提示。解决给 Pod 设置合理的资源请求requests和限制limits。requests是调度依据limits是运行上限。resources: requests: memory: 64Mi cpu: 250m limits: memory: 128Mi cpu: 500m对于 Minikube可以增加分配给虚拟机的资源minikube stop minikube start --memory8192 --cpus4。日常运维利器 k9s再次强调k9s在问题排查中的高效性。在k9s界面中你可以按d描述任何资源查看详细状态和事件。按l直接 tail 容器日志无需记住 Pod 全名。按s进入容器 shell进行实时调试。按ctrl-k查看 Pod 的 YAML 定义。它提供了一个全局的、实时的集群状态视图远比反复输入kubectl命令高效。从容器、Pod 到 Deployment、Service再到 Ingress、ConfigMap/Secret最后用 Helm 统一打包管理这条学习路径的核心是渐进式实践。我个人的体会是K8s 的复杂性在于其概念的抽象和组件的繁多但一旦你亲手走通这个“部署流水线”把每个抽象概念都对应到具体的 YAML 文件和操作结果上那种脉络突然清晰的感觉是非常棒的。这个教程库的价值就在于提供了这条清晰的、可重复的动手路径。当你掌握了这些基础再去探索 StatefulSet、DaemonSet、Operator 等更高级的概念时就会发现自己已经站在了一个坚实的地基上。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…