CicAda - Linux
type: channel
link: https://www.cicaba.cn/category/Linux/
description: Linux
items: 使用管理员登录 JumpServer 堡垒机时遇到错误的处理
items: Kubemetes存储（真实数据）
items: Kubemetes存储（元数据）
items: Kubemetes`Service`
items: k8s(kubernetes)控制器
items: k8s(kubernetes)生命周期
items: k8s(kubernetes)常用命令
items: DSM命令行操作硬盘
items: Arm部署k8s(kubernetes)集群
items: Debian 12 / Ubuntu 22.04 使用源安装 LAMP 教程

使用管理员登录 JumpServer 堡垒机时遇到错误的处理
type: item
date: 2025-09-22T21:09:00+08:00
description: # 进入容器内部 docker exec -it jumpserver /bin/bash # 进入目录 cd /opt/jumpserver/apps/ # 如果遇到错误：ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment? # 可以执行以下命令激活 python 环境（可能 v4 容器需要） source /opt/py3/bin/activate # 进入 python 环境 python manage.py shell # 或 python3 manage.py shell # 重置用户密码 from users.models import User u = User.objects.get(username='admin') u.reset_password('admin') u.save() # 解锁登录限制 from django.core.cache import cache cache.delete_pattern('_LOGIN_BLOCK_*') cache.delete_pattern('_LOGIN_LIMIT_*') # 启用禁用的用户： from users.models import User User.objects.filter(username='admin').update(is_active=True)

Kubemetes存储（真实数据）
type: item
date: 2025-08-14T14:25:00+08:00
description: 存储分类元数据◆configMap:用于保存配置数据(明文)◆Secret:用于保存敏感性数据(编码)◆Downward API:容器在运行时从 Kubernetes API服务器获取有关它们自身的信息真实数据◆Volume:用于存储临时或者持久性数据◆PersistentVolume:申请制的持久化存储VolumeKubernetes 里的 Volume（卷） 是用来给容器提供 数据存储 的机制，主要解决两个问题：容器存储临时性：容器文件系统在容器退出或 Pod 删除后会被清空，Volume 可以保存数据。多容器数据共享：同一个 Pod 中多个容器可以通过 Volume 共享文件。常见 Volume 类型1. emptyDir节点本地的临时存储，Pod 删除数据也删除适合临时缓存、中间文件存储位置可以是磁盘，也可以是内存（medium: Memory）apiVersion: v1 kind: Pod metadata: name: emptydir-demo spec: containers: - name: app image: busybox command: ["/bin/sh", "-c"] args: - | echo "写入数据到 /cache/test.txt" echo "Hello from emptyDir" > /cache/test.txt sleep 3600 volumeMounts: - name: cache-volume mountPath: /cache - name: sidecar image: busybox command: ["/bin/sh", "-c"] args: - | echo "读取 /cache/test.txt" cat /cache/test.txt || echo "文件不存在" sleep 3600 volumeMounts: - name: cache-volume mountPath: /cache volumes: - name: cache-volume emptyDir: {} #使用内存介质 #- name: cache-volume # emptyDir: # medium: Memory # sizeLimit: "64Mi"在 kubelet 的工作目录 ( root-dir 参数控制)，默认为 /var/lib/kubelet, 会为每个使用了 emptyDir: {} 的 pod 创建一个目录，格式如 /var/lib/kubelet/pods/{podid}/volumes/kubernetes.io~empty-dir/, 所有放在 emptyDir 中数据，最终都是落在了 node 的上述路径中2. hostPath挂载宿主机的目录/文件到容器适合需要访问宿主机日志、配置文件等场景可移植性差，不适合多节点部署常用的类型apiVersion: v1 kind: Pod metadata: name: hostpath-pod spec: containers: - image: nginx name: myapp volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # directory location on host path: /data # this field is optional type: Directorynfs / glusterfs / cephfs网络存储卷，可实现多节点共享数据projected将多个 Volume（如 ConfigMap、Secret、DownwardAPI）合并到一个挂载点PV/PVC通过声明式申请持久化存储（PV）容量：PV 的值不小于 PVC 要求，可以大于最好一致 读写策略：完全匹配单节点读写 - ReadWriteOnce - RWO多节点只读 - ReadOnlyMany - ROX多节点读写 - ReadWriteMany - RWX存储类：PV 的类与 PVC 的类必须一致，不存在包容降级关系后端可以是 NFS、Ceph、云盘等数据独立于 Pod 生命周期回收策略：Retain（保留）：手动回收Recycle（回收）：基本擦除（rm -rf /thevolume/*）Delete（删除）：关联的存储资产（例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷）将被删除 当前，只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持…

Kubemetes存储（元数据）
type: item
date: 2025-07-14T16:34:00+08:00
description: 存储分类元数据◆configMap:用于保存配置数据(明文)◆Secret:用于保存敏感性数据(编码)◆Downward API:容器在运行时从 Kubernetes API服务器获取有关它们自身的信息真实数据◆Volume:用于存储临时或者持久性数据◆PersistentVolume:申请制的持久化存储configMap：通过文件创建：kubectl create configmap --from-file=file.suffix 如果文件中以key=value，那么文件名将作为key,，文件内容将作为value。 kubectl create configmap --from-file=file.suffix 可作为环境变量。通过命令创建：kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=pass 以key=value的形式创建。在pad中使用configMap作为环境变量：方法 1：envFrom（一次性导入所有键值）：apiVersion: v1 kind: Pod metadata: name: demo-pod spec: containers: - name: demo-container image: nginx envFrom: - configMapRef: name: my-config方法 2：env（按键导入）apiVersion: v1 kind: Pod metadata: name: demo-pod spec: containers: - name: demo-container image: nginx env: - name: APP_MODE valueFrom: configMapKeyRef: name: my-config key: APP_MODE在 Pod 中以Volume挂载ConfigMap，会将configMap中的key作为文件名，value作为文件内容。--- apiVersion: v1 kind: Pod metadata: name: configmap-volume-pod spec: containers: - name: my-container image: busybox command: ["sleep", "3600"] volumeMounts: - name: config-volume mountPath: /etc/config # 挂载路径 volumes: - name: config-volume configMap: name: my-configconfigMap更新不会触发pad更新，可以通过修改pod annotations的方式强制触发更新。kubectl patch deployment nginx-test --patch '{"spec": {"template":{"metadata":{"annotations":{"version/config":"66666666"}}}}}'更新 ConfigMap 后:使用该 ConfigMap 挂载的 Env 不会同步更新使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新环境变量是 Pod 启动时 从 ConfigMap 读取一次的，之后不会变。所以必须 重建 Pod 才能重新读取最新值。滚动更新（无论是 patch annotation 还是 kubectl rollout restart）都会让 Deployment 逐个替换 Pod，新的 Pod 会拿到更新后的环境变量值。SecretSecret在使用时需要进行bash64编码，因为 Pod 使用 Secret 挂载成环境变量或文件卷时，Kubelet 会自动进行 Base64 解码，容器内部拿到的就是原始值。# 编码 echo -n "admin" | base64 # 解码 echo -n "YWRtaW4=" | base64 --decodeKubernetes 通过仅仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点来保障其安全性。Secret 只会存储在节点的内存中，永不写入物理存储，这样从节点删除 secret 时就不需要擦除磁盘数据。创建：apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: YWRtaW4= # "admin" 的 Base64 password: cGFzc3dvcmQ…

Kubemetes`Service`
type: item
date: 2025-06-09T14:51:00+08:00
description: Service 的主要作用：服务发现 (Service Discovery): Service 提供了一个稳定的名称和 IP 地址，其他 Pod 或外部客户端可以通过这个名称或 IP 地址来发现并访问服务。Kubernetes DNS 会为 Service 创建一个 DNS 记录。负载均衡 (Load Balancing): Service 将到来的请求分发到其背后的一个或多个健康的 Pod 上。Kubernetes 支持多种负载均衡算法（取决于 kube-proxy 的模式）。隐藏 Pod 的动态性: Service 将客户端与后端 Pod 解耦，客户端不需要关心后端 Pod 的创建、删除、IP 地址变化等细节。提供不同的访问方式: Service 提供了多种不同的方式来暴露服务，满足不同的访问需求（集群内部、集群外部）。这张图片概括了 Kubernetes 中 Service 的核心迭代，特别是 kube-proxy 组件的代理模式演进。图片中的文字内容总结如下：Service - 核心迭代在 Kubernetes 集群中，每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP (虚拟 IP) 的形式。在 Kubernetes v1.0 版本，代理完全在 userspace (用户空间)。在 Kubernetes v1.1 版本，新增了 iptables 代理，但并不是默认的运行模式。从 Kubernetes v1.2 起，默认就是 iptables 代理。在 Kubernetes v1.8.0-beta.0 中，添加了 ipvs 代理。Userspace: 最早的实现方式，性能较差。Iptables: 成为主要的代理模式，提高了性能，但存在可伸缩性问题。IPVS: 作为新的高性能代理模式被引入，解决了 iptables 在大规模集群中的性能瓶颈。Service 的主要类型 (spec.type):ClusterIP (默认类型):特点: Service 会被分配一个集群内部的 IP 地址（ClusterIP）。访问方式: 只能在集群内部访问 Service，通过 Service 的名称或 ClusterIP。用途: 主要用于集群内部的服务间通信。NodePort:特点: 在所有节点上打开一个固定的端口（NodePort），并将流量转发到 Service 的 ClusterIP。访问方式: 可以通过集群中任何一个节点的 IP 地址加上 NodePort 来访问服务，例如 :。用途: 方便从集群外部访问服务，常用于开发环境或简单的外部暴露需求。但 NodePort 端口范围有限 (默认为 30000-32767)，且需要所有节点都开放该端口，不利于生产环境扩展和管理。LoadBalancer:特点: 在云提供商环境中使用时，会自动创建一个外部负载均衡器，并将流量导入到 NodePort Service。访问方式: 客户端通过云提供商分配的外部负载均衡器 IP 地址访问服务。用途: 在云环境中将服务暴露给外部世界，提供公网访问和高级负载均衡功能。注意: 非云环境需要额外的组件来实现 LoadBalancer 功能 (如 MetalLB)。ExternalName:特点: 将 Service 映射到外部的 DNS 名称。访问方式: 客户端通过 Service 的名称访问，Kubernetes DNS 会将其解析到外部 DNS 名称。不会创建 ClusterIP 或 NodePort。用途: 方便地将集群内部的服务调用重定向到外部服务，而无需修改应用程序代码。会话亲和性会话亲和性是指将来自同一个客户端的请求始终转发到同一个后端 Pod 的能力。配置 Service 的会话亲和性：您可以在 Service 的 .spec 中配置 sessionAffinity 字段来启用会话亲和性。sessionAffinity (string): 可选字段。指定 Service 的会话亲和性类型。目前支持两种类型：None (默认值): 不启用会话亲和性，请求会根据 Service 的调度算法（如轮询、最少连接等）在后端 Pod 之间随机或均匀分发。ClientIP: 基于客户端的 IP 地址实现会话亲和性。来自同一个客户端 IP 地址的所有请求都会被转发到同一个后端 Pod。apiVersion: v1 kind: Service metadata: name: nginx namespace: nginx spec: selector: app: nginx type: NodePort ports: - port: 80 name: http targetPort: 80 no…

k8s(kubernetes)控制器
type: item
date: 2025-03-07T17:01:00+08:00
description: Kubernetes 控制器详解在 Kubernetes（K8s）中，控制器（Controller）是实现集群自动化管理的核心组件。它们通过持续监控集群的实际状态，并将其与期望状态进行对比，从而确保集群资源的正确配置和稳定运行。以下是对 Kubernetes 控制器的详细解释：1. 控制器的核心概念期望状态与实际状态：用户通过声明式 API 定义资源的“期望状态”。控制器负责监控资源的“实际状态”。当两者不一致时，控制器会执行操作，使实际状态向期望状态靠拢，这个过程称为“调谐”（Reconcile）。控制循环：控制器通过控制循环（Control Loop）不断地执行以下步骤：观察：监控集群中资源的状态变化。比较：将实际状态与期望状态进行比较。调整：如果两者不一致，则执行必要的操作进行调整。2. 控制器的主要功能维护期望状态： 确保集群中资源的状态与用户定义的期望状态一致。自动化管理： 自动化执行资源的创建、更新、删除等操作，减少人工干预。故障恢复： 在资源发生故障时，自动进行恢复操作，保证集群的稳定性和可用性。弹性伸缩： 根据负载情况，自动调整资源的副本数量，实现弹性伸缩。3. 常见的 Kubernetes 控制器ReplicationController（复制控制器）/ReplicaSet（副本集）:确保指定数量的 Pod 副本始终运行。当 Pod 发生故障或节点失效时，自动创建新的 Pod 副本。ReplicaSet对比ReplicationController支持匹配表达式：selector.matchExpressions rs 在标签选择器上，除了可以定义键值对的选择形式，还支持 matchExpressions 字段，可以提供多种选择。 目前支持的操作包括： In：label 的值在某个列表中 NotIn：label 的值不在某个列表中 Exists：某个 label 存在 DoesNotExist：某个 label 不存在Deployment（部署控制器）:管理 ReplicaSet 的创建和更新。支持滚动更新和回滚等功能，实现应用程序的平滑升级。StatefulSet（有状态副本集）:管理有状态应用程序的 Pod 副本。为每个 Pod 分配唯一的标识符和稳定的网络标识。DaemonSet（守护进程集）:确保每个节点上都运行一个 Pod 副本。常用于部署日志收集、监控等守护进程。Job/CronJob:Job：创建一次性运行的Pod。CronJob：基于时间的Job，用来做定时任务。Node Controller（节点控制器）:负责监控节点的状态，在节点不可用时执行相应的操作，例如将Pod 标记为不可调度、在节点无法通信时驱逐Pod。ServiceController（服务控制器）:负责监听service和对应的pod副本的变化，如果检测到service被删除，则删除和该service同名的endpoints对象。 如果检测到新的service被创建或者修改，则根据该service的信息获取到相关的pod列表，然后创建或者更新service对应的endpoints对象。IngressController（入口控制器）:管理Ingress 资源，提供外部访问到集群内部服务的方式，通过HTTP/HTTPS 路由流量。4. 控制器管理器（Controller Manager）Kubernetes 控制器管理器（kube-controller-manager）是运行 Kubernetes 控制器的组件。它将多个控制器组合在一起，作为一个进程运行，减少了资源消耗。总结Kubernetes 控制器是实现集群自动化管理的关键组件。它们通过持续监控和调整资源状态，确保集群的稳定性和可靠性。理解控制器的原理和功能，有助于更好地管理和运维 Kubernetes 集群。

k8s(kubernetes)生命周期
type: item
date: 2025-01-07T16:59:00+08:00
description: initinit容器与普通的容器非常像，除了如下两点：init容器总是运行到成功完成为止每个init容器都必须在下一个init容器启动之前成功完成如果 Pod 的 Init 容器失败Kubernetes 会不断地重启该Pod，直到 Init 容器成功为止。然而，如果Pod对应的restartpolicy 为 Never，它不会重新启动。（restartpolicy默认Always）init容器特点及特点：Init容器与应用容器具备不同的镜像，可以把一些危险的工具放置在init容器中，进行使用。init容器多个之间是线性启动的，所以可以做一些延迟性的操作。init容器无法定义readinessProbe，其它以外同应用容器定义无异。Kubernetes 探针类型Kubernetes 支持三种类型的探针（Probes）来检查容器的健康状态和启动情况，分别是 readinessProbe、livenessProbe 和 startupProbe。每种探针有不同的用途和配置选项，下面是对这些探针类型的详细说明：1. Readiness Probe（就绪探针）用途：检查容器是否已经准备好处理流量。当容器处于启动阶段或临时不可用时，它可能还不能服务请求。就绪探针帮助 Kubernetes 确定容器是否可以接受流量。配置方式：httpGet：容器通过 HTTP 请求检查一个 URL 是否返回成功的状态（如 200）。exec：通过执行一个命令，如果命令返回 0，则认为容器就绪。tcpSocket：容器检查某个端口是否能通过 TCP 连接。常见配置项：initialDelaySeconds：容器启动后，探针第一次执行的延迟时间，。periodSeconds：探针执行的频率（单位：秒），默认是 10 秒。failureThreshold：连续失败多少次后认为容器不可用， 默认值为3。successThreshold：连续成功多少次后认为容器变为就绪状态，默认值为1。示例：readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 10 failureThreshold: 3或者使用 exec 命令：readinessProbe: exec: command: ["test","-e","/usr/share/nginx/html/index0.html"] initialDelaySeconds: 1 periodSeconds: 10 failureThreshold: 202. Liveness Probe（存活探针）用途：检查容器是否仍然存活。如果存活探针失败，Kubernetes 会重启该容器。通常用来检查容器是否卡住或死锁。示例：livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 20 failureThreshold: 33. Startup Probe（启动探针）用途：用于检查容器是否已经成功启动。通常适用于启动时间较长的应用或容器。如果启动探针失败，Kubernetes 会认为容器启动失败并重新启动容器。与 readinessProbe 和 livenessProbe 不同，startupProbe 在容器启动期间生效，容器启动后会停止使用。示例：startupProbe: httpGet: path: /startup port: 8080 initialDelaySeconds: 5 periodSeconds: 10 failureThreshold: 30探针总结探针类型用途适用场景readinessProbe判断容器是否准备好接收流量容器启动后，服务准备好接收请求时livenessProbe判断容器是否存活，如挂起、死锁等容器问题时进行重启容器可能进入死锁状态，需重启startupProbe判断容器是否成功启动，启动过程中检测，失败时重启容器容器启动时间较长，常用于长时间初始化的容器生命周期钩子（Lifecycle Hooks）在 Kubernetes 中，容器的生命周期管理可以通过 生命周期钩子（Lifecycle Hooks） 来控制，主要包括 启动钩子（postStart） 和 结束钩子（preStop）。这些钩子可以在容器的启动和结束过程中执行特定的命令或操作，以确保容器在这两个关键时刻完成某些任务。1. 启动钩子 postStart用途：postStart 钩子在容器启动后立即执行。它是在容器启动并运行容器内的主进程之前调用的。你可以在这个阶段执行一些额外的操作，比如初…

k8s(kubernetes)常用命令
type: item
date: 2025-01-03T14:46:00+08:00
description: 一、kubectl1. 查看所有padkubectl get pod-A,--all-namespaces 查看当前所有名称空间的资源-n 指定名称空间，默认值 default，kube-system 空间存放是当前组件资源--show-labels 查看当前的标签-l 筛选资源，key、key=value-o wide 详细信息包括 IP、分配的节点-w 监视，打印当前的资源对象的变化部分2. 查看指定命名空间podkubectl get pod -n namespace3. 查看指定命名空间pod及明细kubectl get pod -o wide -n namespace4. 进而容器内部docker exec -it nginx /bin/bashkubectl exec -it nginx-0 -c nginx -n nginx -- /bin/bash-it以交互终端模式打开pad-c指定容器名-n指定命名空间--执行的命令5. 通过标签查找podkubectl get pod -l app=nginx -n nginx6. 查看pod容器日志kubectl logs nginx-0 -n nginx -c nginx 7. 查看pod详细描述kubectl describe pod podName8. 查看pod标签kubectl get pod --show-labels9. 查看集群的servicekubectl get service 10. 查看集群的deploymentkubectl get deployment选项说明kubectl get获取 Kubernetes 中的资源对象deployment资源类型，这里是 Deploymenttest-deployment具体的 Deployment 名称-n test指定命名空间为 test，也可以写成 --namespace=test-o yaml输出格式为 YAML，完整显示 Deployment 的定义，包括系统自动生成的字段11. kubectl create 、apply 、replace*kubectl create：创建资源（如果已存在会失败）kubectl apply：推荐使用，声明式管理资源（存在则更新，不存在则创建）kubectl replace：替换资源整体定义（全量替换）命令用途是否创建是否更新如果资源已存在kubectl create创建新资源✅❌❌ 报错kubectl apply推荐：声明式管理✅✅✅ 合并更新kubectl replace覆盖式更新❌（需存在）✅✅ 覆盖替换12. 快速修改资源使用 kubectl edit（临时改，手动编辑）kubectl edit deployment <名称> -n <命名空间>快速修改镜像kubectl set image deployment/<名称> <容器名>=<新镜像> -n <命名空间>快速修改副本数kubectl scale <资源类型>/<资源名称> --replicas=<数量> [-n 命名空间]13. 自动伸缩deploymentkubectl autoscale deployment ndeployment名称 --min=最少副本数 --max=最大副本数 --cpu-percent=伸缩界限14. 管理资源的滚动更新kubectl rollout history 资源类型/资源名称 查看历史版本kubectl rollout undo 资源类型/资源名称 回滚上一个版本kubectl rollout undo 资源类型/资源名称 --to-revision=版本 回滚指定版本kubectl rollout status 资源类型/资源名称 查看滚动更新状态 有返回码成功返回0 echo $?控制保留版本.spec.revisionHistoryLimit 是一个重要的 Deployment 清理策略配置项，它允许你控制保留的更新历史版本数量，从而管理存储资源并决定是否允许回滚操作。15. 资源补丁kubectl patch 资源类型 资源名称 -p '{}'-p: 表示使用 patch 策略来更新资源。金丝雀部署示例：$ kubectl patch deployment nginx-deployment -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}''{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}}': 这是一个 JSON 格式的 patch 内容，用于更…

DSM命令行操作硬盘
type: item
date: 2024-12-05T14:25:00+08:00
description: 方法教程1. 首先去控制面板-终端机和SNMP中启用ssh2. SSH连接群晖这里我使用的是Aechoterm，当然你们也可以用putty之类的工具，具体方法自行搜索吧，站内有很多3. 获取root权限sudo -i4. 可以先来查看一下设备里的全部机械硬盘情况可以看到命名规则是sda、sdb、sdc、sdd....每个sd又分为sd1、sd2和sd3ls /dev/sd*楼主有三块硬盘分别是sda sdc sdd楼主有三块硬盘分别是sda sdc sdd楼主有三块硬盘分别是sda sdc sdd5. 查看这几块硬盘的具体情况例如我的sdc就是这块HGST的盘，可以看到list确实是/dec/sdc1、/dec/sdc2、/dec/sdc3。这里顺便说一下，sdc1和sdc2是群晖的系统分区，sdc3才是我们存储数据的分区，记住它fdisk -l /dev/sd*sdc为目标硬盘sdc为目标硬盘sdc为目标硬盘6. 创建分区只创建目标硬盘执行这一行就可以了：synopartition --part /dev/sdc 12因为我想把sdc和sdd组raid0，因此我还执行了这行：synopartition --part /dev/sdd 12如果出提示，输入y然后回车确认，等待完成7. 查看现有存储池md0和md1不用管，这俩是系统分区。剩下的md2和md3就是你的群晖里已经存在的存储池，新建存储池的话序号就是md4，记住md4这个数字cat /proc/mdstat查看现有的存储池查看现有的存储池查看现有的存储池8. 建立新存储池并格式化如果只需要用sdc创建，直接这两行就可以（注意第一行里的/dev/md4和/dev/sdc3需要分别替换为实际的值）mdadm --create /dev/md4 --level=1 --raid-devices=1 --force /dev/sdc3mkfs.ext4 -F /dev/md4如果有提示就按y并回车，等待完成（第二行格式化命令，如果要格式化为btrfs，就把ext4改成btrfs即可）因为我要把sdc和sdd组raid0，因此输了以下的命令mdadm --create /dev/md4 --level=0 --raid-devices=2 --force /dev/sdc3 /dev/sdd3mkfs.ext4 -F /dev/md49. 重启群晖，一定要重启才生效！10. 进入存储空间查看，应该就可以看到创建好的新存储池了如果是dsm7.0可能需要点击一下“在线重组”，等待完成就好原文章

Arm部署k8s(kubernetes)集群
type: item
date: 2024-11-28T16:22:00+08:00
description: 前言：k8s集群是目前高端运维需要掌握的必备技能之一，工作中你可以不用k8s，但是简历你不能没有k8s；面试造火箭，工作打螺丝；话不多说，直接上操作，这里就不过多阐述k8s的原理和作用了。部署前工作机器设备：MacBook Pro m1pro虚拟系统：Ubuntu 22.04.3 LTSDocker： v24.0.7 - 直接安装最新的即可k8s： v1.26.2 - 根据最近两年的新版安装，旧版可能会存在很多bug虚拟配置：稳妥起见，k8s至少需要2个CPU，4G运行IP CPU 内存192.168.10.91 2 4G192.168.10.91 2 4G192.168.10.91 2 4G配置ssh传输无密码传输，方便文件之间的传输root@k8s-master-90:~# ssh-keygen -t rsa root@k8s-master-91:~# ssh-keygen -t rsa root@k8s-master-92:~# ssh-keygen -t rsa root@k8s-master-90:~# ssh-copy-id 192.168.10.91 root@k8s-master-90:~# ssh-copy-id 192.168.10.92 root@k8s-master-91:~# ssh-copy-id 192.168.10.90 root@k8s-master-91:~# ssh-copy-id 192.168.10.92 root@k8s-master-92:~# ssh-copy-id 192.168.10.90 root@k8s-master-90:~# ssh-copy-id 192.168.10.91系统上的基本配置以下操作，都在每台主机上配置1. 填写hosts域名映射root@k8s-master-90:~# vim /etc/hosts 19.168.10.90 k8s-master-90 19.168.10.91 k8s-work-91 19.168.10.91 k8s-work-922. 关闭防火墙root@k8s-master-90:~# systemctl status ufw.service root@k8s-master-91:~# systemctl stop ufw.service root@k8s-master-92:~# systemctl disable ufw.service3、临时关闭swaproot@k8s-master-90:~# systemctl status swap.target root@k8s-master-91:~# systemctl stop swap.target root@k8s-master-92:~# systemctl disable swap.target // 永久关闭swap root@k8s-master-92:~# vim /etc/default/armbian-zram-config root@k8s-master-92:~# systemctl restart armbian-zram-config.service4. 文件系统的静态信息的文件中/etc/fstab，注释掉swaproot@k8s-master-90:~# vim /etc/fstab #/swap.img none swap sw 0 05、修改内核，开启ipv4转发功能root@k8s-master-90:~# tee /etc/sysctl.d/k8s.conf <<-'EOF' net.ipv4.ip_forward = 1 EOF6、查看是否开启转发功能成功，有输出即可root@k8s-master-90:~# sysctl -p /etc/sysctl.d/k8s.conf 7、安装ipvsadmroot@k8s-master-90:~# apt-get install -y ipvsadm root@k8s-master-90:~# cat > /etc/modules-load.d/ipvs.conf << EOF ip_vs_dh ip_vs_fo ip_vs_ftp ip_vs ip_vs_lblc ip vs_lblcr ip_vs_lc ip_vs_mh ip_vs_nq ip_vs_ovf ip_vs_pe_sip ip_vs_rr ip_vs_sed ip_vs_sh ip_vs_wlc ip_vs_wrr nf_conntrack EOF8、开机自动systemd-modules-load.serviceroot@k8s-master-90:~# systemctl enable --now systemd-modul…

Debian 12 / Ubuntu 22.04 使用源安装 LAMP 教程
type: item
date: 2024-04-28T14:54:00+08:00
description: 本文将介绍使用官方源和第三方源在 Debian 12 和 Ubuntu 22.04 安装最新版 Apache 2 + PHP + MySQL 的教程，并且可以自行选择 PHP 版本。PS：本文同时适用于 Debian 11 Bullseye，Debian 10 Buster，Ubuntu 20.04 Focal 以及 Ubuntu 22.04 Jammy以下操作需要在 root 用户下完成，请使用 sudo -i 或 su root 切换到 root 用户进行操作。[](#1、更新系统并安装部分必要软件)1、更新系统并安装部分必要软件apt update apt upgrade -y apt dist-upgrade -y apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates如果您通过 iso 方式安装 Debian 11 并且设置了 root 密码，则默认不带 sudo 包，使用 apt install sudo 安装即可[](#2、增加-ondrej-sury-大神打包的-php-源并安装-php-8-x)2、增加 Ondřej Surý 大神打包的 PHP 源并安装 PHP 8.x和 LEMP 安装方法一样，我们还是使用 Ondřej Surý 大佬打包的 PHP 源。至于为啥先装 PHP 再装 Apache 2，因为装了 PHP 以后 Apache 2 会识别你 PHP 版本然后生成对应的配置文件？[](#2-1-debian-和-ubuntu-安装-lamp-区别)2.1 Debian 和 Ubuntu 安装 LAMP 区别唯一区别就是 PHP 和 Apache 2 的安装添加源方法不一样，其他的步骤都一毛一样。[](#2-2-加入大神做好的源)2.2 加入大神做好的源wget -O /usr/share/keyrings/php.gpg https://packages.sury.org/php/apt.gpg echo "deb [signed-by=/usr/share/keyrings/php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.listadd-apt-repository ppa:ondrej/php[](#2-3-更新系统源)2.3 更新系统源apt update apt upgrade -y[](#2-4-安装自己需要的-php-版本)2.4 安装自己需要的 PHP 版本这个源目前默认的 PHP 是 8.3.x，如果您需要其他版本，那么请修改对应的 PHP 版本号 (注意配置文件哦)。这里举例 WordPress 需要的部分 PHP 包安装 PHP 8.3.x：apt install php8.3-{fpm,cli,mysql,curl,gd,mbstring,xml,zip,imap,opcache,soap,gmp,bcmath} -y安装 PHP 8.2.x：apt install php8.2-fpm php8.2-cli php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip php8.2-imap php8.2-opcache php8.2-soap php8.2-gmp php8.2-bcmath -y安装 PHP 8.1.xapt install php8.1-fpm php8.1-cli php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-imap php8.1-opcache php8.1-soap php8.1-gmp php8.1-bcmath -y以下版本 PHP 已经 EOL，PHP 官方不再提供支持，请尽快更新您的程序兼容最新的 PHP，如果您的程序还未兼容，建议鞭策开发者安装 PHP 8.0.xapt install php8.0-fpm php8.0-cli php8.0-mysql php8.0-curl php8.0-gd php8.0-mbstring php8.0-xml php8.0-zip php8.0-imap php8.0-opcache php8.0-soap php8.0-gmp php8.0-bcmath -y安装 PHP 7.4.xapt install php7.4-fpm php7.4-cl…