diff --git a/codeblock/home-network/dnsmasq.conf b/codeblock/home-network/dnsmasq.conf new file mode 100644 index 0000000..68672aa --- /dev/null +++ b/codeblock/home-network/dnsmasq.conf @@ -0,0 +1,12 @@ +log-queries=extra +no-resolv +no-poll +server=61.139.2.69 +strict-order +log-dhcp +cache-size=2000 +dhcp-range=10.10.10.11,10.10.10.254,255.255.255.0,12h +dhcp-authoritative +dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases +dhcp-option=option:router,10.10.10.2 +dhcp-option=option:dns-server,61.139.2.69,218.6.200.139 \ No newline at end of file diff --git a/codeblock/home-network/dnsmasq.yaml b/codeblock/home-network/dnsmasq.yaml new file mode 100644 index 0000000..1ff14c8 --- /dev/null +++ b/codeblock/home-network/dnsmasq.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + app: dnsmasq + name: dnsmasq + namespace: default +spec: + selector: + matchLabels: + app: dnsmasq + template: + metadata: + labels: + app: dnsmasq + spec: + terminationGracePeriodSeconds: 3 + containers: + - image: 4km3/dnsmasq:2.85-r2 + imagePullPolicy: IfNotPresent + name: dnsmasq + securityContext: + privileged: true + args: + - '--log-facility=-' + volumeMounts: + - mountPath: /etc/dnsmasq.conf + name: dnsmasq-config + subPath: dnsmasq.conf + - mountPath: /var/lib/dnsmasq + name: lease + hostNetwork: true + restartPolicy: Always + volumes: + - configMap: + name: dnsmasq-config + name: dnsmasq-config + - name: lease + hostPath: + path: /data/lease + type: DirectoryOrCreate + updateStrategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate \ No newline at end of file diff --git a/content/cases/home-network/dnsmasq.md b/content/cases/home-network/dnsmasq.md new file mode 100644 index 0000000..e5a37e3 --- /dev/null +++ b/content/cases/home-network/dnsmasq.md @@ -0,0 +1,44 @@ +# DHCP 与 DNS 服务 + +DHCP 与 DNS 服务需在主路由上开启,如果用的主路由方案,可用云原生的方式部署一个 DHCP 和 DNS 服务,dnsmasq 是一个同时支持这两种功能的开源软件,我们可以用下面的方法部署。 + +## 目录结构 + +```txt +dnsmasq +├── config +│   └── dnsmasq.conf +├── daemonset.yaml +└── kustomization.yaml +``` + +## 准备 dnsmasq 配置 + + + +* `server` 指向上游的 DNS 地址,主路由在 PPPoE 拨号后会自动获取上游 dns 地址并写到 `/etc/resolv.conf`,可以复制过来。 +* `dhcp-range` 指定内网设备自动获取的 IP 地址范围以及子网掩码。 +* `dhcp-option=option:router` 指定内网设备的默认网关,即当前主路由的内网静态 IP 地址。 +* `dhcp-option=option:dns-server` 指定内网设备自动获取的 DNS 地址,通常写 dnsmasq 自身的地址,即主路由的内网静态 IP 地址,不过由于我用了透明代理,希望内网设备直接用 PPPoE 拨号获得的运营商的 DNS 地址。 + + +## 准备 daemonset.yaml + + + +## 准备 kustomization.yaml + +```yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - daemonset.yaml + +configMapGenerator: + - name: dnsmasq-config + files: + - config/dnsmasq.conf + +namespace: default +``` diff --git a/content/cases/home-network/prepare.md b/content/cases/home-network/prepare.md index 950d518..b7001f8 100644 --- a/content/cases/home-network/prepare.md +++ b/content/cases/home-network/prepare.md @@ -17,6 +17,21 @@ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIR ## 应用部署与配置维护方式 -所有应用使用 kubernetes 的 YAML 进行声明式部署,YAML 通过 kustomize 引用,应用的相关配置文件通过 kustomize 自动生成相关的 ConfigMap 或 Secret 挂载进去。 +使用 kubernetes 的 YAML 进行声明式部署,YAML 通过 kustomize 引用,应用的相关配置文件通过 kustomize 自动生成相关的 ConfigMap 或 Secret 挂载进去。如果应用使用 helm chart 渲染,在 kustomize 中也可以被引用。 -如果应用使用 helm chart 渲染,在 kustomize 中也可以被引用。 +每个应用使用一个目录来声明所有 yaml 和所需配置,在目录内执行以下命令安装到 k3s: + +```bash +kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . | kubectl apply -f -。 +``` + +如果要一键部署,在上层目录中再建一个 `kustomization.yaml` 引用所有应用的目录,然后在上层目录中执行上面相同的命令可以实现所有应用一键部署。 + +## YAML 声明方式 + +使用云原生的方式主要为了实现容器化、声明式管理的能力,不引入其它复杂的特性,所以考虑: + +* 使用 Daemonset 这种类型的工作负载进行部署,保证只有一个副本,滚动更新策略为先销毁旧的,再创建新的。 +* 使用 HostNetwork,不使用容器网络。 +* 使用特权容器,避免因权限导致的各种问题。 +* 如果数据需要持久化,挂载 hostPath。