<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Koud+Wind</id>
	<title>md5.pw - 用户贡献 [zh]</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Koud+Wind"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Koud_Wind"/>
	<updated>2026-05-19T08:34:28Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1927</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1927"/>
		<updated>2026-04-15T01:18:33Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;参考:&#039;&#039;&#039;&lt;br /&gt;
* [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ kubeadm 故障排除]&lt;br /&gt;
* [https://headlamp.dev/plugins Headlamp Plugins]&lt;br /&gt;
* [https://helm.sh/zh/docs/chart_template_guide/getting_started/#charts Helm charts]&lt;br /&gt;
[[Category:500 常见应用指南 — Application Guides]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1921</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1921"/>
		<updated>2026-04-15T01:13:46Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 命令补全: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;参考:&#039;&#039;&#039;&lt;br /&gt;
* [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ kubeadm 故障排除]&lt;br /&gt;
* [https://headlamp.dev/plugins Headlamp Plugins]&lt;br /&gt;
* [https://helm.sh/zh/docs/chart_template_guide/getting_started/#charts Helm charts]&lt;br /&gt;
[[index.php?title=Category:500 常见应用指南 — Application Guides]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1918</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1918"/>
		<updated>2026-04-15T01:05:55Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;参考:&#039;&#039;&#039;&lt;br /&gt;
* [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ kubeadm 故障排除]&lt;br /&gt;
* [https://headlamp.dev/plugins Headlamp Plugins]&lt;br /&gt;
* [https://helm.sh/zh/docs/chart_template_guide/getting_started/#charts Helm charts]&lt;br /&gt;
[[Category:500 常见应用指南 — Application Guides]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1897</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1897"/>
		<updated>2026-04-12T20:25:56Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;参考:&#039;&#039;&#039;&lt;br /&gt;
* [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ kubeadm 故障排除]&lt;br /&gt;
* [https://headlamp.dev/plugins Headlamp Plugins]&lt;br /&gt;
* [https://helm.sh/zh/docs/chart_template_guide/getting_started/#charts Helm charts]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1896</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1896"/>
		<updated>2026-04-12T20:23:03Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 参考: =====&lt;br /&gt;
&lt;br /&gt;
* [https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/ kubeadm 故障排除]&lt;br /&gt;
* [https://headlamp.dev/plugins Headlamp Plugins]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1895</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1895"/>
		<updated>2026-04-12T20:13:00Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​我有强迫症&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1894</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1894"/>
		<updated>2026-04-12T20:05:22Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== 1. 什么是 Kubernetes / k8s ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;12. Helm Chart 配置文件模板&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1893</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1893"/>
		<updated>2026-04-12T20:04:05Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;1. 什么是 Kubernetes / k8s&#039;&#039;&#039; ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 安装 containerd ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;5. 安装 kubeadm kubelet kubectl&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. 初始化单节点 k8s 集群 ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 安装 CNI 插件 ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;9. Headlamp (可选)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 12. Helm Chart 配置文件模板 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1892</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1892"/>
		<updated>2026-04-12T20:03:08Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;1. 什么是 Kubernetes / k8s&#039;&#039;&#039; ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 环境说明 ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 安装 containerd ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 安装 kubeadm kubelet kubectl ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== 7. 安装 Helm并设置补全 ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;8. 安装 CNI 插件&#039;&#039;&#039; ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. Headlamp (可选) ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== 10. 常见问题排查 ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;11. 常用命令&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 12. Helm Chart 配置文件模板 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1                                           # Pod 副本数. 单节点或测试环境常设为 1&lt;br /&gt;
revisionHistoryLimit: 10                                  # Deployment 保留的历史版本数. 便于回滚&lt;br /&gt;
minReadySeconds: 0                                        # Pod 就绪后保持多久才视为可用&lt;br /&gt;
&lt;br /&gt;
deploymentStrategy:                                       # Deployment 更新策略&lt;br /&gt;
  type: RollingUpdate                                     # 推荐 RollingUpdate. Recreate 会先删后建&lt;br /&gt;
  rollingUpdate:&lt;br /&gt;
    maxUnavailable: 25%                                   # 滚动更新期间最大不可用比例&lt;br /&gt;
    maxSurge: 25%                                         # 滚动更新期间可额外创建的副本比例&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io                                       # 镜像仓库地址&lt;br /&gt;
  repository: headlamp-k8s/headlamp                       # 示例镜像名. 新容器可改为自己的镜像&lt;br /&gt;
  tag: &amp;quot;&amp;quot;                                                 # 镜像标签. 留空时通常使用 chart 默认 appVersion&lt;br /&gt;
  pullPolicy: IfNotPresent                                # 拉取策略. 常用 IfNotPresent 或 Always&lt;br /&gt;
&lt;br /&gt;
imagePullSecrets: []                                      # 私有仓库拉取密钥. 无需私仓时保持空数组&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;                                          # 覆盖 chart 名称的一部分. 一般不需要&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;                              # 最终资源名. 示例中固定方便管理. 新项目可改&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;                                     # 覆盖命名空间. 一般更建议 helm -n 指定&lt;br /&gt;
&lt;br /&gt;
initContainers:                                           # 初始化容器. 在主容器启动前执行&lt;br /&gt;
  - name: init-plugin-dir                                 # 初始化容器名称&lt;br /&gt;
    image: busybox:1.36                                   # 使用轻量 busybox 镜像&lt;br /&gt;
    imagePullPolicy: IfNotPresent                         # initContainer 拉取策略&lt;br /&gt;
    command:&lt;br /&gt;
      - sh&lt;br /&gt;
      - -c&lt;br /&gt;
      - mkdir -p /headlamp/plugins &amp;amp;&amp;amp; chmod -R 755 /headlamp/plugins   # 创建插件目录并赋权&lt;br /&gt;
    securityContext:&lt;br /&gt;
      runAsNonRoot: false                                 # 初始化目录时通常允许 root 更省事. 严格环境可改&lt;br /&gt;
      allowPrivilegeEscalation: false                     # 禁止提权&lt;br /&gt;
    volumeMounts:&lt;br /&gt;
      - name: plugins-volume                              # 挂载插件卷以便初始化目录&lt;br /&gt;
        mountPath: /headlamp/plugins                      # 容器内插件目录路径&lt;br /&gt;
&lt;br /&gt;
extraContainers: []                                       # 额外 sidecar 容器. 例如日志采集或代理&lt;br /&gt;
&lt;br /&gt;
terminationGracePeriodSeconds: 30                         # 优雅退出宽限期. 过短可能导致连接被硬切断&lt;br /&gt;
hostNetwork: false                                        # 是否使用宿主机网络. 一般保持 false&lt;br /&gt;
dnsPolicy: ClusterFirst                                   # DNS 策略. hostNetwork=true 时常配 ClusterFirstWithHostNet&lt;br /&gt;
dnsConfig: {}                                             # 自定义 DNS 配置. 需模板支持&lt;br /&gt;
hostAliases: []                                           # 额外 hosts 映射. 仅少数场景使用&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  inCluster: true                                         # 集群内访问模式. Pod 通过 ServiceAccount 访问 K8s API&lt;br /&gt;
  inClusterContextName: &amp;quot;main&amp;quot;                            # 集群内上下文名称&lt;br /&gt;
  baseURL: &amp;quot;&amp;quot;                                             # 子路径访问时填写如 /headlamp. 根路径保持空&lt;br /&gt;
  sessionTTL: 86400                                       # 登录会话有效期. 单位秒. 86400 = 24 小时&lt;br /&gt;
&lt;br /&gt;
  oidc:&lt;br /&gt;
    secret:&lt;br /&gt;
      create: false                                       # 是否由 chart 自动创建 OIDC Secret&lt;br /&gt;
      name: oidc                                          # OIDC Secret 名称&lt;br /&gt;
    clientID: &amp;quot;&amp;quot;                                          # OIDC 客户端 ID&lt;br /&gt;
    clientSecret: &amp;quot;&amp;quot;                                      # OIDC 客户端密钥&lt;br /&gt;
    issuerURL: &amp;quot;&amp;quot;                                         # OIDC 发行者地址&lt;br /&gt;
    scopes: &amp;quot;&amp;quot;                                            # OIDC scopes&lt;br /&gt;
    callbackURL: &amp;quot;&amp;quot;                                       # OIDC 回调地址&lt;br /&gt;
    validatorClientID: &amp;quot;&amp;quot;                                 # Token 校验客户端 ID&lt;br /&gt;
    validatorIssuerURL: &amp;quot;&amp;quot;                                # Token 校验发行者地址&lt;br /&gt;
    useAccessToken: false                                 # 是否使用 Access Token&lt;br /&gt;
    usePKCE: false                                        # 是否启用 PKCE&lt;br /&gt;
    useCookie: false                                      # 是否通过 Cookie 保存认证信息&lt;br /&gt;
    externalSecret:&lt;br /&gt;
      enabled: false                                      # 是否使用外部 Secret&lt;br /&gt;
      name: &amp;quot;&amp;quot;                                            # 外部 Secret 名称&lt;br /&gt;
&lt;br /&gt;
  meUserInfoURL: &amp;quot;&amp;quot;                                       # 用户信息接口地址. 未接入外部认证时可留空&lt;br /&gt;
  pluginsDir: &amp;quot;/headlamp/plugins&amp;quot;                         # 插件目录&lt;br /&gt;
  enableHelm: false                                       # 最新 chart 默认值为 false. 仅需展示 Helm 信息时开启&lt;br /&gt;
  watchPlugins: false                                     # 是否实时监听插件目录变化&lt;br /&gt;
  extraArgs: []                                           # 额外启动参数. 例如 -plugins-dir=/headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
env:                                                      # 环境变量&lt;br /&gt;
  - name: TZ                                              # 时区环境变量名称&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;                                # 时区设置&lt;br /&gt;
&lt;br /&gt;
envFrom: []                                               # 从 ConfigMap 或 Secret 批量导入环境变量. 需模板支持&lt;br /&gt;
&lt;br /&gt;
containerPorts:                                           # 容器端口示例. 需模板支持&lt;br /&gt;
  - name: http                                            # 端口名称. 多端口 Service 时建议显式命名&lt;br /&gt;
    containerPort: 4466                                   # 容器监听端口. 请按实际应用修改&lt;br /&gt;
    protocol: TCP                                         # 协议. 通常 TCP&lt;br /&gt;
&lt;br /&gt;
livenessProbe: {}                                         # 存活探针. K8S 原生支持 exec/httpGet/tcpSocket/grpc. 需模板支持&lt;br /&gt;
readinessProbe: {}                                        # 就绪探针. 控制是否加入 Service 端点. 需模板支持&lt;br /&gt;
startupProbe: {}                                          # 启动探针. 慢启动应用推荐配置. 需模板支持&lt;br /&gt;
lifecycle: {}                                             # 生命周期钩子. preStop/postStart. 需模板支持&lt;br /&gt;
&lt;br /&gt;
automountServiceAccountToken: true                        # 自动挂载 ServiceAccount Token. 集群内访问通常保持 true&lt;br /&gt;
&lt;br /&gt;
serviceAccount:&lt;br /&gt;
  create: true                                            # 是否自动创建 ServiceAccount&lt;br /&gt;
  annotations: {}                                         # ServiceAccount 注解&lt;br /&gt;
  name: &amp;quot;&amp;quot;                                                # 最新 chart 默认空字符串. 留空时一般按 fullname 生成&lt;br /&gt;
&lt;br /&gt;
clusterRoleBinding:&lt;br /&gt;
  create: true                                            # 是否自动创建 ClusterRoleBinding&lt;br /&gt;
  clusterRoleName: &amp;quot;cluster-admin&amp;quot;                        # 示例使用 cluster-admin. 生产环境建议改成最小权限角色&lt;br /&gt;
  annotations: {}                                         # ClusterRoleBinding 注解&lt;br /&gt;
&lt;br /&gt;
deploymentAnnotations: {}                                 # Deployment 注解&lt;br /&gt;
podAnnotations:                                           # Pod 注解. 可用于 sidecar 注入 监控抓取等&lt;br /&gt;
  kubectl.kubernetes.io/default-container: &amp;quot;headlamp&amp;quot;     # kubectl exec/logs 默认容器提示. 非必须但更顺手&lt;br /&gt;
&lt;br /&gt;
podLabels:&lt;br /&gt;
  app.kubernetes.io/name: &amp;quot;headlamp&amp;quot;                      # 推荐使用标准标签&lt;br /&gt;
  app.kubernetes.io/component: &amp;quot;web&amp;quot;                      # 组件标签. 便于筛选和治理&lt;br /&gt;
&lt;br /&gt;
hostUsers: true                                           # Pod 是否共享宿主用户命名空间. 设 false 可启用 user namespaces&lt;br /&gt;
&lt;br /&gt;
podSecurityContext:&lt;br /&gt;
  fsGroup: 101                                            # 卷文件组 ID. 便于挂载目录权限控制&lt;br /&gt;
  fsGroupChangePolicy: OnRootMismatch                     # 新版常用项. 仅在需要时递归改卷权限&lt;br /&gt;
  seccompProfile:&lt;br /&gt;
    type: RuntimeDefault                                  # 推荐使用运行时默认 seccomp 配置&lt;br /&gt;
&lt;br /&gt;
securityContext:&lt;br /&gt;
  runAsNonRoot: true                                      # 强制非 root 运行&lt;br /&gt;
  privileged: false                                       # 不使用特权模式&lt;br /&gt;
  runAsUser: 100                                          # 容器运行用户 UID&lt;br /&gt;
  runAsGroup: 101                                         # 容器运行用户组 GID&lt;br /&gt;
  allowPrivilegeEscalation: false                         # 禁止提权&lt;br /&gt;
  readOnlyRootFilesystem: false                           # 需要更强约束时可设 true 并配 writable 卷&lt;br /&gt;
  capabilities:&lt;br /&gt;
    drop:&lt;br /&gt;
      - ALL                                               # 建议默认移除全部 Linux capabilities&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  annotations: {}                                         # Service 注解&lt;br /&gt;
  type: NodePort                                          # 暴露方式. 可选 ClusterIP / NodePort / LoadBalancer&lt;br /&gt;
  port: 80                                                # Service 端口&lt;br /&gt;
  targetPort: http                                        # 目标端口. 建议引用命名端口便于变更&lt;br /&gt;
  appProtocol: http                                       # 应用层协议提示. v1.20 稳定&lt;br /&gt;
  clusterIP: &amp;quot;&amp;quot;                                           # ClusterIP 一般不手动指定&lt;br /&gt;
  # loadBalancerIP: &amp;quot;&amp;quot;                                    # 该字段自 v1.24 起已废弃. 新环境不建议再依赖&lt;br /&gt;
  loadBalancerSourceRanges: []                            # 限制允许访问的来源网段&lt;br /&gt;
  nodePort: 30080                                         # NodePort 固定端口. 浏览器可通过 NodeIP:30080 访问&lt;br /&gt;
  externalTrafficPolicy: Cluster                          # 对外流量策略. Local 可保留客户端源 IP&lt;br /&gt;
  internalTrafficPolicy: Cluster                          # 集群内流量策略. v1.26 稳定. Local 可优先本地端点&lt;br /&gt;
  sessionAffinity: None                                   # 会话亲和性. 可选 None / ClientIP&lt;br /&gt;
  sessionAffinityConfig: {}                               # 会话亲和性高级配置. 需按需填写&lt;br /&gt;
  ipFamilyPolicy: SingleStack                             # 可选 SingleStack / PreferDualStack / RequireDualStack&lt;br /&gt;
  ipFamilies: []                                          # 双栈时可写 [IPv4, IPv6] 或 [IPv6, IPv4]&lt;br /&gt;
  trafficDistribution: PreferSameZone                     # v1.33 稳定. v1.35 支持 PreferSameZone / PreferSameNode&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume                                  # 插件卷名称&lt;br /&gt;
    mountPath: /headlamp/plugins                          # 容器内挂载路径&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷名称&lt;br /&gt;
  #   mountPath: /home/headlamp/.config/Headlamp/kubeconfigs/config   # 容器内 kubeconfig 文件路径&lt;br /&gt;
  #   subPath: config                                     # 将卷中的 config 文件挂载为单文件&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume                                  # 卷名称. 需与 volumeMounts 对应&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /data/headlamp/plugins                        # 宿主机目录. 等价于 Docker 左侧路径&lt;br /&gt;
      type: DirectoryOrCreate                             # 不存在时自动创建目录&lt;br /&gt;
&lt;br /&gt;
  # - name: kubeconfig-volume                             # 可选 kubeconfig 卷&lt;br /&gt;
  #   hostPath:&lt;br /&gt;
  #     path: /data/headlamp/kubeconfigs                  # 宿主机 kubeconfig 所在目录&lt;br /&gt;
  #     type: DirectoryOrCreate                           # 不存在时自动创建&lt;br /&gt;
&lt;br /&gt;
persistentVolumeClaim:&lt;br /&gt;
  enabled: false                                          # 是否改用 PVC 持久化. 使用 hostPath 时通常设 false&lt;br /&gt;
  annotations: {}                                         # PVC 注解&lt;br /&gt;
  accessModes: []                                         # PVC 访问模式. 如 ReadWriteOnce&lt;br /&gt;
  size: &amp;quot;&amp;quot;                                                # PVC 大小. 如 5Gi&lt;br /&gt;
  storageClassName: &amp;quot;&amp;quot;                                    # 存储类名称&lt;br /&gt;
  selector: {}                                            # PVC 选择器&lt;br /&gt;
  volumeMode: &amp;quot;&amp;quot;                                          # 卷模式. 如 Filesystem / Block&lt;br /&gt;
  dataSource: {}                                          # 高级项. 可从快照或现有卷克隆. 需模板支持&lt;br /&gt;
&lt;br /&gt;
ingress:&lt;br /&gt;
  enabled: false                                          # 是否启用 Ingress&lt;br /&gt;
  annotations: {}                                         # Ingress 注解&lt;br /&gt;
  labels: {}                                              # Ingress 标签&lt;br /&gt;
  ingressClassName: &amp;quot;&amp;quot;                                    # IngressClass 名称. 替代旧注解 kubernetes.io/ingress.class&lt;br /&gt;
  hosts: []                                               # 域名和路径配置&lt;br /&gt;
  tls: []                                                 # TLS 配置&lt;br /&gt;
&lt;br /&gt;
httpRoute:&lt;br /&gt;
  enabled: false                                          # 是否启用 Gateway API 的 HTTPRoute&lt;br /&gt;
  annotations: {}                                         # HTTPRoute 注解&lt;br /&gt;
  labels: {}                                              # HTTPRoute 标签&lt;br /&gt;
  parentRefs: []                                          # 关联 Gateway. 启用时通常必填&lt;br /&gt;
  hostnames: []                                           # 绑定域名&lt;br /&gt;
  rules: []                                               # 路由规则. 未配置时通常走默认前缀路由&lt;br /&gt;
&lt;br /&gt;
resources:                                                # 资源请求与限制&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: &amp;quot;100m&amp;quot;                                           # 最低 CPU 请求&lt;br /&gt;
    memory: &amp;quot;128Mi&amp;quot;                                       # 最低内存请求&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: &amp;quot;500m&amp;quot;                                           # CPU 上限&lt;br /&gt;
    memory: &amp;quot;512Mi&amp;quot;                                       # 内存上限&lt;br /&gt;
&lt;br /&gt;
nodeSelector:&lt;br /&gt;
  kubernetes.io/os: linux                                 # 仅调度到 Linux 节点&lt;br /&gt;
&lt;br /&gt;
tolerations: []                                           # 容忍污点. 无特殊需求可留空&lt;br /&gt;
affinity: {}                                              # 亲和性规则. 无特殊需求可留空&lt;br /&gt;
topologySpreadConstraints:                                # 拓扑分布约束. 新版 K8S 常用高可用配置&lt;br /&gt;
  # - maxSkew: 1                                           # 单个拓扑域允许的最大偏斜&lt;br /&gt;
  #   topologyKey: topology.kubernetes.io/zone             # 按可用区分布. 也可用 kubernetes.io/hostname&lt;br /&gt;
  #   whenUnsatisfiable: ScheduleAnyway                    # 可选 DoNotSchedule / ScheduleAnyway&lt;br /&gt;
  #   labelSelector:&lt;br /&gt;
  #     matchLabels:&lt;br /&gt;
  #       app.kubernetes.io/name: headlamp                # 选取同类 Pod&lt;br /&gt;
  #   matchLabelKeys:                                      # v1.27 起 Beta. 可按 Pod 标签键自动匹配&lt;br /&gt;
  #     - pod-template-hash&lt;br /&gt;
  #   nodeAffinityPolicy: Honor                            # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  #   nodeTaintsPolicy: Ignore                             # v1.26 起 Beta. 可选 Honor / Ignore&lt;br /&gt;
  []&lt;br /&gt;
&lt;br /&gt;
priorityClassName: &amp;quot;&amp;quot;                                     # 优先级类名称&lt;br /&gt;
runtimeClassName: &amp;quot;&amp;quot;                                      # 运行时类. 如 gvisor kata 等. 需模板支持&lt;br /&gt;
&lt;br /&gt;
pluginsManager:&lt;br /&gt;
  enabled: false                                           # 是否启用插件管理 sidecar&lt;br /&gt;
  configFile: &amp;quot;plugin.yml&amp;quot;                                # 插件配置文件名&lt;br /&gt;
  configContent: &amp;quot;&amp;quot;                                       # 插件配置内容&lt;br /&gt;
  baseImage: node:lts-alpine                               # 插件管理器基础镜像&lt;br /&gt;
  version: latest                                          # 插件管理器版本&lt;br /&gt;
  volumeMounts: []                                         # 插件管理器额外挂载&lt;br /&gt;
  securityContext: {}                                      # 插件管理器安全上下文&lt;br /&gt;
&lt;br /&gt;
podDisruptionBudget:&lt;br /&gt;
  enabled: false                                           # 是否启用 PDB&lt;br /&gt;
  minAvailable: 0                                          # 最少可用副本数&lt;br /&gt;
  maxUnavailable: null                                     # 最大不可用副本数&lt;br /&gt;
  unhealthyPodEvictionPolicy: null                         # 不健康 Pod 驱逐策略. 新集群可按需设置&lt;br /&gt;
&lt;br /&gt;
extraManifests: []                                         # 附加资源清单. 可内嵌额外 K8s YAML&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1891</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1891"/>
		<updated>2026-04-12T19:58:34Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;1. 什么是 Kubernetes / k8s&#039;&#039;&#039; ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;2. 环境说明&#039;&#039;&#039; ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 安装 kubeadm kubelet kubectl ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;因为我们是单节点, 需要移除 control plane 污点, 除非多台主机节点&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl taint nodes --all node-role.kubernetes.io/control-plane-&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 安装 CNI 插件 ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;9. Headlamp (可选)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;10. 常见问题排查&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 10.1 Flannel 启动失败 ====&lt;br /&gt;
优先检查这几个点, Flannel 官方 README 明确指出 它依赖 &amp;lt;code&amp;gt;br_netfilter&amp;lt;/code&amp;gt; 另外它默认使用 &amp;lt;code&amp;gt;portmap&amp;lt;/code&amp;gt; 作为 CNI 网络插件的一部分 并要求相关 CNI 二进制位于 &amp;lt;code&amp;gt;/opt/cni/bin&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== 10.2 Headlamp 页面能打开但无法登录 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* token 是否复制完整&lt;br /&gt;
* ServiceAccount 是否创建在 &amp;lt;code&amp;gt;kube-system&amp;lt;/code&amp;gt;&lt;br /&gt;
* ClusterRoleBinding 是否绑定成功&lt;br /&gt;
* Headlamp 是否真的暴露成 NodePort&lt;br /&gt;
&lt;br /&gt;
==== 10.3 Pod 无法联网 ====&lt;br /&gt;
重点检查&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kubeadm init&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;--pod-network-cidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Flannel Chart 的 &amp;lt;code&amp;gt;podCidr&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机自身网段是否与 Pod 网段冲突&lt;br /&gt;
&lt;br /&gt;
Kubernetes 官方明确提醒 Pod network 不应与宿主机网络重叠 否则容易出现网络异常&lt;br /&gt;
&lt;br /&gt;
== 11. 常用命令 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 1 集群和命名空间&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl config current-context                               # 查看当前 kubeconfig 上下文&lt;br /&gt;
kubectl config get-contexts                                 # 查看所有可用上下文&lt;br /&gt;
kubectl config use-context my-cluster                       # 切换到指定集群上下文&lt;br /&gt;
kubectl get ns                                              # 查看所有命名空间&lt;br /&gt;
kubectl get pods -n kube-system                             # 查看指定命名空间中的 Pod&lt;br /&gt;
kubectl config set-context --current --namespace=default    # 设置当前上下文默认命名空间&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 2 Helm 安装和版本管理&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami    # 添加 Helm 仓库&lt;br /&gt;
helm repo update                                            # 更新 Helm 仓库索引&lt;br /&gt;
helm search repo nginx                                      # 在 Helm 仓库中搜索 chart&lt;br /&gt;
helm install my-nginx bitnami/nginx                         # 安装一个 Helm release&lt;br /&gt;
helm install my-nginx bitnami/nginx -n web --create-namespace   # 安装到指定命名空间 不存在则创建&lt;br /&gt;
helm install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 使用 values 文件安装 release&lt;br /&gt;
helm upgrade headlamp headlamp/headlamp -n kube-system -f values.yaml    # 升级已有 release&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml   # 不存在则安装 存在则升级&lt;br /&gt;
helm list -A                                                # 查看所有命名空间中的 Helm release&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看某个 release 当前状态&lt;br /&gt;
helm history headlamp -n kube-system                        # 查看 release 历史版本&lt;br /&gt;
helm rollback headlamp 2 -n kube-system                     # 回滚到指定 revision&lt;br /&gt;
helm uninstall headlamp -n kube-system                      # 卸载 release&lt;br /&gt;
helm show values headlamp/headlamp                          # 查看 chart 默认 values&lt;br /&gt;
helm template headlamp headlamp/headlamp -n kube-system -f values.yaml   # 本地渲染模板 不实际安装&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run   # 试运行安装或升级&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n kube-system -f values.yaml --dry-run --debug   # 试运行并输出详细调试信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 3 常用资源查看&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods                                            # 查看当前命名空间的 Pod&lt;br /&gt;
kubectl get pods -o wide                                    # 查看 Pod 并显示节点 IP 等更多信息&lt;br /&gt;
kubectl get pods -w                                         # 持续监听 Pod 状态变化&lt;br /&gt;
kubectl get deploy                                          # 查看 Deployment&lt;br /&gt;
kubectl get svc                                             # 查看 Service&lt;br /&gt;
kubectl get ds                                              # 查看 DaemonSet&lt;br /&gt;
kubectl get sts                                             # 查看 StatefulSet&lt;br /&gt;
kubectl get ingress                                         # 查看 Ingress&lt;br /&gt;
kubectl get all -n kube-system                              # 查看命名空间下常见资源&lt;br /&gt;
kubectl get pods -l app.kubernetes.io/name=headlamp -n kube-system   # 根据标签筛选 Pod&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看 Deployment 的完整 YAML&lt;br /&gt;
kubectl get svc headlamp -n kube-system -o wide             # 查看 Service 详细信息&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 4 排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl describe pod headlamp-xxx-xxx -n kube-system        # 查看 Pod 详细状态和事件&lt;br /&gt;
kubectl describe deploy headlamp -n kube-system             # 查看 Deployment 详细信息&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 详细信息&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 按时间排序查看命名空间事件&lt;br /&gt;
kubectl get events -A --sort-by=.metadata.creationTimestamp # 查看全局事件并按时间排序&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system                # 查看 Pod 日志&lt;br /&gt;
kubectl logs -f headlamp-xxx-xxx -n kube-system             # 持续跟踪 Pod 日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system -c headlamp    # 查看指定容器日志&lt;br /&gt;
kubectl logs headlamp-xxx-xxx -n kube-system --previous     # 查看容器上一次崩溃前日志&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/sh # 进入容器 shell&lt;br /&gt;
kubectl exec -it headlamp-xxx-xxx -n kube-system -- /bin/bash   # 进入容器 bash&lt;br /&gt;
kubectl get pods -n kube-system                             # 先列出 Pod 再选择进入&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入指定 Pod&lt;br /&gt;
kubectl top pod -n kube-system                              # 查看 Pod CPU 和内存使用量&lt;br /&gt;
kubectl top node                                            # 查看节点资源使用量&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 5 发布和重启相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl rollout restart deploy headlamp -n kube-system      # 滚动重启 Deployment&lt;br /&gt;
kubectl rollout status deploy headlamp -n kube-system       # 查看 Deployment 发布状态&lt;br /&gt;
kubectl rollout history deploy headlamp -n kube-system      # 查看 Deployment 发布历史&lt;br /&gt;
kubectl rollout undo deploy headlamp -n kube-system         # 回滚 Deployment 到上一版本&lt;br /&gt;
kubectl scale deploy headlamp --replicas=3 -n kube-system   # 调整副本数&lt;br /&gt;
kubectl delete pod headlamp-xxx-xxx -n kube-system          # 删除 Pod 让控制器自动重建&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 6 网络和端口相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看命名空间下 Service&lt;br /&gt;
kubectl port-forward pod/headlamp-xxx-xxx 8080:80 -n kube-system   # 将本地 8080 转发到 Pod 的 80&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 将本地 8080 转发到 Service 的 80&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 后端 Endpoint&lt;br /&gt;
kubectl run tmp-shell -it --rm --image=busybox -- /bin/sh   # 临时启动调试 Pod&lt;br /&gt;
nslookup kubernetes.default                                 # 在调试容器中解析集群 DNS&lt;br /&gt;
wget -qO- http://headlamp.kube-system.svc.cluster.local     # 在调试容器中访问集群内部 Service&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 7 配置和存储相关&lt;br /&gt;
# -------------------------&lt;br /&gt;
&lt;br /&gt;
kubectl get configmap -n kube-system                        # 查看 ConfigMap&lt;br /&gt;
kubectl get secret -n kube-system                           # 查看 Secret&lt;br /&gt;
kubectl get pvc -A                                          # 查看所有 PVC&lt;br /&gt;
kubectl get pv                                              # 查看所有 PV&lt;br /&gt;
kubectl get nodes -o wide                                   # 查看节点及详细信息&lt;br /&gt;
kubectl describe node node-1                                # 查看节点详细状态&lt;br /&gt;
kubectl get deploy headlamp -n kube-system -o yaml          # 查看实际生效的 Deployment YAML&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 8 Helm 配合排障常用&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 查看 release 当前运行状态&lt;br /&gt;
helm get values headlamp -n kube-system                     # 查看用户自定义 values&lt;br /&gt;
helm get values headlamp -n kube-system -a                  # 查看合并后的全部 values&lt;br /&gt;
helm get manifest headlamp -n kube-system                   # 查看 release 实际渲染出的 manifest&lt;br /&gt;
helm get notes headlamp -n kube-system                      # 查看安装说明和访问提示&lt;br /&gt;
kubectl get pod headlamp-xxx-xxx -n kube-system --show-labels   # 查看 Pod 标签 判断所属 release&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 根据 Helm release 标签筛选整套资源&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 9 最常用 20 个命令&lt;br /&gt;
# -------------------------&lt;br /&gt;
kubectl get pods -A                                         # 查看所有命名空间 Pod&lt;br /&gt;
kubectl get svc -A                                          # 查看所有命名空间 Service&lt;br /&gt;
kubectl get deploy -A                                       # 查看所有命名空间 Deployment&lt;br /&gt;
kubectl get all -n kube-system                              # 查看 kube-system 中常见资源&lt;br /&gt;
kubectl get pods -o wide -n kube-system                     # 查看 Pod 详细信息&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 查看 Pod 详情&lt;br /&gt;
kubectl describe deploy deploy-name -n kube-system          # 查看 Deployment 详情&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看日志&lt;br /&gt;
kubectl logs -f pod-name -n kube-system                     # 持续跟踪日志&lt;br /&gt;
kubectl logs pod-name -n kube-system --previous             # 查看上一次容器日志&lt;br /&gt;
kubectl exec -it pod-name -n kube-system -- /bin/sh         # 进入容器&lt;br /&gt;
kubectl get events -n kube-system --sort-by=.metadata.creationTimestamp   # 查看时间排序事件&lt;br /&gt;
kubectl port-forward svc/service-name 8080:80 -n kube-system   # 本地端口转发到 Service&lt;br /&gt;
kubectl rollout restart deploy deploy-name -n kube-system   # 重启 Deployment&lt;br /&gt;
kubectl rollout status deploy deploy-name -n kube-system    # 查看滚动发布状态&lt;br /&gt;
kubectl scale deploy deploy-name --replicas=2 -n kube-system   # 调整副本数&lt;br /&gt;
helm list -A                                                # 查看所有 Helm release&lt;br /&gt;
helm status release-name -n kube-system                     # 查看 release 状态&lt;br /&gt;
helm get values release-name -n kube-system -a              # 查看 release 全部 values&lt;br /&gt;
helm upgrade --install release-name repo/chart -n kube-system -f values.yaml   # Helm 安装或升级&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 10 实战排障流程&lt;br /&gt;
# -------------------------&lt;br /&gt;
helm status headlamp -n kube-system                         # 先检查 release 状态&lt;br /&gt;
kubectl get all -n kube-system -l app.kubernetes.io/instance=headlamp   # 查看 release 关联资源&lt;br /&gt;
kubectl get pods -n kube-system -o wide                     # 查看 Pod 是否正常运行&lt;br /&gt;
kubectl describe pod pod-name -n kube-system                # 检查 Pod 事件和错误&lt;br /&gt;
kubectl logs pod-name -n kube-system                        # 查看应用日志&lt;br /&gt;
kubectl get svc -n kube-system                              # 查看 Service 是否创建成功&lt;br /&gt;
kubectl describe svc headlamp -n kube-system                # 查看 Service 配置详情&lt;br /&gt;
kubectl get endpoints headlamp -n kube-system               # 查看 Service 是否关联到后端 Pod&lt;br /&gt;
kubectl port-forward svc/headlamp 8080:80 -n kube-system    # 用本地转发验证服务本身是否正常&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# 11 常用别名&lt;br /&gt;
# -------------------------&lt;br /&gt;
alias k=kubectl                                             # kubectl 简写&lt;br /&gt;
alias kgp=&#039;kubectl get pods&#039;                                # 快速查看 Pod&lt;br /&gt;
alias kgs=&#039;kubectl get svc&#039;                                 # 快速查看 Service&lt;br /&gt;
alias kgd=&#039;kubectl get deploy&#039;                              # 快速查看 Deployment&lt;br /&gt;
alias kdp=&#039;kubectl describe pod&#039;                            # 快速查看 Pod 详情&lt;br /&gt;
alias kdd=&#039;kubectl describe deploy&#039;                         # 快速查看 Deployment 详情&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1890</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1890"/>
		<updated>2026-04-12T19:40:22Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;1. 什么是 Kubernetes / k8s&#039;&#039;&#039; ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;2. 环境说明&#039;&#039;&#039; ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 安装 kubeadm kubelet kubectl ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl get nodes&lt;br /&gt;
kubectl get pods -A&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm并设置补全&#039;&#039;&#039; ==&lt;br /&gt;
安装 Helm&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== &#039;&#039;&#039;命令补全:&#039;&#039;&#039; =====&lt;br /&gt;
&lt;br /&gt;
* zsh&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion zsh)&#039; &amp;gt;&amp;gt; ~/.zshrc&lt;br /&gt;
source ~/.zshrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;source &amp;lt;(kubectl completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;source &amp;lt;(helm completion bash)&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* fish&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl completion fish | sudo tee /etc/fish/completions/kubectl.fish &amp;gt; /dev/null&lt;br /&gt;
helm completion fish | sudo tee /etc/fish/completions/helm.fish &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 安装 CNI 插件 ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态, &#039;&#039;&#039;至此, k8s 已经初步部署完成&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;9. Headlamp (可选)&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 9.1 什么是 &#039;&#039;&#039;&amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; ====&lt;br /&gt;
Headlamp是一个面向 k8s 的图形化管理界面, 它的目标是用更直观的方式帮助用户查看和管理集群资源, 例如节点/Pod/Deployment/Service/ConfigMap/Secret 等常见对象, 都可以通过 Web 页面进行浏览和操作&lt;br /&gt;
&lt;br /&gt;
它定义为一个易用且可扩展的 Kubernetes WebUI 并强调它既可以作为集群内 Web 应用运行, 也可以作为桌面应用使用, 和很多传统 Dashboard 相比&lt;br /&gt;
&lt;br /&gt;
Headlamp 的特点主要有三点:&lt;br /&gt;
&lt;br /&gt;
# 界面更现代 更偏向日常运维与开发使用&lt;br /&gt;
# 它支持基于 Kubernetes RBAC 的权限控制 用户能看到和操作的资源会自动受当前权限约束&lt;br /&gt;
# 它具备插件扩展能力 可以根据团队需求定制界面和功能&lt;br /&gt;
&lt;br /&gt;
我个人认为可以帮助初学者摆脱只看命令行输出的方式, 更直观地观察集群中资源的创建/状态变化/日志/配置情况, 因此很适合作为 k8s 学习和演示环境中的可视化入口. &lt;br /&gt;
&lt;br /&gt;
==== 9.2 开始安装 ====&lt;br /&gt;
先新建一个 &amp;lt;code&amp;gt;values.yml&amp;lt;/code&amp;gt; 文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s/headlamp&lt;br /&gt;
nano /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
replicaCount: 1&lt;br /&gt;
&lt;br /&gt;
image:&lt;br /&gt;
  registry: ghcr.io&lt;br /&gt;
  repository: headlamp-k8s/headlamp&lt;br /&gt;
  tag: &amp;quot;&amp;quot;&lt;br /&gt;
  pullPolicy: IfNotPresent&lt;br /&gt;
&lt;br /&gt;
nameOverride: &amp;quot;&amp;quot;&lt;br /&gt;
fullnameOverride: &amp;quot;headlamp&amp;quot;&lt;br /&gt;
namespaceOverride: &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
service:&lt;br /&gt;
  type: NodePort&lt;br /&gt;
  port: 80&lt;br /&gt;
  # 宿主机开放端口&lt;br /&gt;
  nodePort: 30080&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
env:&lt;br /&gt;
  - name: TZ&lt;br /&gt;
    value: &amp;quot;Asia/Shanghai&amp;quot;&lt;br /&gt;
&lt;br /&gt;
config:&lt;br /&gt;
  pluginsDir: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    hostPath:&lt;br /&gt;
      path: /main/k8s/headlamp/plugins&lt;br /&gt;
      type: DirectoryOrCreate&lt;br /&gt;
&lt;br /&gt;
volumeMounts:&lt;br /&gt;
  - name: plugins-volume&lt;br /&gt;
    mountPath: /headlamp/plugins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
resources:&lt;br /&gt;
  requests:&lt;br /&gt;
    cpu: 100m&lt;br /&gt;
    memory: 128Mi&lt;br /&gt;
  limits:&lt;br /&gt;
    cpu: 500m&lt;br /&gt;
    memory: 512Mi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;用 Helm 安装&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install headlamp headlamp/headlamp -n headlamp --create-namespace -f /main/k8s/headlamp/values.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;通过开放的端口访问到 Headlamp, 初次加载需要等待一会, 之后需要输入 &amp;lt;code&amp;gt;token&amp;lt;/code&amp;gt;, 使用命令生成&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl create token headlamp --namespace headlamp --duration 168h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若不通则进行检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 9.3 查看资源使用概览 ====&lt;br /&gt;
Headlamp中各种资源显示, 需要依赖 &amp;lt;code&amp;gt;metrics-server&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install metrics-server metrics-server/metrics-server -n kube-system --set &amp;quot;args[0]=--kubelet-insecure-tls&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;安装好后就可以正常显示资源占用情况&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1889</id>
		<title>如何搭建 Kubernetes 一站式平台</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA_Kubernetes_%E4%B8%80%E7%AB%99%E5%BC%8F%E5%B9%B3%E5%8F%B0&amp;diff=1889"/>
		<updated>2026-04-12T19:04:56Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​尚未完成&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;1. 什么是 Kubernetes / k8s&#039;&#039;&#039; ==&lt;br /&gt;
k8s 也就是 Kubernetes 是一个面向容器化应用的自动化管理平台, 核心职责是管理程序运行的环境, 包括 &amp;lt;code&amp;gt;部署应用/调度资源/维护副本/处理故障/对外暴露服务&amp;lt;/code&amp;gt;等等...&lt;br /&gt;
&lt;br /&gt;
对于初学者来说可以把它理解成一个专门管理容器集群的平台, 当你只有一个容器时也许还感觉不到它的必要性&lt;br /&gt;
&lt;br /&gt;
但当你需要同时运行多个服务, 需要让服务彼此通信, 需要保证应用异常后自动恢复, 甚至需要后续扩容到多台机器时 Kubernetes 的价值就会非常明显&lt;br /&gt;
&lt;br /&gt;
而本文要做的事情, 就是在一台主机上先搭建一个最小可运行的 Kubernetes 环境, 借助这个过程去理解 Kubernetes 是怎样从零开始被组织起来的&lt;br /&gt;
&lt;br /&gt;
为了易读性, 在这里会将 &amp;lt;code&amp;gt;Kubernetes&amp;lt;/code&amp;gt; 简称为 &amp;lt;code&amp;gt;k8s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;2. 环境说明&#039;&#039;&#039; ==&lt;br /&gt;
运行 kubeadm 集群建议 control plane 节点至少具备 &amp;lt;code&amp;gt;2 Core CPU&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;2 GiB&amp;lt;/code&amp;gt; 运存, 推荐购买搬瓦工的 [https://bandwagonhost.com/cart.php?a=add&amp;amp;pid=166 ECOMMERCE SLA] 套餐&lt;br /&gt;
&lt;br /&gt;
* 操作系统以 Debian13 为例&lt;br /&gt;
* 主机数量 1 台&lt;br /&gt;
* 使用 root 用户&lt;br /&gt;
* 主机承担 control plane 和 workload 调度&lt;br /&gt;
* k8s pod网段为 &amp;lt;code&amp;gt;10.10.0.0/16&amp;lt;/code&amp;gt; , service网段为 &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* 使用 &amp;lt;code&amp;gt;Headlamp&amp;lt;/code&amp;gt; 管理k8s pods&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;3. 前置准备&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
==== 3.1 加载模块并启用转发 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/modules-load.d/k8s.conf&lt;br /&gt;
overlay&lt;br /&gt;
br_netfilter&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
modprobe overlay&lt;br /&gt;
modprobe br_netfilter&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt;&#039;EOF&#039; | tee /etc/sysctl.d/k8s.conf&lt;br /&gt;
net.bridge.bridge-nf-call-iptables = 1&lt;br /&gt;
net.bridge.bridge-nf-call-ip6tables = 1&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
EOF&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.2 配置 hosts ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tee -a /etc/hosts &amp;gt; /dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
127.0.0.1 k8s-master&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3.3 关闭 swap (可选) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
swapoff -a&lt;br /&gt;
sed -ri &#039;/\sswap\s/s/^/#/&#039; /etc/fstab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;4. 安装 containerd&#039;&#039;&#039; ==&lt;br /&gt;
更新软件源并安装 containerd 与 其他核心组件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install -y containerd apt-transport-https ca-certificates curl gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;生成默认配置文件并修改配置文件, 这里为了防止后续可能报错, 修改了 &amp;lt;code&amp;gt;bin_dir&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p /etc/containerd&lt;br /&gt;
containerd config default | tee /etc/containerd/config.toml &amp;gt; /dev/null&lt;br /&gt;
sed -i &#039;s#bin_dir = &amp;quot;/usr/lib/cni&amp;quot;#bin_dir = &amp;quot;/opt/cni/bin&amp;quot;#&#039; /etc/containerd/config.toml&lt;br /&gt;
sed -i &#039;s/SystemdCgroup = false/SystemdCgroup = true/&#039; /etc/containerd/config.toml&amp;lt;/syntaxhighlight&amp;gt;重启并设置自启&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl restart containerd&lt;br /&gt;
systemctl enable containerd&lt;br /&gt;
systemctl status containerd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 安装 kubeadm kubelet kubectl ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p -m 755 /etc/apt/keyrings&lt;br /&gt;
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;br /&gt;
echo &#039;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /&#039; | tee /etc/apt/sources.list.d/kubernetes.list&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install -y kubelet kubeadm kubectl&lt;br /&gt;
apt-mark hold kubelet kubeadm kubectl&lt;br /&gt;
systemctl enable --now kubelet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm version&lt;br /&gt;
kubectl version --client&lt;br /&gt;
kubelet --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;6. 初始化单节点 k8s 集群&#039;&#039;&#039; ==&lt;br /&gt;
新建一个初始化配置&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p /main/k8s&lt;br /&gt;
nano /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;粘贴并自行修改配置后进行保存&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: InitConfiguration&lt;br /&gt;
nodeRegistration:&lt;br /&gt;
  name: master&lt;br /&gt;
  criSocket: &amp;quot;unix:///run/containerd/containerd.sock&amp;quot;&lt;br /&gt;
localAPIEndpoint:&lt;br /&gt;
  advertiseAddress: &amp;lt;你的公网主机IP&amp;gt;&lt;br /&gt;
  bindPort: 6443&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
apiVersion: kubeadm.k8s.io/v1beta4&lt;br /&gt;
kind: ClusterConfiguration&lt;br /&gt;
kubernetesVersion: v1.35.0&lt;br /&gt;
networking:&lt;br /&gt;
  podSubnet: 10.10.0.0/16&lt;br /&gt;
  serviceSubnet: 192.168.0.0/16&lt;br /&gt;
  dnsDomain: cluster.local&lt;br /&gt;
&lt;br /&gt;
# 若开启了Swap需要解除此注释!&lt;br /&gt;
#---&lt;br /&gt;
#apiVersion: kubelet.config.k8s.io/v1beta1&lt;br /&gt;
#kind: KubeletConfiguration&lt;br /&gt;
#cgroupDriver: systemd&lt;br /&gt;
#failSwapOn: false&lt;br /&gt;
#memorySwap:&lt;br /&gt;
#  swapBehavior: LimitedSwap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;开始初始化&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubeadm init --config /main/k8s/kubeadm-config.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;初始化完成后配置 kubectl&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p $HOME/.kube&lt;br /&gt;
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;br /&gt;
chown &amp;quot;$(id -u)&amp;quot;:&amp;quot;$(id -g)&amp;quot; $HOME/.kube/config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;检查&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这时 master 大概率是 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 状态, 目前 CNI 还没有安装, CoreDNS 也通常不会处于 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;7. 安装 Helm&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4&lt;br /&gt;
chmod 700 get_helm.sh&lt;br /&gt;
./get_helm.sh&lt;br /&gt;
helm version&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 安装 CNI 插件 ==&lt;br /&gt;
在资源紧凑的主机中我更推荐使用 &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; , 这里也会提供 &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt; 的安装, 根据应用场景自行选择其一&lt;br /&gt;
&lt;br /&gt;
资源占用: &amp;lt;code&amp;gt;Flannel&amp;lt;/code&amp;gt; &amp;lt;  &amp;lt;code&amp;gt;Calico&amp;lt;/code&amp;gt; &amp;lt; &amp;lt;code&amp;gt;Cilium&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.1 Flannel ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kubectl create namespace kube-flannel&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/enforce=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/audit=privileged&lt;br /&gt;
kubectl label namespace kube-flannel --overwrite pod-security.kubernetes.io/warn=privileged&lt;br /&gt;
helm upgrade --install flannel -n kube-flannel --create-namespace --set podCidr=10.10.0.0/16 https://github.com/flannel-io/flannel/releases/download/v0.28.1/flannel.tgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.2 Calico ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;helm repo add projectcalico https://docs.tigera.io/calico/charts&lt;br /&gt;
helm repo update&lt;br /&gt;
kubectl create namespace tigera-operator&lt;br /&gt;
helm upgrade --install calico projectcalico/tigera-operator --version v3.31.4 --namespace tigera-operator --set installation.calicoNetwork.ipPools[0].cidr=10.10.0.0/16 --set installation.calicoNetwork.ipPools[0].encapsulation=VXLAN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8.3 Cilium ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
helm repo add cilium https://helm.cilium.io/&lt;br /&gt;
helm repo update&lt;br /&gt;
helm upgrade --install cilium cilium/cilium --version 1.19.1 --namespace kube-system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;检查CNI&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kubectl get nodes&lt;br /&gt;
kubectl get pods -A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;节点状态从 &amp;lt;code&amp;gt;NotReady&amp;lt;/code&amp;gt; 变为 &amp;lt;code&amp;gt;Ready&amp;lt;/code&amp;gt; , CoreDNS 进入 &amp;lt;code&amp;gt;Running&amp;lt;/code&amp;gt; 状态&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1466</id>
		<title>使用nftables为指定Linux用户强制使用代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1466"/>
		<updated>2026-02-19T15:21:21Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装, 且本地有透明代理端口 (比如Xray的&amp;lt;code&amp;gt;dokodemo-door&amp;lt;/code&amp;gt;), 这里就不注重如何开设透明代理&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置nftables ===&lt;br /&gt;
查看用户id&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cat /etc/passwd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这里假设我在&amp;lt;code&amp;gt;10809&amp;lt;/code&amp;gt;端口开设了Xray的&amp;lt;code&amp;gt;dokodemo-door&amp;lt;/code&amp;gt;, 需要将&amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;1001&amp;lt;/code&amp;gt;的用户id所建立的tcp连接使用代理&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请在合适位置添加或与其它的table进行合并&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet proxy {&lt;br /&gt;
&lt;br /&gt;
    chain output {&lt;br /&gt;
        type nat hook output priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        meta skuid { 1000, 1001 } ip protocol tcp   dnat to 127.0.0.1:10809;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置sysctl ===&lt;br /&gt;
&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/nftables/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 测试 ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
su 1000或1001用户名&lt;br /&gt;
curl https://ipinfo.io/ip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1464</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1464"/>
		<updated>2026-02-19T15:03:11Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染IKEV2数据包一个月, 临时使用为优, 请勿长时间使用, 如果主机在国内可以忽略&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你有其他防火墙规则, 记得放行 UDP&amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;4500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
类型选择IKEV2, 名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;br /&gt;
&lt;br /&gt;
Windows可能无法保存密码信息, 要求密码信息时不能取消, 否则资源管理器会卡死&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-1.png|frameless|631x631px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-2.jpg|frameless|498x498px]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1463</id>
		<title>使用nftables为指定Linux用户强制使用代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1463"/>
		<updated>2026-02-19T15:02:14Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装, 且本地有透明代理端口 (比如Xray的&amp;lt;code&amp;gt;dokodemo-door&amp;lt;/code&amp;gt;), 这里就不注重如何开设透明代理&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置nftables ===&lt;br /&gt;
查看用户id&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cat /etc/passwd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这里假设我在&amp;lt;code&amp;gt;10809&amp;lt;/code&amp;gt;端口开设了透明代理, 我需要&amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;1001&amp;lt;/code&amp;gt;的用户id所建立的tcp连接使用代理&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
请在合适位置添加或与其它的table进行合并&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet proxy {&lt;br /&gt;
&lt;br /&gt;
    chain output {&lt;br /&gt;
        type nat hook output priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        meta skuid { 1000, 1001 } ip protocol tcp   dnat to 127.0.0.1:10809;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1462</id>
		<title>使用nftables屏蔽国外流量</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1462"/>
		<updated>2026-02-19T15:01:45Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 2. 获取国内IP段 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 与 python3 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
python3 --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables python3 unzip&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 获取国内IP段 ===&lt;br /&gt;
先获取并解压项目文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables/geoip&lt;br /&gt;
cd /main/nftables/geoip&lt;br /&gt;
wget https://github.com/pvxe/nftables-geoip/archive/refs/heads/master.zip&lt;br /&gt;
unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行脚本&amp;lt;syntaxhighlight&amp;gt;mv nftables-geoip-master/* ./&lt;br /&gt;
chmod u+x nft_geoip.py&lt;br /&gt;
./nft_geoip.py --file-location location.csv --download&lt;br /&gt;
./nft_geoip.py --download -c cn&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
在合适位置添加或与其它的table进行合并, 这里比如只有访问tcp 46端口的国内IP, 才能放行&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet geoip_filter {&lt;br /&gt;
&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-def-all.nft&amp;quot;;&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-ipv4-interesting.nft&amp;quot;;&lt;br /&gt;
	include &amp;quot;/main/nftables/geoip/geoip-ipv6-interesting.nft&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    chain geoip_mark_input {&lt;br /&gt;
		type filter hook                        prerouting priority -10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		meta mark set                           ip saddr map @geoip4;&lt;br /&gt;
		meta mark set                           ip6 saddr map @geoip6;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行本地/已建立/相关的连接&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
        &lt;br /&gt;
        tcp dport { 46 }    meta mark $CN   ct state new    accept;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1461</id>
		<title>使用nftables为指定Linux用户强制使用代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E4%B8%BA%E6%8C%87%E5%AE%9ALinux%E7%94%A8%E6%88%B7%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86&amp;diff=1461"/>
		<updated>2026-02-19T15:01:27Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“----  === 1. 准备 === 确保 nftables 已经安装, 且本地有透明代理端口 (比如Xray的&amp;lt;code&amp;gt;dokodemo-door&amp;lt;/code&amp;gt;), 这里就不注重如何开设透明代理&amp;lt;syntaxhighlight&amp;gt; nft --version &amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update apt install nftables systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装, 且本地有透明代理端口 (比如Xray的&amp;lt;code&amp;gt;dokodemo-door&amp;lt;/code&amp;gt;), 这里就不注重如何开设透明代理&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置nftables ===&lt;br /&gt;
查看用户id&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cat /etc/passwd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;这里假设我在&amp;lt;code&amp;gt;10809&amp;lt;/code&amp;gt;端口开设了透明代理, 我需要&amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;1001&amp;lt;/code&amp;gt;的用户id所建立的tcp连接使用代理&lt;br /&gt;
&lt;br /&gt;
请在合适位置添加或与其它的table进行合并&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet proxy {&lt;br /&gt;
&lt;br /&gt;
    chain output {&lt;br /&gt;
        type nat hook output priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        meta skuid { 1000, 1001 } ip protocol tcp   dnat to 127.0.0.1:10809;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1460</id>
		<title>使用nftables屏蔽国外流量</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1460"/>
		<updated>2026-02-19T14:47:26Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 2. 获取国内IP段 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 与 python3 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
python3 --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables python3 unzip&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 获取国内IP段 ===&lt;br /&gt;
先获取并解压项目文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables/geoip&lt;br /&gt;
cd /main/nftables/geoip&lt;br /&gt;
wget https://github.com/pvxe/nftables-geoip/archive/refs/heads/master.zip&lt;br /&gt;
unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行脚本&amp;lt;syntaxhighlight&amp;gt;mv nftables-geoip-master/* ./&lt;br /&gt;
chmod u+x nft_geoip.py&lt;br /&gt;
./nft_geoip.py --file-location location.csv --download&lt;br /&gt;
./nft_geoip.py --download -c cn&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
在合适位置的添加或与其它的table进行合并, 这里比如只有访问tcp 46端口的国内IP, 才能放行&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet geoip_filter {&lt;br /&gt;
&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-def-all.nft&amp;quot;;&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-ipv4-interesting.nft&amp;quot;;&lt;br /&gt;
	include &amp;quot;/main/nftables/geoip/geoip-ipv6-interesting.nft&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    chain geoip_mark_input {&lt;br /&gt;
		type filter hook                        prerouting priority -10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		meta mark set                           ip saddr map @geoip4;&lt;br /&gt;
		meta mark set                           ip6 saddr map @geoip6;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行本地/已建立/相关的连接&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
        &lt;br /&gt;
        tcp dport { 46 }    meta mark $CN   ct state new    accept;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1459</id>
		<title>使用nftables屏蔽国外流量</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E5%B1%8F%E8%94%BD%E5%9B%BD%E5%A4%96%E6%B5%81%E9%87%8F&amp;diff=1459"/>
		<updated>2026-02-19T14:42:24Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“----  === 1. 准备 === 确保 nftables 与 python3 已经安装&amp;lt;syntaxhighlight&amp;gt; nft --version python3 --version &amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update apt install nftables python3 unzip systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/ ln -f /main…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 与 python3 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
python3 --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables python3 unzip&lt;br /&gt;
systemctl enable nftables&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 获取国内IP段 ===&lt;br /&gt;
先获取并解压项目文件&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables/geoip&lt;br /&gt;
cd /main/nftables/geoip&lt;br /&gt;
wget https://github.com/pvxe/nftables-geoip/archive/refs/heads/master.zip&lt;br /&gt;
unzip master.zip&lt;br /&gt;
rm master.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;执行脚本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
chmod u+x nft_geoip.py&lt;br /&gt;
./nft_geoip.py --file-location location.csv --download&lt;br /&gt;
./nft_geoip.py --download -c cn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
在合适位置的添加或与其它的table进行合并, 这里比如只有访问tcp 46端口的国内IP, 才能放行&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
table inet geoip_filter {&lt;br /&gt;
&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-def-all.nft&amp;quot;;&lt;br /&gt;
    include &amp;quot;/main/nftables/geoip/geoip-ipv4-interesting.nft&amp;quot;;&lt;br /&gt;
	include &amp;quot;/main/nftables/geoip/geoip-ipv6-interesting.nft&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    chain geoip_mark_input {&lt;br /&gt;
		type filter hook                        prerouting priority -10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		meta mark set                           ip saddr map @geoip4;&lt;br /&gt;
		meta mark set                           ip6 saddr map @geoip6;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行本地/已建立/相关的连接&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
        &lt;br /&gt;
        tcp dport { 46 }    meta mark $CN   ct state new    accept;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
保存后并重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1458</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1458"/>
		<updated>2026-02-19T11:01:09Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染IKEV2数据包一个月, 临时使用为优, 请勿长时间使用, 如果主机在国内可以忽略&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存 执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你有其他防火墙规则, 记得放行 UDP&amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;4500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
类型选择IKEV2, 名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;br /&gt;
&lt;br /&gt;
Windows可能无法保存密码信息, 要求密码信息时不能取消, 否则资源管理器会卡死&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-1.png|frameless|631x631px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-2.jpg|frameless|498x498px]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1457</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1457"/>
		<updated>2026-02-19T11:00:30Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染IKEV2数据包一个月, 临时使用为优, 请勿长时间使用&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存 执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你有其他防火墙规则, 记得放行 UDP&amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;4500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
类型选择IKEV2, 名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;br /&gt;
&lt;br /&gt;
Windows可能无法保存密码信息, 要求密码信息时不能取消, 否则资源管理器会卡死&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-1.png|frameless|631x631px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-2.jpg|frameless|498x498px]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1456</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1456"/>
		<updated>2026-02-19T10:59:42Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染数据包一个月, 临时使用为优, 请勿长时间使用&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存 执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你有其他防火墙规则, 记得放行 UDP&amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;4500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
类型选择IKEV2, 名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;br /&gt;
&lt;br /&gt;
Windows可能无法保存密码信息, 要求密码信息时不能取消, 否则资源管理器会卡死&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-1.png|frameless|631x631px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-2.jpg|frameless|498x498px]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1455</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1455"/>
		<updated>2026-02-19T10:57:49Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染数据包一个月, 临时使用为优, 请勿长时间使用&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存 执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
类型选择IKEV2, 名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;br /&gt;
&lt;br /&gt;
Windows可能无法保存密码信息, 要求密码信息时不能取消, 否则资源管理器会卡死&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-1.png|frameless|631x631px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓设置:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何搭建IKEV2 VPN-2.jpg|frameless|498x498px]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN-2.jpg&amp;diff=1454</id>
		<title>File:如何搭建IKEV2 VPN-2.jpg</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN-2.jpg&amp;diff=1454"/>
		<updated>2026-02-19T10:57:19Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN-1.png&amp;diff=1453</id>
		<title>File:如何搭建IKEV2 VPN-1.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN-1.png&amp;diff=1453"/>
		<updated>2026-02-19T10:55:13Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1452</id>
		<title>如何搭建IKEV2 VPN</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BAIKEV2_VPN&amp;diff=1452"/>
		<updated>2026-02-19T10:50:23Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“&amp;#039;&amp;#039;&amp;#039;注意&amp;#039;&amp;#039;&amp;#039;: IKEV2协议可能会被GFW污染数据包一个月, 临时使用为优, 请勿长时间使用  适合不能配置HTTP代理且不能安装其他代理客户端的设备 ----  === 1. 准备 === 以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins systemctl enable strongswan-starter mkdir -p /main/ikev2/cert cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;s…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;注意&#039;&#039;&#039;: IKEV2协议可能会被GFW污染数据包一个月, 临时使用为优, 请勿长时间使用&lt;br /&gt;
&lt;br /&gt;
适合不能配置HTTP代理且不能安装其他代理客户端的设备&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
以 Debian13 为例&amp;lt;syntaxhighlight&amp;gt;apt update&lt;br /&gt;
apt install nftables strongswan libstrongswan-extra-plugins libcharon-extra-plugins libcharon-extauth-plugins&lt;br /&gt;
systemctl enable strongswan-starter&lt;br /&gt;
mkdir -p /main/ikev2/cert&lt;br /&gt;
cd /main/ikev2&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sysctl&amp;lt;/code&amp;gt; 中需要配置IP转发, 新建一个&amp;lt;code&amp;gt;forward.conf&amp;lt;/code&amp;gt;并进行编辑&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
net.ipv4.ip_forward = 1&lt;br /&gt;
net.ipv6.conf.all.forwarding = 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后链接过去, 并让其生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/ikev2/forward.conf /etc/sysctl.d/&lt;br /&gt;
sysctl --system&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置证书 ===&lt;br /&gt;
这里我们使用自签证书, 先切换目录&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/ikev2/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = ikev2&lt;br /&gt;
CN                 = ikev2 cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存 执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=ikev2/CN=ikev2 ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;将证书链接到配置目录中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /etc/ipsec.d/{private,certs}&lt;br /&gt;
ln -f /main/ikev2/cert/server.key.pem /etc/ipsec.d/private/&lt;br /&gt;
ln -f /main/ikev2/cert/server.cert.pem /etc/ipsec.d/certs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置nftables ===&lt;br /&gt;
主要是为了根据 IKEV2 服务端分配给客户端的IP, 将数据包转发到指定网卡&lt;br /&gt;
&lt;br /&gt;
如果你之前配置过nftables, 不是编辑配置文件, 那就从之前的配置中取, 并进行链接, 准备编辑&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/nftables&lt;br /&gt;
cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;如果你没有配置过, 那就在&amp;lt;code&amp;gt;/main/nftables/&amp;lt;/code&amp;gt;中创建一个&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;配置文件并链接过去, 准备编辑&amp;lt;syntaxhighlight&amp;gt;ln -f /main/nftables/nftables.conf /etc/&amp;lt;/syntaxhighlight&amp;gt;如果你之前配置过nftables, 且编辑了配置文件, 就直接修改那个配置文件, 准备编辑&lt;br /&gt;
&lt;br /&gt;
现在开始编辑&amp;lt;code&amp;gt;nftables.conf&amp;lt;/code&amp;gt;, 加入以下配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet ikev2_nat {&lt;br /&gt;
    chain postrouting {&lt;br /&gt;
        type nat hook                           postrouting priority 10;&lt;br /&gt;
        policy accept;&lt;br /&gt;
&lt;br /&gt;
        # 自行修改网卡或IP&lt;br /&gt;
        ip saddr 10.10.0.0/16                   oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
		ip6 saddr fd00:ce20::/16                oif &amp;quot;eth0&amp;quot; masquerade;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;保存好后并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl enable nftables.service&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置IKEV2 ===&lt;br /&gt;
在&amp;lt;code&amp;gt;/main/ikev2&amp;lt;/code&amp;gt;中分别创建文件: &amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conf是核心配置, secrets是用户配置, 需要自行修改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ipsec.conf&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
config setup&lt;br /&gt;
    charondebug=&amp;quot;ike 2, knl 2, net 2, esp 2, dmn 2, mgr 2&amp;quot;&lt;br /&gt;
    uniqueids=no&lt;br /&gt;
&lt;br /&gt;
conn ikev2-eap-mschapv2&lt;br /&gt;
    keyexchange=ikev2&lt;br /&gt;
    ike=aes256-sha1-sha256-sha384-modp2048,aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024!&lt;br /&gt;
    esp=aes256-3des-sha1&lt;br /&gt;
    &lt;br /&gt;
    auto=add&lt;br /&gt;
    compress=no&lt;br /&gt;
    dpdaction=clear&lt;br /&gt;
    fragmentation=yes&lt;br /&gt;
    forceencaps=yes&lt;br /&gt;
    &lt;br /&gt;
    dpddelay=30s&lt;br /&gt;
    ikelifetime=10h&lt;br /&gt;
    lifetime=30m&lt;br /&gt;
&lt;br /&gt;
    left=%defaultroute&lt;br /&gt;
    leftauth=pubkey&lt;br /&gt;
    leftid=你的域名&lt;br /&gt;
    leftcert=server.cert.pem&lt;br /&gt;
    leftsendcert=always&lt;br /&gt;
    leftsubnet=0.0.0.0/0,::/0&lt;br /&gt;
    leftfirewall=yes&lt;br /&gt;
&lt;br /&gt;
    right=%any&lt;br /&gt;
    rightid=%any&lt;br /&gt;
    rightauth=eap-mschapv2&lt;br /&gt;
    rightsourceip=10.10.0.0/16,fd00:ce20::/16&lt;br /&gt;
    rightdns=1.1.1.1,8.8.8.8&lt;br /&gt;
    rightsendcert=never&lt;br /&gt;
    eap_identity=%identity&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ipsec.secrets&amp;lt;/code&amp;gt;的配置: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
: RSA &amp;quot;server.key.pem&amp;quot;&lt;br /&gt;
User1 : EAP &amp;quot;123456789&amp;quot;&lt;br /&gt;
User2 : EAP &amp;quot;这是用户密码, 换行前面要注意不能有空格&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;自行修改好后, 重启服务并生效&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart strongswan-starter.service&lt;br /&gt;
systemctl status strongswan-starter.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 安装证书 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面配置证书的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;安卓安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
以&#039;&#039;&#039;iqoo&#039;&#039;&#039;为例, 进入手机设置 -&amp;gt; 安全 -&amp;gt; 更多安全设置 -&amp;gt; 从手机存储安装 -&amp;gt; CA证书, 文件选择&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其他手机可以搜索 &amp;lt;code&amp;gt;CA/证书/凭证&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IOS安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
下载证书后, 进入设置直接安装&lt;br /&gt;
&lt;br /&gt;
=== 6. 设备使用 ===&lt;br /&gt;
添加 IKEV2 基本都是在任何系统里的设置中, 进入设置后找到VPN选项, 并添加&lt;br /&gt;
&lt;br /&gt;
名称随便起, 地址则是你的域名, 有些可能需要设置&amp;lt;code&amp;gt;IPSec标识符&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;远程ID&amp;lt;/code&amp;gt;, 这些也填写成你的域名, 再输入设置好的用户名与密码, 就可以连接了&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1448</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1448"/>
		<updated>2026-02-19T05:55:48Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 5. 客户端使用 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置, 可以参考[https://gost.run/ 官网]的教程&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
若是自签证书, 任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linux安装证书:&#039;&#039;&#039;&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /usr/local/share/ca-certificates&lt;br /&gt;
cp ca.cert.pem /usr/local/share/ca-certificates/&lt;br /&gt;
chmod 0644 /usr/local/share/ca-certificates/ca.cert.pem&lt;br /&gt;
update-ca-certificates&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows使用:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux使用:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1441</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1441"/>
		<updated>2026-02-18T20:42:01Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行以下命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置, 可以参考[https://gost.run/ 官网]的教程&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linux安装证书:&#039;&#039;&#039;&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /usr/local/share/ca-certificates&lt;br /&gt;
cp ca.cert.pem /usr/local/share/ca-certificates/&lt;br /&gt;
chmod 0644 /usr/local/share/ca-certificates/ca.cert.pem&lt;br /&gt;
update-ca-certificates&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows使用:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux使用:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1440</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1440"/>
		<updated>2026-02-18T20:40:19Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置, 可以参考[https://gost.run/ 官网]的教程&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows安装证书:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linux安装证书:&#039;&#039;&#039;&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /usr/local/share/ca-certificates&lt;br /&gt;
cp ca.cert.pem /usr/local/share/ca-certificates/&lt;br /&gt;
chmod 0644 /usr/local/share/ca-certificates/ca.cert.pem&lt;br /&gt;
update-ca-certificates&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows使用:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux使用:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1439</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1439"/>
		<updated>2026-02-18T20:31:11Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Windows&#039;&#039;&#039;安装证书:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀, 双击安装, 到本地计算机, 将证书放入下列存储 (受信任的根证书颁发机构)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linux安装证书:&#039;&#039;&#039;&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir -p /usr/local/share/ca-certificates&lt;br /&gt;
cp ca.cert.pem /usr/local/share/ca-certificates/&lt;br /&gt;
chmod 0644 /usr/local/share/ca-certificates/ca.cert.pem&lt;br /&gt;
update-ca-certificates&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置, 可以参考[https://gost.run/ 官网]的教程&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1438</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1438"/>
		<updated>2026-02-18T20:16:13Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;可改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀以供windows系统安装&lt;br /&gt;
&lt;br /&gt;
查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置, 可以参考[https://gost.run/ 官网]的教程&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1437</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1437"/>
		<updated>2026-02-18T20:14:24Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;可改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀以供windows系统安装&lt;br /&gt;
&lt;br /&gt;
查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;其他系统设置可能不支持HTTPS代理, 仅有HTTP代理&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1436</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1436"/>
		<updated>2026-02-18T20:11:41Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 5. 客户端使用 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;可改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀以供windows系统安装&lt;br /&gt;
&lt;br /&gt;
查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1435</id>
		<title>如何使用gost搭建HTTPS代理</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86&amp;diff=1435"/>
		<updated>2026-02-18T20:11:20Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?  有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差 ----  === 1. 准备 === 主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt; wget htt…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;有时候, 我们访问受限, 无法下载到代理工具 (比如:Xray); 或不想过多的配置或下载代理客户端, 只是临时用一下代理而已, 传统的HTTP代理又不安全, 容易被识别出来, 有没有一个服务端能够支持客户端使用HTTPS代理?&lt;br /&gt;
&lt;br /&gt;
有, 那就是&amp;lt;code&amp;gt;gost&amp;lt;/code&amp;gt;, 而且它的速度不比Xray的&amp;lt;code&amp;gt;vless+reality+xtls-rprx-vision&amp;lt;/code&amp;gt;的差&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
主要使用3.0版本&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
wget https://github.com/go-gost/gost/releases/download/v3.2.6/gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
tar -xzf gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
mv gost /usr/local/bin/&lt;br /&gt;
chmod u+x /usr/local/bin/gost&lt;br /&gt;
rm gost_3.2.6_linux_amd64.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;可以自行更换版本, 也可以使用[https://github.com/go-gost/gost Github]上的安装脚本&lt;br /&gt;
&lt;br /&gt;
=== 2. 配置service ===&lt;br /&gt;
新建一个&amp;lt;code&amp;gt;gost.service&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=gost&lt;br /&gt;
After=network.target network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
StandardError=journal&lt;br /&gt;
ExecStart=&amp;quot;/usr/local/bin/gost&amp;quot;&lt;br /&gt;
ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=1s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;我们保存在&amp;lt;code&amp;gt;/main/gost/&amp;lt;/code&amp;gt;为例, 建立一个软链接以方便备份与配置&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.service /etc/systemd/system/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;添加到开机启动中&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置证书 ===&lt;br /&gt;
你可以选择使用自签证书或正式证书, 若&#039;&#039;&#039;使用正式证书且不配置代理账号密码&#039;&#039;&#039;会导致主机变为肉鸡, 若使用自签证书会有更好的安全性, 前提是你的自签证书没有被泄露, 这里仅展示自签证书的配置方法&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
mkdir /main/gost/cert&lt;br /&gt;
cd /main/gost/cert&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;server.cert.conf&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits       = 4096&lt;br /&gt;
default_md         = sha256&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions     = req_ext&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
prompt             = no&lt;br /&gt;
&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
O                  = gost&lt;br /&gt;
CN                 = gost cert&lt;br /&gt;
&lt;br /&gt;
[req_ext]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
&lt;br /&gt;
[v3_ca]&lt;br /&gt;
subjectAltName     = @alt_names&lt;br /&gt;
basicConstraints   = CA:FALSE&lt;br /&gt;
keyUsage           = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage   = serverAuth, clientAuth&lt;br /&gt;
&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1              = 你的域名&lt;br /&gt;
DNS.2              = 你的第二个域名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;需要设置好域名并进行保存&lt;br /&gt;
&lt;br /&gt;
执行命令&amp;lt;syntaxhighlight&amp;gt;openssl genrsa -out ca.key.pem 4096&lt;br /&gt;
openssl req -new -x509 -nodes -days 5475 -sha256 -key ca.key.pem -out ca.cert.pem -subj &amp;quot;/O=gost/CN=gost ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out server.key.pem 4096&lt;br /&gt;
openssl req -new -key server.key.pem -out server.csr.pem -config server.cert.conf&lt;br /&gt;
openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in server.csr.pem -out server.cert.pem -days 5475 -sha256 -extfile server.cert.conf -extensions v3_ca&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;可改为&amp;lt;code&amp;gt;.der&amp;lt;/code&amp;gt;后缀以供windows系统安装&lt;br /&gt;
&lt;br /&gt;
查看证书信息&amp;lt;syntaxhighlight&amp;gt;openssl x509 -in ca.cert.pem -text -noout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 配置gost ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cd /main/gost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;新建一个&amp;lt;code&amp;gt;gost.json&amp;lt;/code&amp;gt;并进行配置&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;services&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;https-proxy&amp;quot;,&lt;br /&gt;
      &amp;quot;addr&amp;quot;: &amp;quot;:56000&amp;quot;,&lt;br /&gt;
      &amp;quot;handler&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
          &amp;quot;knock&amp;quot;: &amp;quot;你的域名&amp;quot;,&lt;br /&gt;
          &amp;quot;probeResist&amp;quot;: &amp;quot;web:test-ipv6.com:80&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;listener&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tls&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  ],&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;tls&amp;quot;: {&lt;br /&gt;
    &amp;quot;certFile&amp;quot;: &amp;quot;/main/gost/cert/server.cert.pem&amp;quot;,&lt;br /&gt;
    &amp;quot;keyFile&amp;quot;: &amp;quot;/main/gost/cert/server.key.pem&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;对原配置文件进行链接&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ln -f /main/gost/gost.json /etc/gost/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;重启服务&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart gost.service&lt;br /&gt;
systemctl status gost.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. 客户端使用 ===&lt;br /&gt;
任何系统想用就必须装上&#039;&#039;&#039;CA证书&#039;&#039;&#039;, 也就是上面提到的&amp;lt;code&amp;gt;ca.cert.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
[[File:如何使用gost搭建HTTPS代理-1.png|frameless|421x421px]]&lt;br /&gt;
&#039;&#039;&#039;Linux:&#039;&#039;&#039; &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
export https_proxy=&amp;quot;https://你的域名:56000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86-1.png&amp;diff=1434</id>
		<title>File:如何使用gost搭建HTTPS代理-1.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8gost%E6%90%AD%E5%BB%BAHTTPS%E4%BB%A3%E7%90%86-1.png&amp;diff=1434"/>
		<updated>2026-02-18T20:08:14Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1428</id>
		<title>如何使用IPv6/64段内任意一个IPv6地址而非默认地址</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1428"/>
		<updated>2026-02-18T15:59:24Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概述 ==&lt;br /&gt;
本教程介绍如何在搬瓦工的 Linux 系统中通过配置虚拟网卡（v4tunnel），从分配的 IPv6 /64 段中自由指定并使用任意一个 IPv6 地址。&lt;br /&gt;
&lt;br /&gt;
== 操作步骤 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. 清理现有网络设备 ===&lt;br /&gt;
在开始配置前，先尝试关闭并删除可能冲突的旧设备：&amp;lt;syntaxhighlight&amp;gt;ifdown ipv6net 2&amp;gt;/dev/null&lt;br /&gt;
ip link delete ipv6net 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 修改网络配置文件 ===&lt;br /&gt;
编辑网络配置文件 &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;，添加以下配置段。&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nano /etc/network/interfaces&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight&amp;gt;auto ipv6net&lt;br /&gt;
 iface ipv6net inet6 v4tunnel&lt;br /&gt;
     #输入你要指定的IPv6地址&lt;br /&gt;
     address 2607:8700:5501:xxxx:xxxx:xxxx:xxxx:xxxx&lt;br /&gt;
     netmask 64&lt;br /&gt;
     endpoint 207.246.106.118&lt;br /&gt;
     #输入IPv4地址&lt;br /&gt;
     local xxx.xxx.xxx.xxx&lt;br /&gt;
     ttl 255&lt;br /&gt;
     gateway 2607:8700:5501:xxxx::1&lt;br /&gt;
     mtu 1480&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 启用并验证 ===&lt;br /&gt;
执行以下命令启用网卡并检查状态：&amp;lt;syntaxhighlight&amp;gt;# 启动接口&lt;br /&gt;
ifup ipv6net&lt;br /&gt;
&lt;br /&gt;
# 查看接口状态&lt;br /&gt;
ip link show ipv6net&lt;br /&gt;
&lt;br /&gt;
# 验证 IPv6&lt;br /&gt;
curl -6 ifconfig.me&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 关闭IPv6地址自动配置 ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl stop ipv6net.service &lt;br /&gt;
systemctl disable ipv6net.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 注意事项 ==&lt;br /&gt;
VPS在进行迁移或快照恢复的时候, 会重置&amp;lt;code&amp;gt;ipv6net&amp;lt;/code&amp;gt;, 需要重新按照此教程进行配置&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1427</id>
		<title>如何使用IPv6/64段内任意一个IPv6地址而非默认地址</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1427"/>
		<updated>2026-02-18T15:57:46Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概述 ==&lt;br /&gt;
本教程介绍如何在搬瓦工的 Linux 系统中通过配置虚拟网卡（v4tunnel），从分配的 IPv6 /64 段中自由指定并使用任意一个 IPv6 地址。&lt;br /&gt;
&lt;br /&gt;
== 操作步骤 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. 清理现有网络设备 ===&lt;br /&gt;
在开始配置前，先尝试关闭并删除可能冲突的旧设备：&amp;lt;syntaxhighlight&amp;gt;ifdown ipv6net 2&amp;gt;/dev/null&lt;br /&gt;
ip link delete ipv6net 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 修改网络配置文件 ===&lt;br /&gt;
编辑网络配置文件 &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;，添加以下配置段。&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nano /etc/network/interfaces&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight&amp;gt;auto ipv6net&lt;br /&gt;
 iface ipv6net inet6 v4tunnel&lt;br /&gt;
     #输入你要指定的IPv6地址&lt;br /&gt;
     address 2607:8700:5501:xxxx:xxxx:xxxx:xxxx:xxxx&lt;br /&gt;
     netmask 64&lt;br /&gt;
     endpoint 207.246.106.118&lt;br /&gt;
     #输入IPv4地址&lt;br /&gt;
     local xxx.xxx.xxx.xxx&lt;br /&gt;
     ttl 255&lt;br /&gt;
     gateway 2607:8700:5501:xxxx::1&lt;br /&gt;
     mtu 1480&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 启用并验证 ===&lt;br /&gt;
执行以下命令启用网卡并检查状态：&amp;lt;syntaxhighlight&amp;gt;# 启动接口&lt;br /&gt;
ifup ipv6net&lt;br /&gt;
&lt;br /&gt;
# 查看接口状态&lt;br /&gt;
ip link show ipv6net&lt;br /&gt;
&lt;br /&gt;
# 验证 IPv6&lt;br /&gt;
curl -6 ifconfig.me&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 关闭IPv6地址自动配置 ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl stop ipv6net.service &lt;br /&gt;
systemctl disable ipv6net.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 注意事项 ==&lt;br /&gt;
VPS在进行迁移或快照恢复的时候, 会重置&amp;lt;code&amp;gt;ipv6net&amp;lt;/code&amp;gt;, 需要重新按照此教程进行配置&lt;br /&gt;
&lt;br /&gt;
Category: [[300 VPS 设置与管理 — VPS Setup and Management]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1426</id>
		<title>如何使用IPv6/64段内任意一个IPv6地址而非默认地址</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8IPv6/64%E6%AE%B5%E5%86%85%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AAIPv6%E5%9C%B0%E5%9D%80%E8%80%8C%E9%9D%9E%E9%BB%98%E8%AE%A4%E5%9C%B0%E5%9D%80&amp;diff=1426"/>
		<updated>2026-02-18T15:53:18Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​修正与补充&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概述 ==&lt;br /&gt;
本教程介绍如何在搬瓦工的 Linux 系统中通过配置虚拟网卡（v4tunnel），从分配的 IPv6 /64 段中自由指定并使用任意一个 IPv6 地址。&lt;br /&gt;
&lt;br /&gt;
== 操作步骤 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. 清理现有网络设备 ===&lt;br /&gt;
在开始配置前，先尝试关闭并删除可能冲突的旧设备：&amp;lt;syntaxhighlight&amp;gt;ifdown ipv6net 2&amp;gt;/dev/null&lt;br /&gt;
ip link delete ipv6net 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. 修改网络配置文件 ===&lt;br /&gt;
编辑网络配置文件 &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;，添加以下配置段。&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nano /etc/network/interfaces&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight&amp;gt;auto ipv6net&lt;br /&gt;
 iface ipv6net inet6 v4tunnel&lt;br /&gt;
     #输入你要指定的IPv6地址&lt;br /&gt;
     address 2607:8700:5501:xxxx:xxxx:xxxx:xxxx:xxxx&lt;br /&gt;
     netmask 64&lt;br /&gt;
     endpoint 207.246.106.118&lt;br /&gt;
     #输入IPv4地址&lt;br /&gt;
     local xxx.xxx.xxx.xxx&lt;br /&gt;
     ttl 255&lt;br /&gt;
     gateway 2607:8700:5501:xxxx::1&lt;br /&gt;
     mtu 1480&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 启用并验证 ===&lt;br /&gt;
执行以下命令启用网卡并检查状态：&amp;lt;syntaxhighlight&amp;gt;# 启动接口&lt;br /&gt;
ifup ipv6net&lt;br /&gt;
&lt;br /&gt;
# 查看接口状态&lt;br /&gt;
ip link show ipv6net&lt;br /&gt;
&lt;br /&gt;
# 验证 IPv6&lt;br /&gt;
curl -6 ifconfig.me&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 关闭IPv6地址自动配置 ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl stop ipv6net.service &lt;br /&gt;
systemctl disable ipv6net.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 注意事项 ==&lt;br /&gt;
VPS在进行迁移或快照恢复的时候, 会重置&amp;lt;code&amp;gt;ipv6net&amp;lt;/code&amp;gt;, 需要重新按照此教程进行配置&lt;br /&gt;
[[index.php?title=Category:300 VPS 设置与管理 — VPS Setup and Management]]&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1425</id>
		<title>查看Xray中各用户流量使用情况的脚本</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1425"/>
		<updated>2026-02-18T15:27:45Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 预览 ==&lt;br /&gt;
----[[File:查看Xray中各用户流量使用情况的脚本-预览1.png|alt=|frameless|1104x1104px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 要求 ==&lt;br /&gt;
Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;配置参考:&#039;&#039;&#039; &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stats&amp;quot;: {},&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;api&amp;quot;: {&lt;br /&gt;
    &amp;quot;tag&amp;quot;: &amp;quot;API&amp;quot;,&lt;br /&gt;
    &amp;quot;listen&amp;quot;: &amp;quot;127.0.0.1:8080&amp;quot;,&lt;br /&gt;
    &amp;quot;services&amp;quot;: [&lt;br /&gt;
      &amp;quot;LoggerService&amp;quot;,&lt;br /&gt;
      &amp;quot;StatsService&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;policy&amp;quot;: {&lt;br /&gt;
    &amp;quot;levels&amp;quot;: {&lt;br /&gt;
      &amp;quot;0&amp;quot;: {&lt;br /&gt;
        &amp;quot;handshake&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;connIdle&amp;quot;: 600,&lt;br /&gt;
        &amp;quot;statsUserUplink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserDownlink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserOnline&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;system&amp;quot;: {&lt;br /&gt;
      &amp;quot;statsInboundUplink&amp;quot;: true,&lt;br /&gt;
      &amp;quot;statsInboundDownlink&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;用户配置参考:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;UserId123456&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;易于标识的名称&amp;quot;,&lt;br /&gt;
    &amp;quot;level&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 内容 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
XRAY_BIN=&amp;quot;${XRAY_BIN:-xray}&amp;quot;&lt;br /&gt;
# 自行修改 Xray API 地址&lt;br /&gt;
SERVER=&amp;quot;${1:-127.0.0.1:8080}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
declare -A IN_UP IN_DOWN IN_TOTAL&lt;br /&gt;
declare -A U_UP U_DOWN U_TOTAL&lt;br /&gt;
declare -A USERSET&lt;br /&gt;
&lt;br /&gt;
bytes_to_gb() {&lt;br /&gt;
  local b=&amp;quot;${1-}&amp;quot;&lt;br /&gt;
  if [[ -z &amp;quot;${b}&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;null&amp;quot;&lt;br /&gt;
    return 0&lt;br /&gt;
  fi&lt;br /&gt;
  awk -v b=&amp;quot;${b}&amp;quot; &#039;BEGIN{printf &amp;quot;%.3f&amp;quot;, b/1024/1024/1024}&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
normalize_stats_objects() {&lt;br /&gt;
  tr -d &#039;\n\r\t &#039; \&lt;br /&gt;
  | grep -oE &#039;\{&amp;quot;name&amp;quot;:&amp;quot;[^&amp;quot;]+&amp;quot;,&amp;quot;value&amp;quot;:[0-9]+\}&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extract_field() {&lt;br /&gt;
  local obj=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local key=&amp;quot;$2&amp;quot;&lt;br /&gt;
  echo &amp;quot;$obj&amp;quot; | sed -nE &amp;quot;s/.*\&amp;quot;${key}\&amp;quot;:\&amp;quot;?([^\&amp;quot;,}]*)\&amp;quot;?.*/\1/p&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
accumulate_stats() {&lt;br /&gt;
  local stats_json=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local line name value kind tag dir email&lt;br /&gt;
&lt;br /&gt;
  while IFS= read -r line; do&lt;br /&gt;
    [[ -z &amp;quot;$line&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    name=&amp;quot;$(extract_field &amp;quot;$line&amp;quot; &amp;quot;name&amp;quot;)&amp;quot;&lt;br /&gt;
    [[ -z &amp;quot;$name&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    value=&amp;quot;$(echo &amp;quot;$line&amp;quot; | sed -nE &#039;s/.*&amp;quot;value&amp;quot;:([0-9]+).*/\1/p&#039;)&amp;quot;&lt;br /&gt;
    value=&amp;quot;${value:-0}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    kind=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $1}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$kind&amp;quot; == &amp;quot;inbound&amp;quot; ]]; then&lt;br /&gt;
      tag=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $2}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $4}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        IN_UP[&amp;quot;$tag&amp;quot;]=$(( ${IN_UP[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        IN_DOWN[&amp;quot;$tag&amp;quot;]=$(( ${IN_DOWN[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      IN_TOTAL[&amp;quot;$tag&amp;quot;]=$(( ${IN_TOTAL[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
&lt;br /&gt;
    elif [[ &amp;quot;$kind&amp;quot; == &amp;quot;user&amp;quot; ]]; then&lt;br /&gt;
      email=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $2}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $4}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      USERSET[&amp;quot;$email&amp;quot;]=1&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        U_UP[&amp;quot;$email&amp;quot;]=$(( ${U_UP[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        U_DOWN[&amp;quot;$email&amp;quot;]=$(( ${U_DOWN[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      U_TOTAL[&amp;quot;$email&amp;quot;]=$(( ${U_TOTAL[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt; &amp;lt;(echo &amp;quot;$stats_json&amp;quot; | normalize_stats_objects)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
query_online_ips() {&lt;br /&gt;
  local email=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local out pairs status&lt;br /&gt;
&lt;br /&gt;
  out=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsonlineiplist -s=&amp;quot;$SERVER&amp;quot; -email &amp;quot;$email&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  pairs=&amp;quot;$(echo &amp;quot;$out&amp;quot; | tr -d &#039;\n\r\t &#039; \&lt;br /&gt;
  | grep -oE &#039;&amp;quot;([0-9]{1,3}\.){3}[0-9]{1,3}&amp;quot;:[0-9]+&#039; \&lt;br /&gt;
  | sed -E &#039;s/&amp;quot;//g&#039; \&lt;br /&gt;
  | awk -F: &#039;{&lt;br /&gt;
      ip=$1&lt;br /&gt;
      ts=$2&lt;br /&gt;
      cmd=&amp;quot;TZ=Asia/Shanghai date -d @&amp;quot;ts&amp;quot; \&amp;quot;+%Y-%m-%d %H:%M:%S\&amp;quot;&amp;quot;&lt;br /&gt;
      cmd | getline t&lt;br /&gt;
      close(cmd)&lt;br /&gt;
      printf &amp;quot;%s(%s) &amp;quot;, ip, t&lt;br /&gt;
    }&#039; \&lt;br /&gt;
  | sed -E &#039;s/[[:space:]]+$//&#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -n &amp;quot;$pairs&amp;quot; ]]; then&lt;br /&gt;
    status=&amp;quot;ONLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;$status&amp;quot;&lt;br /&gt;
    echo &amp;quot;$pairs&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;OFFLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;-&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  local stats_json&lt;br /&gt;
  stats_json=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsquery --server=&amp;quot;$SERVER&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
  #echo &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -z &amp;quot;$stats_json&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
    echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  accumulate_stats &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
  echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for tag in &amp;quot;${!IN_TOTAL[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$tag&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r tag; do&lt;br /&gt;
    local up down total up_s down_s total_s&lt;br /&gt;
&lt;br /&gt;
    if [[ -v IN_UP[&amp;quot;$tag&amp;quot;] ]]; then up=&amp;quot;${IN_UP[&amp;quot;$tag&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_DOWN[&amp;quot;$tag&amp;quot;] ]]; then down=&amp;quot;${IN_DOWN[&amp;quot;$tag&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_TOTAL[&amp;quot;$tag&amp;quot;] ]]; then total=&amp;quot;${IN_TOTAL[&amp;quot;$tag&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;$tag&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for email in &amp;quot;${!USERSET[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$email&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r email; do&lt;br /&gt;
    local up down total up_s down_s total_s status ips&lt;br /&gt;
    local qout&lt;br /&gt;
&lt;br /&gt;
    if [[ -v U_UP[&amp;quot;$email&amp;quot;] ]]; then up=&amp;quot;${U_UP[&amp;quot;$email&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_DOWN[&amp;quot;$email&amp;quot;] ]]; then down=&amp;quot;${U_DOWN[&amp;quot;$email&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_TOTAL[&amp;quot;$email&amp;quot;] ]]; then total=&amp;quot;${U_TOTAL[&amp;quot;$email&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    qout=&amp;quot;$(query_online_ips &amp;quot;$email&amp;quot;)&amp;quot;&lt;br /&gt;
    status=&amp;quot;$(sed -n &#039;1p&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
    ips=&amp;quot;$(sed -n &#039;2p&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; \&lt;br /&gt;
      &amp;quot;$email&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot; &amp;quot;$status&amp;quot; &amp;quot;$ips&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;推荐配置定时任务:&#039;&#039;&#039;&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
TZ=Asia/Shanghai&lt;br /&gt;
# 每月8号早上7点重置统计信息&lt;br /&gt;
0 7 8 * * /usr/local/bin/xray api statsquery -s=127.0.0.1:8080 -reset=true &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
# 每天早上7点重启日志记录器&lt;br /&gt;
0 7 * * * /usr/local/bin/xray api restartlogger -s=127.0.0.1:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1424</id>
		<title>查看Xray中各用户流量使用情况的脚本</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC&amp;diff=1424"/>
		<updated>2026-02-18T15:18:33Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“== 预览 == ----1104x1104px ----  == 要求 == Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt;  &amp;#039;&amp;#039;&amp;#039;配置参考:&amp;#039;&amp;#039;&amp;#039; &amp;lt;syntaxhi…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 预览 ==&lt;br /&gt;
----[[File:查看Xray中各用户流量使用情况的脚本-预览1.png|alt=|frameless|1104x1104px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 要求 ==&lt;br /&gt;
Xray中需要配置, 分别开启 [https://xtls.github.io/config/stats.html 统计] / [https://xtls.github.io/config/api.html API] / [https://xtls.github.io/config/policy.html 本地策略], 且[https://xtls.github.io/config/inbounds/vless.html 用户]设置了&amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;与&amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;配置参考:&#039;&#039;&#039; &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;stats&amp;quot;: {},&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;api&amp;quot;: {&lt;br /&gt;
    &amp;quot;tag&amp;quot;: &amp;quot;API&amp;quot;,&lt;br /&gt;
    &amp;quot;listen&amp;quot;: &amp;quot;127.0.0.1:8080&amp;quot;,&lt;br /&gt;
    &amp;quot;services&amp;quot;: [&lt;br /&gt;
      &amp;quot;LoggerService&amp;quot;,&lt;br /&gt;
      &amp;quot;StatsService&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;policy&amp;quot;: {&lt;br /&gt;
    &amp;quot;levels&amp;quot;: {&lt;br /&gt;
      &amp;quot;0&amp;quot;: {&lt;br /&gt;
        &amp;quot;handshake&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;connIdle&amp;quot;: 600,&lt;br /&gt;
        &amp;quot;statsUserUplink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserDownlink&amp;quot;: true,&lt;br /&gt;
        &amp;quot;statsUserOnline&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;system&amp;quot;: {&lt;br /&gt;
      &amp;quot;statsInboundUplink&amp;quot;: true,&lt;br /&gt;
      &amp;quot;statsInboundDownlink&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;用户配置参考:&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;UserId123456&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;易于标识的名称&amp;quot;,&lt;br /&gt;
    &amp;quot;level&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 内容 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
XRAY_BIN=&amp;quot;${XRAY_BIN:-xray}&amp;quot;&lt;br /&gt;
# 自行修改 Xray API 地址&lt;br /&gt;
SERVER=&amp;quot;${1:-127.0.0.1:8080}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
declare -A IN_UP IN_DOWN IN_TOTAL&lt;br /&gt;
declare -A U_UP U_DOWN U_TOTAL&lt;br /&gt;
declare -A USERSET&lt;br /&gt;
&lt;br /&gt;
bytes_to_gb() {&lt;br /&gt;
  local b=&amp;quot;${1-}&amp;quot;&lt;br /&gt;
  if [[ -z &amp;quot;${b}&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;null&amp;quot;&lt;br /&gt;
    return 0&lt;br /&gt;
  fi&lt;br /&gt;
  awk -v b=&amp;quot;${b}&amp;quot; &#039;BEGIN{printf &amp;quot;%.3f&amp;quot;, b/1024/1024/1024}&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
normalize_stats_objects() {&lt;br /&gt;
  tr -d &#039;\n\r\t &#039; \&lt;br /&gt;
  | grep -oE &#039;\{&amp;quot;name&amp;quot;:&amp;quot;[^&amp;quot;]+&amp;quot;,&amp;quot;value&amp;quot;:[0-9]+\}&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extract_field() {&lt;br /&gt;
  local obj=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local key=&amp;quot;$2&amp;quot;&lt;br /&gt;
  echo &amp;quot;$obj&amp;quot; | sed -nE &amp;quot;s/.*\&amp;quot;${key}\&amp;quot;:\&amp;quot;?([^\&amp;quot;,}]*)\&amp;quot;?.*/\1/p&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
accumulate_stats() {&lt;br /&gt;
  local stats_json=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local line name value kind tag dir email&lt;br /&gt;
&lt;br /&gt;
  while IFS= read -r line; do&lt;br /&gt;
    [[ -z &amp;quot;$line&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    name=&amp;quot;$(extract_field &amp;quot;$line&amp;quot; &amp;quot;name&amp;quot;)&amp;quot;&lt;br /&gt;
    [[ -z &amp;quot;$name&amp;quot; ]] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    value=&amp;quot;$(echo &amp;quot;$line&amp;quot; | sed -nE &#039;s/.*&amp;quot;value&amp;quot;:([0-9]+).*/\1/p&#039;)&amp;quot;&lt;br /&gt;
    value=&amp;quot;${value:-0}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    kind=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $1}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$kind&amp;quot; == &amp;quot;inbound&amp;quot; ]]; then&lt;br /&gt;
      tag=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $2}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $4}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        IN_UP[&amp;quot;$tag&amp;quot;]=$(( ${IN_UP[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        IN_DOWN[&amp;quot;$tag&amp;quot;]=$(( ${IN_DOWN[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      IN_TOTAL[&amp;quot;$tag&amp;quot;]=$(( ${IN_TOTAL[&amp;quot;$tag&amp;quot;]:-0} + value ))&lt;br /&gt;
&lt;br /&gt;
    elif [[ &amp;quot;$kind&amp;quot; == &amp;quot;user&amp;quot; ]]; then&lt;br /&gt;
      email=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $2}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
      dir=&amp;quot;$(awk -F&#039;&amp;gt;&amp;gt;&amp;gt;&#039; &#039;{print $4}&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$name&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      USERSET[&amp;quot;$email&amp;quot;]=1&lt;br /&gt;
&lt;br /&gt;
      if [[ &amp;quot;$dir&amp;quot; == &amp;quot;uplink&amp;quot; ]]; then&lt;br /&gt;
        U_UP[&amp;quot;$email&amp;quot;]=$(( ${U_UP[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      elif [[ &amp;quot;$dir&amp;quot; == &amp;quot;downlink&amp;quot; ]]; then&lt;br /&gt;
        U_DOWN[&amp;quot;$email&amp;quot;]=$(( ${U_DOWN[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
      fi&lt;br /&gt;
      U_TOTAL[&amp;quot;$email&amp;quot;]=$(( ${U_TOTAL[&amp;quot;$email&amp;quot;]:-0} + value ))&lt;br /&gt;
    fi&lt;br /&gt;
  done &amp;lt; &amp;lt;(echo &amp;quot;$stats_json&amp;quot; | normalize_stats_objects)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
query_online_ips() {&lt;br /&gt;
  local email=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local out pairs status&lt;br /&gt;
&lt;br /&gt;
  out=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsonlineiplist -s=&amp;quot;$SERVER&amp;quot; -email &amp;quot;$email&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  pairs=&amp;quot;$(echo &amp;quot;$out&amp;quot; | tr -d &#039;\n\r\t &#039; \&lt;br /&gt;
  | grep -oE &#039;&amp;quot;([0-9]{1,3}\.){3}[0-9]{1,3}&amp;quot;:[0-9]+&#039; \&lt;br /&gt;
  | sed -E &#039;s/&amp;quot;//g&#039; \&lt;br /&gt;
  | awk -F: &#039;{&lt;br /&gt;
      ip=$1&lt;br /&gt;
      ts=$2&lt;br /&gt;
      cmd=&amp;quot;TZ=Asia/Shanghai date -d @&amp;quot;ts&amp;quot; \&amp;quot;+%Y-%m-%d %H:%M:%S\&amp;quot;&amp;quot;&lt;br /&gt;
      cmd | getline t&lt;br /&gt;
      close(cmd)&lt;br /&gt;
      printf &amp;quot;%s(%s) &amp;quot;, ip, t&lt;br /&gt;
    }&#039; \&lt;br /&gt;
  | sed -E &#039;s/[[:space:]]+$//&#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -n &amp;quot;$pairs&amp;quot; ]]; then&lt;br /&gt;
    status=&amp;quot;ONLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;$status&amp;quot;&lt;br /&gt;
    echo &amp;quot;$pairs&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;OFFLINE&amp;quot;&lt;br /&gt;
    echo &amp;quot;-&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  local stats_json&lt;br /&gt;
  stats_json=&amp;quot;$(&amp;quot;$XRAY_BIN&amp;quot; api statsquery --server=&amp;quot;$SERVER&amp;quot; 2&amp;gt;/dev/null || true)&amp;quot;&lt;br /&gt;
  #echo &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ -z &amp;quot;$stats_json&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
    echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  accumulate_stats &amp;quot;$stats_json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Server: $SERVER&amp;quot;&lt;br /&gt;
  echo &amp;quot;Unit: GB, bytes divided by 1024^3&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Inbound traffic&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;tag&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for tag in &amp;quot;${!IN_TOTAL[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$tag&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r tag; do&lt;br /&gt;
    local up down total up_s down_s total_s&lt;br /&gt;
&lt;br /&gt;
    if [[ -v IN_UP[&amp;quot;$tag&amp;quot;] ]]; then up=&amp;quot;${IN_UP[&amp;quot;$tag&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_DOWN[&amp;quot;$tag&amp;quot;] ]]; then down=&amp;quot;${IN_DOWN[&amp;quot;$tag&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v IN_TOTAL[&amp;quot;$tag&amp;quot;] ]]; then total=&amp;quot;${IN_TOTAL[&amp;quot;$tag&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-22s %14s %14s %14s\n&amp;quot; &amp;quot;$tag&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;User traffic and online status&amp;quot;&lt;br /&gt;
  printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; &amp;quot;email&amp;quot; &amp;quot;uplink_GB&amp;quot; &amp;quot;downlink_GB&amp;quot; &amp;quot;total_GB&amp;quot; &amp;quot;status&amp;quot; &amp;quot;ips&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    for email in &amp;quot;${!USERSET[@]}&amp;quot;; do&lt;br /&gt;
      echo &amp;quot;$email&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
  } | sort | while IFS= read -r email; do&lt;br /&gt;
    local up down total up_s down_s total_s status ips&lt;br /&gt;
    local qout&lt;br /&gt;
&lt;br /&gt;
    if [[ -v U_UP[&amp;quot;$email&amp;quot;] ]]; then up=&amp;quot;${U_UP[&amp;quot;$email&amp;quot;]}&amp;quot;; else up=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_DOWN[&amp;quot;$email&amp;quot;] ]]; then down=&amp;quot;${U_DOWN[&amp;quot;$email&amp;quot;]}&amp;quot;; else down=&amp;quot;&amp;quot;; fi&lt;br /&gt;
    if [[ -v U_TOTAL[&amp;quot;$email&amp;quot;] ]]; then total=&amp;quot;${U_TOTAL[&amp;quot;$email&amp;quot;]}&amp;quot;; else total=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
    up_s=&amp;quot;$(bytes_to_gb &amp;quot;$up&amp;quot;)&amp;quot;&lt;br /&gt;
    down_s=&amp;quot;$(bytes_to_gb &amp;quot;$down&amp;quot;)&amp;quot;&lt;br /&gt;
    total_s=&amp;quot;$(bytes_to_gb &amp;quot;$total&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    qout=&amp;quot;$(query_online_ips &amp;quot;$email&amp;quot;)&amp;quot;&lt;br /&gt;
    status=&amp;quot;$(sed -n &#039;1p&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
    ips=&amp;quot;$(sed -n &#039;2p&#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$qout&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;%-24s %14s %14s %14s %8s %s\n&amp;quot; \&lt;br /&gt;
      &amp;quot;$email&amp;quot; &amp;quot;$up_s&amp;quot; &amp;quot;$down_s&amp;quot; &amp;quot;$total_s&amp;quot; &amp;quot;$status&amp;quot; &amp;quot;$ips&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=File:%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC-%E9%A2%84%E8%A7%881.png&amp;diff=1421</id>
		<title>File:查看Xray中各用户流量使用情况的脚本-预览1.png</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=File:%E6%9F%A5%E7%9C%8BXray%E4%B8%AD%E5%90%84%E7%94%A8%E6%88%B7%E6%B5%81%E9%87%8F%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E7%9A%84%E8%84%9A%E6%9C%AC-%E9%A2%84%E8%A7%881.png&amp;diff=1421"/>
		<updated>2026-02-18T14:56:42Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1418</id>
		<title>使用nftables预防被端口扫描</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1418"/>
		<updated>2026-02-18T13:18:21Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​/* 3. 配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦. &lt;br /&gt;
&lt;br /&gt;
这时候, 我们就可以用 &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt; 自动拉黑那些尝试扫描端口的陌生IP. &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 2. 基础策略 ===&lt;br /&gt;
如果你之前配置过nftables, 那就在原有基础上进行新增或合并&lt;br /&gt;
&lt;br /&gt;
现在假设我不希望ssh端口被扫中, 默认的22端口肯定不得使用, 需要将ssh端口开放到一个&#039;&#039;&#039;没有任何协议所使用的的默认端口上&#039;&#039;&#039; (比如ssh开放到80端口)&lt;br /&gt;
&lt;br /&gt;
一般的陌生IP暴力破解一个端口, 需要先进行网络嗅探, 陌生IP可以自行扫描获取端口协议, 也可以使用其他平台公示的端口, 端口扫描器肯定优先扫描一些协议的默认端口, 绝对不能使用这些&lt;br /&gt;
&lt;br /&gt;
端口扫描器扫完常见协议的端口, 之后大部分只会按照端口顺序进行扫描, 但这样基本上是不可能扫中的, 只有随机顺序扫描才有可能扫中&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置 ===&lt;br /&gt;
这里以ssh开放在46端口为例&lt;br /&gt;
&lt;br /&gt;
我们可以分成两种方式: &lt;br /&gt;
&lt;br /&gt;
* 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        # 封禁时间&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行本地/已建立/相关的连接&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行后不会往后执行&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        # 自行配置陷阱端口&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口)&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;0&amp;quot;&amp;gt;table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
根据自己的喜好进行调整后保存, 重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;查看封禁了哪些IP&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft list set inet prevent_scanning tmp_blacklist_ipv4&lt;br /&gt;
nft list set inet prevent_scanning tmp_blacklist_ipv6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1417</id>
		<title>使用nftables预防被端口扫描</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1417"/>
		<updated>2026-02-18T13:13:58Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦. &lt;br /&gt;
&lt;br /&gt;
这时候, 我们就可以用 &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt; 自动拉黑那些尝试扫描端口的陌生IP. &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 2. 基础策略 ===&lt;br /&gt;
如果你之前配置过nftables, 那就在原有基础上进行新增或合并&lt;br /&gt;
&lt;br /&gt;
现在假设我不希望ssh端口被扫中, 默认的22端口肯定不得使用, 需要将ssh端口开放到一个&#039;&#039;&#039;没有任何协议所使用的的默认端口上&#039;&#039;&#039; (比如ssh开放到80端口)&lt;br /&gt;
&lt;br /&gt;
一般的陌生IP暴力破解一个端口, 需要先进行网络嗅探, 陌生IP可以自行扫描获取端口协议, 也可以使用其他平台公示的端口, 端口扫描器肯定优先扫描一些协议的默认端口, 绝对不能使用这些&lt;br /&gt;
&lt;br /&gt;
端口扫描器扫完常见协议的端口, 之后大部分只会按照端口顺序进行扫描, 但这样基本上是不可能扫中的, 只有随机顺序扫描才有可能扫中&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置 ===&lt;br /&gt;
这里以ssh开放在46端口为例&lt;br /&gt;
&lt;br /&gt;
我们可以分成两种方式: &lt;br /&gt;
&lt;br /&gt;
* 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        # 封禁时间&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行后不会往后执行&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        # 自行配置陷阱端口&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口)&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;0&amp;quot;&amp;gt;table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. 完成配置 ===&lt;br /&gt;
根据自己的喜好进行调整后保存, 重启&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
systemctl restart nftables.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;查看封禁了哪些IP&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft list set inet prevent_scanning tmp_blacklist_ipv4&lt;br /&gt;
nft list set inet prevent_scanning tmp_blacklist_ipv6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1416</id>
		<title>使用nftables预防被端口扫描</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8nftables%E9%A2%84%E9%98%B2%E8%A2%AB%E7%AB%AF%E5%8F%A3%E6%89%AB%E6%8F%8F&amp;diff=1416"/>
		<updated>2026-02-18T13:05:07Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​创建页面，内容为“我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦.   这时候, 我们就可以用 &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt; 自动拉黑那些尝试扫描端口的陌生IP.  ----  === 1. 准备 === 确保…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦. &lt;br /&gt;
&lt;br /&gt;
这时候, 我们就可以用 &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt; 自动拉黑那些尝试扫描端口的陌生IP. &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 1. 准备 ===&lt;br /&gt;
确保 nftables 已经安装&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
nft --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;若没有安装, 以Debian13为例&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt install nftables&lt;br /&gt;
systemctl enable nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;拷贝原有的nftables配置, 到一个好找的目录里, 以 &amp;lt;code&amp;gt;/main/nftables&amp;lt;/code&amp;gt; 为例, 再对原路径进行链接&amp;lt;syntaxhighlight&amp;gt;cp /etc/nftables.conf /main/nftables/&lt;br /&gt;
ln -f /main/nftables/nftables.conf /etc/nftables.conf&amp;lt;/syntaxhighlight&amp;gt;并准备好编辑 &amp;lt;code&amp;gt;/main/nftables/nftables.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 2. 基础策略 ===&lt;br /&gt;
如果你之前配置过nftables, 那就在原有基础上进行新增或合并&lt;br /&gt;
&lt;br /&gt;
现在假设我不希望ssh端口被扫中, 默认的22端口肯定不得使用, 需要将ssh端口开放到一个&#039;&#039;&#039;没有任何协议所使用的的默认端口上&#039;&#039;&#039; (比如ssh开放到80端口)&lt;br /&gt;
&lt;br /&gt;
一般的陌生IP暴力破解一个端口, 需要先进行网络嗅探, 陌生IP可以自行扫描获取端口协议, 也可以使用其他平台公示的端口, 端口扫描器肯定优先扫描一些协议的默认端口, 绝对不能使用这些&lt;br /&gt;
&lt;br /&gt;
端口扫描器扫完常见协议的端口, 之后大部分只会按照端口顺序进行扫描, 但这样基本上是不可能扫中的, 只有随机顺序扫描才有可能扫中&lt;br /&gt;
&lt;br /&gt;
=== 3. 配置 ===&lt;br /&gt;
这里以ssh开放在46端口为例&lt;br /&gt;
&lt;br /&gt;
我们可以分成两种方式: &lt;br /&gt;
&lt;br /&gt;
* 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        # 封禁时间&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        # 放行后不会往后执行&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        # 自行配置陷阱端口&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口)&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;0&amp;quot;&amp;gt;table inet prevent_scanning {&lt;br /&gt;
    set tmp_blacklist_ipv4 {&lt;br /&gt;
        type ipv4_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 30m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    set tmp_blacklist_ipv6 {&lt;br /&gt;
        type ipv6_addr&lt;br /&gt;
        flags timeout&lt;br /&gt;
        timeout 20m&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        policy drop;&lt;br /&gt;
&lt;br /&gt;
        iif lo accept;&lt;br /&gt;
        ct state established,related        accept;&lt;br /&gt;
&lt;br /&gt;
        # 不希望被ping到可以注释掉&lt;br /&gt;
        ip protocol icmp                    accept;&lt;br /&gt;
        ip6 nexthdr ipv6-icmp               accept;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        ip saddr @tmp_blacklist_ipv4        drop;&lt;br /&gt;
        ip6 saddr @tmp_blacklist_ipv6       drop;&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 46 }    ct state new    accept;&lt;br /&gt;
        &lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;&lt;br /&gt;
        ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=User:Koud_Wind&amp;diff=1391</id>
		<title>User:Koud Wind</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=User:Koud_Wind&amp;diff=1391"/>
		<updated>2026-02-13T05:55:36Z</updated>

		<summary type="html">&lt;p&gt;Koud Wind：​清空全部内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Koud Wind</name></author>
	</entry>
</feed>