# IP 偽裝代理
本文將講述如何配置和啟用 ip-masq-agent。
## 創建 ip-masq-agent
要創建 ip-masq-agent,運行下面的 kubectl 命令:
```bash
kubectl create -f https://raw.githubusercontent.com/kubernetes-incubator/ip-masq-agent/master/ip-masq-agent.yaml
```
關于 ip-masq-agent 的更多信息請參考 [該文檔](https://github.com/kubernetes-incubator/ip-masq-agent)。
在大多數情況下,默認的一套規則應該是足夠的;但是,如果內置的規則不適用于您的集群,您可以創建并應用 ConfigMap 來自定義受影響的 IP 范圍。例如,為了僅允許 ip-masq-agent 考慮 10.0.0.0/8,您可以在名為 “config” 的文件中創建以下 ConfigMap。
```yaml
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
```
**注意**:重要的是,該文件被命名為 config,因為默認情況下,該文件將被用作 ip-masq-agent 查找的關鍵字。
運行下列命令將 ConfigMap 添加到您的集群中:
```bash
kubectl create configmap ip-masq-agent --from-file=config --namespace=kube-system
```
這將會更新 */etc/config/ip-masq-agent* 文件,并每隔 *resyscInterval* 時間段檢查一遍該文件,將配置應用到集群的節點中。
```http
iptables -t nat -L IP-MASQ-AGENT
Chain IP-MASQ-AGENT (1 references)
target prot opt source destination
RETURN all -- anywhere 169.254.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: cluster-local
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
```
默認情況下,本地鏈路范圍(169.254.0.0/16)也由 ip-masq 代理處理,該代理設置相應的 iptables 規則。想要讓 ip-masq-agent 忽略本地鏈路,您可以在 ConfigMap 中將 masqLinkLocal 設置為 true。
```yaml
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true
```
## IP 偽裝代理用戶指南
ip-masq-agent 用戶配置 iptables 規則將 Pod 的 IP 地址隱藏在集群 node 節點的 IP 地址后面。這通常在將流量發送到群集的 pod [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) 范圍之外的目的地時執行。
## 關鍵術語
- **NAT(網絡地址轉換)**
是一種通過修改 IP 頭中的源和/或目標地址信息來將一個 IP 地址重映射到另一個 IP 地址的方法。通常由執行 IP 路由的設備完成。
- **Masquerading(偽裝)**
NAT 的一種形式,通常用于執行多個地址轉換,其中多個源 IP 地址被掩蓋在單個地址之后,通常是由某設備進行 IP 路由。在 kubernetes 中,這是 Node 的 IP 地址。
- **CIDR(無類域內路由選擇)**
基于可變長度子網掩碼,允許指定任意長度的前綴。CIDR 引入了一種新的 IP 地址表示方法,現在通常被稱為 **CIDR 表示法**,將地址或路由前綴的比特位數作為后綴,例如 192.168.2.0/24。
- **本地鏈路**
本地鏈路地址是僅能在主機連接的網段或廣播域內進行有效通信的網絡地址。IPv4 的鏈路本地地址在 CIDR 表示法定義的地址塊是 169.254.0.0/16。
Ip-masq-agent 在將流量發送到集群 node 節點的 IP 和 Cluster IP 范圍之外的目的地時,會配置 iptables 規則來處理偽裝的 node/pod IP 地址。這基本上將 pod 的 IP 地址隱藏在了集群 node 節點的 IP 地址后面。在某些環境中,到 “外部” 地址的流量必須來自已知的機器地址。例如,在 Google Cloud 中,到互聯網的任何流量必須來自虛擬機的 IP。當使用容器時,如在GKE中,Pod IP 將被拒絕作為出口。為了避免這種情況,我們必須將 Pod IP 隱藏在 VM 自己的 IP 地址之后——通常被稱為 “偽裝”。默認情況下,配置代理將 [RFC 1918](https://tools.ietf.org/html/rfc1918)指定的三個專用 IP 范圍視為非偽裝 [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)。范圍包括 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。默認情況下,代理還將本地鏈路(169.254.0.0/16)視為非偽裝 CIDR。代理配置為每隔60秒從 */etc/config/ip-masq-agent* 位置重新加載其配置,這也是可配置的。

代理的配置文件必須使用 yaml 或 json 語法,并且包含以下三個可選的 key:
- **nonMasqueradeCIDRs**:使用 [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) 表示法指定的非偽裝范圍的字符串列表。
- **masqLinkLocal**:一個布爾值(true/false),表示是否將流量偽裝成本地鏈路前綴 169.254.0.0/16。默認為false。
- **resyncInterval**:代理嘗試從磁盤重新加載配置的時間間隔。例如 ’30s’ 其中 ‘s’ 是秒,’ms’ 是毫秒等…
到 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 范圍的流量將不會被偽裝。任何其他流量(假定是互聯網)將被偽裝。這里有個例子,來自 pod 的本地目的地址可以是其節點的 IP 地址、其他節點的地址或 Cluster IP 范圍中的一個 IP 地址。其他任何流量都將默認偽裝。以下條目顯示 ip-masq-agent 應用的默認規則集:
```http
iptables -t nat -L IP-MASQ-AGENT
RETURN all -- anywhere 169.254.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 172.16.0.0/12 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 192.168.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
```
默認情況下,在 GCE/GKE 中將啟動 kubernetes 1.7.0 版本,ip-masq-agent 已經在集群中運行。如果您在其他環境中運行 kubernetes,那么您可以將 ip-masq-agent 以 [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) 的方式在集群中運行。
原文地址:https://k8smeetup.github.io/docs/tasks/administer-cluster/ip-masq-agent/
譯者:[rootsongjc](https://github.com/rootsongjc)
- 序言
- 云原生
- 云原生(Cloud Native)的定義
- CNCF - 云原生計算基金會簡介
- CNCF章程
- 云原生的設計哲學
- Play with Kubernetes
- 快速部署一個云原生本地實驗環境
- Kubernetes與云原生應用概覽
- 云原生應用之路——從Kubernetes到Cloud Native
- 云原生編程語言
- 云原生編程語言Ballerina
- 云原生編程語言Pulumi
- 云原生的未來
- Kubernetes架構
- 設計理念
- Etcd解析
- 開放接口
- CRI - Container Runtime Interface(容器運行時接口)
- CNI - Container Network Interface(容器網絡接口)
- CSI - Container Storage Interface(容器存儲接口)
- Kubernetes中的網絡
- Kubernetes中的網絡解析——以flannel為例
- Kubernetes中的網絡解析——以calico為例
- 具備API感知的網絡和安全性管理開源軟件Cilium
- Cilium架構設計與概念解析
- 資源對象與基本概念解析
- Pod狀態與生命周期管理
- Pod概覽
- Pod解析
- Init容器
- Pause容器
- Pod安全策略
- Pod的生命周期
- Pod Hook
- Pod Preset
- Pod中斷與PDB(Pod中斷預算)
- 集群資源管理
- Node
- Namespace
- Label
- Annotation
- Taint和Toleration(污點和容忍)
- 垃圾收集
- 控制器
- Deployment
- StatefulSet
- DaemonSet
- ReplicationController和ReplicaSet
- Job
- CronJob
- Horizontal Pod Autoscaling
- 自定義指標HPA
- 準入控制器(Admission Controller)
- 服務發現
- Service
- Ingress
- Traefik Ingress Controller
- 身份與權限控制
- ServiceAccount
- RBAC——基于角色的訪問控制
- NetworkPolicy
- 存儲
- Secret
- ConfigMap
- ConfigMap的熱更新
- Volume
- Persistent Volume(持久化卷)
- Storage Class
- 本地持久化存儲
- 集群擴展
- 使用自定義資源擴展API
- 使用CRD擴展Kubernetes API
- Aggregated API Server
- APIService
- Service Catalog
- 資源調度
- QoS(服務質量等級)
- 用戶指南
- 資源對象配置
- 配置Pod的liveness和readiness探針
- 配置Pod的Service Account
- Secret配置
- 管理namespace中的資源配額
- 命令使用
- Docker用戶過度到kubectl命令行指南
- kubectl命令概覽
- kubectl命令技巧大全
- 使用etcdctl訪問kubernetes數據
- 集群安全性管理
- 管理集群中的TLS
- kubelet的認證授權
- TLS bootstrap
- 創建用戶認證授權的kubeconfig文件
- IP偽裝代理
- 使用kubeconfig或token進行用戶身份認證
- Kubernetes中的用戶與身份認證授權
- Kubernetes集群安全性配置最佳實踐
- 訪問Kubernetes集群
- 訪問集群
- 使用kubeconfig文件配置跨集群認證
- 通過端口轉發訪問集群中的應用程序
- 使用service訪問群集中的應用程序
- 從外部訪問Kubernetes中的Pod
- Cabin - Kubernetes手機客戶端
- Kubernetic - Kubernetes桌面客戶端
- Kubernator - 更底層的Kubernetes UI
- 在Kubernetes中開發部署應用
- 適用于kubernetes的應用開發部署流程
- 遷移傳統應用到Kubernetes中——以Hadoop YARN為例
- 最佳實踐概覽
- 在CentOS上部署Kubernetes集群
- 創建TLS證書和秘鑰
- 創建kubeconfig文件
- 創建高可用etcd集群
- 安裝kubectl命令行工具
- 部署master節點
- 安裝flannel網絡插件
- 部署node節點
- 安裝kubedns插件
- 安裝dashboard插件
- 安裝heapster插件
- 安裝EFK插件
- 生產級的Kubernetes簡化管理工具kubeadm
- 使用kubeadm在Ubuntu Server 16.04上快速構建測試集群
- 服務發現與負載均衡
- 安裝Traefik ingress
- 分布式負載測試
- 網絡和集群性能測試
- 邊緣節點配置
- 安裝Nginx ingress
- 安裝配置DNS
- 安裝配置Kube-dns
- 安裝配置CoreDNS
- 運維管理
- Master節點高可用
- 服務滾動升級
- 應用日志收集
- 配置最佳實踐
- 集群及應用監控
- 數據持久化問題
- 管理容器的計算資源
- 集群聯邦
- 存儲管理
- GlusterFS
- 使用GlusterFS做持久化存儲
- 使用Heketi作為Kubernetes的持久存儲GlusterFS的external provisioner
- 在OpenShift中使用GlusterFS做持久化存儲
- GlusterD-2.0
- Ceph
- 用Helm托管安裝Ceph集群并提供后端存儲
- 使用Ceph做持久化存儲
- 使用rbd-provisioner提供rbd持久化存儲
- OpenEBS
- 使用OpenEBS做持久化存儲
- Rook
- NFS
- 利用NFS動態提供Kubernetes后端存儲卷
- 集群與應用監控
- Heapster
- 使用Heapster獲取集群和對象的metric數據
- Prometheus
- 使用Prometheus監控kubernetes集群
- Prometheus查詢語言PromQL使用說明
- 使用Vistio監控Istio服務網格中的流量
- 分布式跟蹤
- OpenTracing
- 服務編排管理
- 使用Helm管理Kubernetes應用
- 構建私有Chart倉庫
- 持續集成與發布
- 使用Jenkins進行持續集成與發布
- 使用Drone進行持續集成與發布
- 更新與升級
- 手動升級Kubernetes集群
- 升級dashboard
- 領域應用概覽
- 微服務架構
- 微服務中的服務發現
- 使用Java構建微服務并發布到Kubernetes平臺
- Spring Boot快速開始指南
- Service Mesh 服務網格
- 企業級服務網格架構
- Service Mesh基礎
- Service Mesh技術對比
- 采納和演進
- 定制和集成
- 總結
- Istio
- 安裝并試用Istio service mesh
- 配置請求的路由規則
- 安裝和拓展Istio service mesh
- 集成虛擬機
- Istio中sidecar的注入規范及示例
- 如何參與Istio社區及注意事項
- Istio教程
- Istio免費學習資源匯總
- 深入理解Istio Service Mesh中的Envoy Sidecar注入與流量劫持
- 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由轉發
- Linkerd
- Linkerd 使用指南
- Conduit
- Condiut概覽
- 安裝Conduit
- Envoy
- Envoy的架構與基本術語
- Envoy作為前端代理
- Envoy mesh教程
- SOFAMesh
- SOFAMesh中的Dubbo on x-protocol
- SOFAMosn
- 使用 SOFAMosn 構建 SOFAMesh
- 大數據
- Spark standalone on Kubernetes
- 運行支持Kubernetes原生調度的Spark程序
- Serverless架構
- 理解Serverless
- FaaS-函數即服務
- OpenFaaS快速入門指南
- 邊緣計算
- 人工智能