更新系统并安装基础依赖
sudo apt update && sudo apt upgrade -y sudo apt install -y curl git jq vim 执行k3s一键安装脚本 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh - curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.31.2+k3s1" sh - 安装时指定ip等参数 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn \ INSTALL_K3S_SKIP_SELINUX_RPM=true \ INSTALL_K3S_EXEC="server --node-ip=100.64.1.8 --node-external-ip=100.64.1.8" \ sh - 检查k3s服务状态是否为Active systemctl status k3s --no-pager 检查节点状态 kubectl get nodes 主节点获取密钥 sudo cat /var/lib/rancher/k3s/server/node-token K10f863e5493e9f858a3abf647e001d3def22419e23d0136493db0d0410c53c5da0::server:a9e830465c1962e0f7cf8608d478eace curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn \ K3S_URL=https://100.64.1.6:6443 \ K3S_TOKEN=K10f863e5493e9f858a3abf647e001d3def22419e23d0136493db0d0410c53c5da0::server:a9e830465c1962e0f7cf8608d478eace \ INSTALL_K3S_EXEC="agent --node-ip=10.10.1.12 --flannel-iface=wt0" \ sh -
给计算节点打标签
kubectl label node sl-26 node-role.kubernetes.io/worker=worker 隔离节点 kubectl cordon sl-26 驱逐节点 kubectl drain sl-26 --ignore-daemonsets --delete-emptydir-data
配置node国内节点解决下载依赖问题
sudo mkdir -p /etc/rancher/k3s sudo vim /etc/rancher/k3s/registries.yaml #加以下内容 mirrors: "docker.io": endpoint: - "https://docker.m.daocloud.io" - "https://huecker.io" - "https://dockerhub.timeweb.cloud" - "https://noohhub.ru" "registry.k8s.io": endpoint: - "https://k8s.m.daocloud.io" - "https://docker.1ms.run" configs: "crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com": auth: username: "leius" password: "Shimujiuxia@2028" 重启节点 sudo systemctl restart k3s-agent sudo systemctl restart k3s
查看pod详情
查看pod详情 kubectl get pod -o wide 详细事件 kubectl describe pod name 查看pod端口详情 kubectl get svc
节点删除
主节点删除node kubectl delete node sl-bj 停止node节点 systemctl stop k3s-agent systemctl daemon-reload systemctl restart k3s-agent 彻底清理主节点 /usr/local/bin/k3s-uninstall.sh rm -rf /etc/rancher/k3s /var/lib/rancher/k3s /var/lib/kubelet rm -rf ~/.kube rm -rf /var/lib/cni/ rm -rf /etc/cni/net.d/ ip link delete cni0 2>/dev/null ip link delete flannel.1 2>/dev/null 清理node节点 /usr/local/bin/k3s-agent-uninstall.sh rm -rf /var/lib/rancher/k3s/ 重新加入 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn \ K3S_URL=https://100.64.1.6:6443 \ K3S_TOKEN=K10f863e5493e9f858a3abf647e001d3def22419e23d0136493db0d0410c53c5da0::server:a9e830465c1962e0f7cf8608d478eace \ INSTALL_K3S_EXEC="agent --node-ip=100.64.1.7" \ sh - 删除node标签 kubectl label node sl-10 node-role.kubernetes.io/worker- 重新定义标签 kubectl label node sl-10 node-role.kubernetes.io/ali-bj-mysql=
配置镜像密钥
配置镜像密钥 kubectl create secret docker-registry aliyun-acr-secret \ --docker-server=crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com \ --docker-username=leius \ --docker-password=Shimujiuxia@2028 \ --namespace=defaul 查看已创建密钥 k3s kubectl get secrets k3s kubectl get secrets -n <你的命名空间> pod中添加imagePullSecrets apiVersion: apps/v1 kind: Deployment metadata: name: cw-api spec: replicas: 1 selector: matchLabels: app: cw-api template: metadata: labels: app: cw-api spec: # ==================== 1. 添加镜像拉取密钥 ==================== imagePullSecrets: - name: aliyun-acr-secret # 对应上面 kubectl 创建的 Secret 名称 # ========================================================== containers: - name: cw-api image: crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com/leius/cw:api_2609 imagePullPolicy: IfNotPresent workingDir: /app command: ["/app/entrypoint.sh", "uvicorn", "--host", "0.0.0.0", "--port", "8000", "cw_api.asgi:application"] ports: - containerPort: 8000 name: http
node增加污点
kubectl taint nodes node-01 dedicated=gpu:NoSchedule 说明: NoSchedule(最常用):没有对应容忍度的 Pod 无法调度到该节点。 PreferNoSchedule:尽量不调度到该节点,如果没有其他合适节点,也可以退而求其次放进来。 NoExecute:不仅不让新 Pod 调度进来,还会直接驱逐/杀掉当前节点上已运行且没有该容忍度的 Pod。 node查看污点 kubectl describe node node-01 | grep Taints node解除污点 kubectl taint nodes node-01 dedicated=gpu:NoSchedule- pod容忍度 spec: template: spec: # 1. 允许进入带 dedicated=gpu 污点的节点 tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule" # 2. 强制指定只去打有 dedicated=gpu 标签的节点 nodeSelector: dedicated: gpu node亲和度 先给节点贴上标签 kubectl label nodes node-01 disktype=ssd 在pod中配置亲和度 apiVersion: apps/v1 kind: Deployment metadata: name: cw-api spec: replicas: 2 selector: matchLabels: app: cw-api template: metadata: labels: app: cw-api spec: # ==================== 硬亲和度配置开始 ==================== affinity: nodeAffinity: # required 代表【硬性要求】:找不到符合条件的 Node 就挂起(Pending) requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: zone # 匹配 Node 上的标签 Key operator: In # 在以下列表中 values: - chengdu # 匹配 Node 上的标签 Value(必须是 chengdu) # ==================== 硬亲和度配置结束 ==================== containers: - name: cw-api image: crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com/leius/cw:api_2609 apiVersion: apps/v1 kind: Deployment metadata: name: cw-api spec: replicas: 1 selector: matchLabels: app: cw-api template: metadata: labels: app: cw-api spec: # ==================== 亲和度配置开始 ==================== affinity: nodeAffinity: # preferredDuringScheduling... 代表“软亲和性”(优先满足,不强制) preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 # 权重,1-100,越高越优先 preference: matchExpressions: - key: disktype # 匹配 Node 身上的 Key operator: In # 在指定列表中 values: - ssd # 匹配 Node 身上的 Value # ==================== 亲和度配置结束 ==================== containers: - name: cw-api image: crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com/leius/cw:api_2609
查看traefik端口
k3s kubectl get svc traefik -n kube-system
修改默认traefik端口
k3s kubectl edit svc traefik -n kube-system
spec:
ports:
- name: web
nodePort: 30080 # <--- 修改这里:将原来的 32062 改为你想要的端口 (范围 30000-32767)
port: 80
protocol: TCP
targetPort: web
- name: websecure
nodePort: 30443 # <--- 修改这里:将原来的 31148 改为你想要的端口
port: 443
protocol: TCP
targetPort: websecure
nginx统配转发traefik
server {
listen 80;
server_name k3s.yourdomain.com;
location / {
# 将流量转给 K3s 的 Traefik 入口
proxy_pass http://10.10.1.11:32062;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}解决traefik节点未固定nginx无法代理问题
1. 查看 traefik pod 在哪个节点
# 查看 traefik pod 所在节点
kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik -o wide
# 或者更详细的信息
kubectl get pods -n kube-system | grep traefik
2. 固定 traefik 到指定节点
# 方法1:通过 nodeSelector 固定到 sl-11 节点
kubectl patch deployment traefik -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"sl-11"}}}}}'
# 方法2:如果需要取消固定(恢复自动调度)
kubectl patch deployment traefik -n kube-system --type=json -p='[{"op": "remove", "path": "/spec/template/spec/nodeSelector"}]'
# 验证配置是否生效
kubectl get deployment traefik -n kube-system -o yaml | grep -A 3 nodeSelector
3. 当前使用的服务类型
# 查看当前服务类型
kubectl get svc traefik -n kube-system
# 输出会显示:
# TYPE: NodePort(当前使用的是 NodePort,端口映射 80:30080/TCP,443:30443/TCP)
# svclb pod 已被删除(之前使用 LoadBalancer 时创建的)
4. 推荐方案:NodePort(你当前的配置)
1. nginx 容器占用了宿主机 80/443 端口,svclb 的 LoadBalancer 模式会尝试绑定这些端口,导致冲突
2. NodePort 30080/30443 不会与 nginx 冲突
3. 你的架构是:nginx (80/443) → traefik (30080/30443) → 后端服务
# 如果当前不是 NodePort,执行此命令
kubectl patch svc traefik -n kube-system -p '{"spec":{"type":"NodePort"}}'
# 查看确认
kubectl get svc traefik -n kube-system
# 应该显示:TYPE=NodePort, PORT(S)=80:30080/TCP,443:30443/TCP
5. 完整的推荐配置
kubectl patch svc traefik -n kube-system -p '{"spec":{"type":"NodePort"}}'
# 步骤2:固定 traefik 到 sl-11 节点(nginx 所在节点)
kubectl patch deployment traefik -n kube-system -p '{"spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"sl-11"}}}}}'
# 步骤3:验证配置
kubectl get svc traefik -n kube-system
kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik -o wide
# 步骤4:测试连通性
curl -I http://10.10.1.11:30080
6. 保存配置(可选)
如果你想让这个配置持久化(重新部署 traefik 也不会丢失),可以:
# 导出当前 deployment 配置
kubectl get deployment traefik -n kube-system -o yaml > /tmp/traefik-deployment.yaml服务启停
# 启动 K3s 服务 sudo systemctl start k3s # 查看 K3s 服务当前运行状态 sudo systemctl status k3s # 取消开机自启动 sudo systemctl disable k3s # 重新开启开机自启动 sudo systemctl enable k3s # 启动 K3s Agent sudo systemctl start k3s-agent # 查看 K3s Agent 当前运行状态 sudo systemctl status k3s-agent
查看容器
查看容器
kubectl get pods
查看详情
kubectl describe pod name
实时查看日志
kubectl logs -f pod-name
进入容器内部
kubectl exec -it pod-name -- /bin/bash
查看服务端口
kubectl get svc
编辑配置
kubectl edit awx awx-demo
查看密码
kubectl get secret awx-demo-admin-password -o jsonpath='{.data.password}' | base64 -d
kubectl get secret awx-demo-admin-password -n awx -o jsonpath='{.data.password}' 2>/dev/null && echo "" | base64 -d 2>/dev/null || kubectl get secret -n awx | grep password
查看接口配置
kubectl get svc awx-demo-service -n awx -o yaml | grep -A10 "ports:"k3s使用job构建
开始任务 kubectl apply -f cw_h5.yml kubectl get job cw-h5-builder 构建日志 kubectl logs -f job/cw-h5-builder 构建节点 kubectl get pod -l app=cw_h5_builder -o wide 删除任务 kubectl delete job cw-h5-builder --ignore-not-found
k3s使用job构建模板
apiVersion: batch/v1
kind: Job
metadata:
name: cs-pc-builder
spec:
# 任务失败后的重试次数
backoffLimit: 2
# 任务完成后保留 Pod 日志的时间(单位:秒,3600表示1小时后自动清理已完成的 Pod)
ttlSecondsAfterFinished: 3600
template:
metadata:
labels:
app: cs-pc-builder
spec:
# Job 必须指定重启策略:Never 或 OnFailure
restartPolicy: Never
dnsPolicy: "None"
dnsConfig:
nameservers:
- 223.5.5.5
- 114.114.114.11
nodeSelector:
kubernetes.io/hostname: sl-12
imagePullSecrets:
- name: aliyun-acr-secret
containers:
- name: builder
image: crpi-h7tib7641zxd04p0.cn-chengdu.personal.cr.aliyuncs.com/leius/cs:pc_2610
imagePullPolicy: IfNotPresent
workingDir: /app
# 1. 打包 -> 2. 推送到主节点 -> 3. 正常退出
command:
- /bin/sh
- -c
- |
set -e
echo "===> 检查并安装项目依赖..."
# npm install --registry=https://registry.npmmirror.com
npm install --registry=https://registry.npmmirror.com --no-audit --no-fund --loglevel info
echo "===> 开始执行前端打包..."
npm run build
echo "===> 开始同步打包文件到主节点..."
rsync -avz -e "ssh -p 10260 -o StrictHostKeyChecking=no" /app/dist/ root@10.10.1.11:/lei/www/cs_pc/dist/
echo "===> 构建并传输成功,任务结束。"
volumeMounts:
- mountPath: /app
name: app-volume
# - mountPath: /app/node_modules
# name: node-modules-volume
# 挂载宿主机已配置好免密 SSH 的私钥(注意宿主机 /root/.ssh/id_rsa 需提前配好)
- mountPath: /root/.ssh
name: ssh-key
volumes:
- name: app-volume
hostPath:
path: /lei/www/cs/wwwroot/cs_pc
type: DirectoryOrCreate
# - name: node-modules-volume
# emptyDir: {}
- name: ssh-key
hostPath:
path: /root/.ssh
type: Directory解决guac无法远程win桌面问题
## 方法 1:脚本关闭forward #!/bin/bash # 临时修复 - 安装 k3s 后执行 # 1. 修改 FORWARD 链默认策略为 ACCEPT(内网环境,简单直接) iptables -P FORWARD ACCEPT # 2. 添加 NAT MASQUERADE 规则(容器访问 netbird 时进行源地址转换) iptables -t nat -I POSTROUTING 1 -s 172.20.0.0/16 -o wt0 -j MASQUERADE # 3. 验证规则 echo "验证 FORWARD 策略:" iptables -L FORWARD -n | head -1 echo -e "\n验证 NAT MASQUERADE 规则:" iptables -t nat -L POSTROUTING -n -v --line-numbers | head -5 # 4. 测试连通性(替换为实际的 netbird 节点 IP) echo -e "\n测试容器连通性:" docker exec guacamole-guacd ping -c 3 10.10.1.12 ### 方法 2:持久化配置(推荐,重启后自动生效) 创建 systemd 服务: cat > /etc/systemd/system/guac-netbird-fix.service <<'EOF' [Unit] Description=Fix Guacamole Docker access to Netbird network After=network.target docker.service netbird.service k3s.service Before=docker-compose.service [Service] Type=oneshot ExecStart=/bin/bash -c '\ # 修改 FORWARD 链默认策略为 ACCEPT \ /usr/sbin/iptables -P FORWARD ACCEPT; \ \ # 添加 NAT MASQUERADE 规则 \ /usr/sbin/iptables -t nat -C POSTROUTING -s 172.20.0.0/16 -o wt0 -j MASQUERADE 2>/dev/null || \ /usr/sbin/iptables -t nat -I POSTROUTING 1 -s 172.20.0.0/16 -o wt0 -j MASQUERADE' RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF # 启用并启动服务 systemctl daemon-reload systemctl enable guac-netbird-fix.service systemctl start guac-netbird-fix.service # 检查服务状态 systemctl status guac-netbird-fix.service ## 快速验证 # 1. 检查 FORWARD 策略(应该是 ACCEPT) iptables -L FORWARD -n | head -1 # 2. 检查 NAT 规则(应该看到 172.20.0.0/16 -> wt0 的 MASQUERADE 规则) iptables -t nat -L POSTROUTING -n -v | grep -E "(wt0|172.20)" # 3. 查看 netbird 已连接的节点 netbird status --detail | grep -E "(NetBird IP|Status)" | grep -B 1 "Status: Connected" # 4. 测试容器连通性(替换为实际的节点 IP) docker exec guacamole-guacd ping -c 3 10.10.1.12
解决安装k3s后netbird内网下linux到win无法ping通问题
# ============================================ # NetBird + K3s 冲突解决方案 - 完整命令 # ============================================ # 步骤1: 添加 iptables 规则(立即生效) # ---------------------------------------- # 1.1 FORWARD链规则 - 允许 wt0 流量绕过 k3s 规则 iptables -I FORWARD 1 -i wt0 -j ACCEPT iptables -I FORWARD 1 -o wt0 -j ACCEPT # 1.2 INPUT/OUTPUT 规则 - 允许 WireGuard UDP 51820 端口(关键!) iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT iptables -I INPUT 1 -p udp --sport 51820 -j ACCEPT iptables -I OUTPUT 1 -p udp --dport 51820 -j ACCEPT iptables -I OUTPUT 1 -p udp --sport 51820 -j ACCEPT # 步骤2: 重启 netbird 使其重新建立连接 # ---------------------------------------- netbird down sleep 2 netbird up # 步骤3: 验证连通性 # ---------------------------------------- # 等待几秒让连接建立 sleep 5 # 查看连接状态 netbird status # 测试 ping Windows 节点(替换为你的实际IP) ping -c 4 10.10.1.31 # 步骤4: 持久化规则(重启后自动生效) # ---------------------------------------- cat > /etc/systemd/system/netbird-iptables.service <<'EOF' [Unit] Description=Netbird iptables rules for k3s compatibility After=network.target netbird.service Before=k3s.service [Service] Type=oneshot ExecStart=/bin/bash -c '\ # FORWARD链规则 - 允许wt0流量绕过k3s规则 \ /usr/sbin/iptables -C FORWARD -i wt0 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I FORWARD 1 -i wt0 -j ACCEPT; \ /usr/sbin/iptables -C FORWARD -o wt0 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I FORWARD 1 -o wt0 -j ACCEPT; \ \ # INPUT/OUTPUT规则 - 允许WireGuard UDP 51820端口 \ /usr/sbin/iptables -C INPUT -p udp --dport 51820 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT; \ /usr/sbin/iptables -C INPUT -p udp --sport 51820 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I INPUT 1 -p udp --sport 51820 -j ACCEPT; \ /usr/sbin/iptables -C OUTPUT -p udp --dport 51820 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I OUTPUT 1 -p udp --dport 51820 -j ACCEPT; \ /usr/sbin/iptables -C OUTPUT -p udp --sport 51820 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I OUTPUT 1 -p udp --sport 51820 -j ACCEPT' RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF # 启用并启动服务 systemctl daemon-reload systemctl enable netbird-iptables.service systemctl start netbird-iptables.service # 检查服务状态 systemctl status netbird-iptables.service # ============================================ # 完成!现在 Linux 应该可以 ping 通 Windows 节点了 # ============================================ 简化版(如果只想快速测试): # 添加规则 iptables -I FORWARD 1 -i wt0 -j ACCEPT iptables -I FORWARD 1 -o wt0 -j ACCEPT iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT iptables -I INPUT 1 -p udp --sport 51820 -j ACCEPT iptables -I OUTPUT 1 -p udp --dport 51820 -j ACCEPT iptables -I OUTPUT 1 -p udp --sport 51820 -j ACCEPT # 重启 netbird netbird down && sleep 2 && netbird up # 测试 ping -c 4 10.10.1.31 核心原因: k3s 的 iptables 规则阻止了 netbird 的 WireGuard UDP 51820 端口握手流量,导致无法建立隧道。
k3s部署awx容器web管理
https://codeload.github.com/ansible/awx-operator/tar.gz/refs/tags/2.19.1 mv awx-operator-2.19.1 awx-operator 编写部署配置文件 vim kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ./awx-operator/config/default images: - name: quay.io/ansible/awx-operator newName: registry.cn-hangzhou.aliyuncs.com/leiuvn/k3s newTag: awx-operator-2.19.1 - name: gcr.io/kubebuilder/kube-rbac-proxy newName: registry.cn-hangzhou.aliyuncs.com/leiuvn/k3s newTag: kube-rbac-proxy-0.15 - name: registry.k8s.io/kubebuilder/kube-rbac-proxy newName: registry.cn-hangzhou.aliyuncs.com/leiuvn/k3s newTag: kube-rbac-proxy-0.15 # 【全量补丁】只要是 Deployment 资源,通通强行注入 aliyun-registry-secret patches: - patch: | apiVersion: apps/v1 kind: Deployment metadata: name: all-deployments spec: template: spec: imagePullSecrets: - name: aliyun-registry-secret target: kind: Deployment 创建密钥 kubectl create secret docker-registry aliyun-registry-secret \ --docker-server=registry.cn-hangzhou.aliyuncs.com \ --docker-username=qunrcn \ --docker-password=Shimujiuxia@2018 \ --namespace=awx 创建命名空间 kubectl create namespace awx 作用:创建一个名为 awx 的独立"隔离空间" 类比:就像创建一个文件夹,把所有AWX相关的资源(Pod、Service、Secret等)都放进去,避免和其他应用混乱。 切换kubectl默认命名空间 kubectl config set-context --current --namespace=awx 作用:让后续所有 kubectl 命令默认都在 awx 命名空间下操作 设置前:kubectl get pods -n awx 设置后:kubectl get pods 执行部署 kubectl apply -k . 作用:基于当前目录的 kustomization.yaml 配置,部署 AWX Operator 读取 kustomization.yaml 加载 awx-operator/config/default/ 下的 YAML 模板 替换镜像 注入 imagePullSecrets 创建 CRD、RBAC、Deployment 等资源到集群 kubectl apply -f awx-operator/awx-demo.yml 作用:告诉 Operator "帮我创建一个 AWX 实例" 你提交的是一个自定义资源 (CR) 定义 Operator 监听到这个事件后: 创建 PostgreSQL 数据库 创建 Web 服务(前端界面) 创建 Task 服务(执行任务的后端) 创建 Service、Ingress、PVC 等 清理pod kubectl delete pod -n awx --all 作用:删除 awx 命名空间下的所有 Pod 如果有 Deployment/StatefulSet 管理 K8s 会自动重新创建这些 Pod 配置修改后需要重启 排查问题时清除异常状态 更新镜像版本后触发拉取新镜像
-
« 上一篇:
48.v2ray
-
50.netbird
:下一篇 »