kasm
# 调整 K8s 节点内核参数(防崩溃,必做!)# 临时生效sudo sysctl -w fs.inotify.max_user_watches=1048576sudo sysctl -w fs.inotify.max_user_instances=1024
# 永久固化(防止重启失效)cat <<EOF | sudo tee /etc/sysctl.d/99-kasm-inotify.conffs.inotify.max_user_watches=1048576fs.inotify.max_user_instances=1024EOFsudo sysctl --system
# 生成内网自签证书并注入 K8s# 1. 创建命名空间kubectl create namespace kasm-prod
# 1. 写一个“服务器证书”专用配置cat > kasm-server.cnf <<'EOF'[req]distinguished_name = dnprompt = nox509_extensions = v3_ext[dn]CN = kasm.local[v3_ext]basicConstraints = CA:FALSEkeyUsage = critical, digitalSignature, keyEnciphermentextendedKeyUsage = serverAuthsubjectAltName = DNS:kasm.local, IP:10.0.5.167EOF
# 2. 生成新证书(覆盖旧的 tls.key / tls.crt)openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout tls.key -out tls.crt -config kasm-server.cnf
# 3. 验证扩展(必须看到 CA:FALSE、Digital Signature、TLS Web Server Authentication)openssl x509 -in tls.crt -noout -text | grep -A1 "Key Usage\|Basic Constraints"# 验证证书 (确认包含了 pdd.iuin.dev 和 10.0.5.167)openssl x509 -in tls.crt -noout -text | grep -E "Issuer:|Subject:|DNS:|IP Address:"
# 热替换 K8s 里的 TLS Secretkubectl create secret tls kasm-prod-auto-tls \ --cert=tls.crt --key=tls.key \ -n kasm-prod \ --dry-run=client -o yaml | kubectl apply -f -
# ingress-nginx 会自动监听 Secret 变化并热加载,无需重启。如果 10 秒后还不生效,执行 `kubectl rollout restart deploy -n ingress-nginx ingress-nginx-controller-nginx`。
# 在 Mac 上验证新证书已生效openssl s_client -connect 10.0.5.167:32743 -servername kasm.local </dev/null 2>/dev/null | openssl x509 -noout -text | grep -A1 "Key Usage"# 确认输出里是 Digital Signature, Key Encipherment,而不是 Certificate Sign。
# 3. 注入 K8s (名字必须和下面 values 里的一致)kubectl create secret tls kasm-prod-auto-tls \ --cert=tls.crt --key=tls.key \ -n kasm-prod
# 编写生产级 values-prod.yaml(纯内置 DB 版)# ⚠️ 请仔细修改带有 【必改】 的 3 个地方。
# 一键部署 Local Path Provisioner# 1. 部署 Local Path Provisioner(自动创建 StorageClass)kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.31/deploy/local-path-storage.yaml# 2. 验证 StorageClass 是否创建成功kubectl get storageclass# 设置为集群的默认 StorageClass。这样,所有没指定存储类的 PVC(包括这个 Guac 的 tmp-data)都会自动使用它。kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
# 一键安装(给足 15 分钟耐心 --wait --timeout 15m)helm install kasm-prod kasmweb/kasm-helm \ -n kasm-prod \ -f values-prod.yaml# 修改 Kasm 配置后升级需执行以下命令# helm upgrade kasm-prod kasmweb/kasm-helm -n kasm-prod -f values-prod.yaml
# 盯紧 Pod 状态:watch kubectl get pods -n kasm-prod
# 提取管理员密码:kubectl get secret --namespace kasm-prod kasm-prod-secrets -o jsonpath="{.data.admin-password}" | base64 -d; echo
# 浏览器登录:# 访问:https://kasm.local (记得在内网电脑 hosts 里加上 Ingress IP kasm.local)# 账号:admin@kasm.local# 密码:上面提取的密码# (浏览器提示不安全时,盲打 thisisunsafe 或点击“继续前往”)# 4. 解决内网 WebRTC 黑屏(必做):# 登录后,点击左侧 Admin -> Settings -> Server,往下滚动找到 WebRTC 设置项,将 "Enable WebRTC" 取消勾选(或开启 WebRTC Fallback)。保存后,重新打开 Ubuntu 桌面,画面瞬间丝滑出现!让 Ingress 控制器直接“霸占” K8s 节点的 80/443 端口。
Section titled “让 Ingress 控制器直接“霸占” K8s 节点的 80/443 端口。”# 确认节点 443 端口未被占用sudo ss -tlnp | grep -E ':80|:443'
# 开启 Ingress 的 hostNetwork(一键执行)# 1. 确保 Ingress 只有 1 个 Pod (防止两个 Pod 在同一个节点抢 443 端口导致崩溃)kubectl scale deploy ingress-nginx-controller-nginx -n ingress-nginx --replicas=1
# 2. 开启 hostNetwork 并修正 DNS 策略kubectl patch deploy ingress-nginx-controller-nginx -n ingress-nginx --type=json -p='[ {"op":"add","path":"/spec/template/spec/hostNetwork","value":true}, {"op":"add","path":"/spec/template/spec/dnsPolicy","value":"ClusterFirstWithHostNet"}]'