[TOC]
# 小知識點
- proxy_arp: 原理就是當出現跨網段的ARP請求時,路由器將自己的MAC返回給發送ARP廣播請求發送者,實現MAC地址代理(善意的欺騙),最終使得主機能夠通信。 0為不開啟,1則開啟
> 開啟了proxy_arp(/proc/sys/net/ipv4/conf/[網卡名稱]/proxy_arp) 的情況下。如果請求中的ip地址不是本機網卡接口的地址,且有該地址的路由,則會以自己的mac地址進行回復;如果沒有該地址的路由,不回復。
- 確認容器與宿主機一對veth-pair
1. 登錄容器 `cat /sys/class/net/eth0/iflink` 查看另一個veth設備在宿主機哪個編號
2. 在宿主機 `ip r | grep [容器IP地址]`
- IPIP協議對應IP協議4
- tcpdump 抓包: `tcpdump 'ip proto 4'`
- Wireshark 過濾 `ip.proto == 4`
# 同節點通信
## 兩個pod背景信息
兩個pod分布情況
```shell
$ kubectl get pod -l app=fileserver -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fileserver-7cb9d7d4d-h99sp 1/1 Running 0 14m 172.26.40.147 192.168.32.127 <none> <none>
fileserver-7cb9d7d4d-mssdr 1/1 Running 0 14m 172.26.40.146 192.168.32.127 <none> <none>
```
`fileserver-7cb9d7d4d-mssdr` 容器的信息
```shell
# IP地址信息
$ kubectl exec -it fileserver-7cb9d7d4d-mssdr -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1480 qdisc noqueue state UP
link/ether 26:05:c7:19:a8:cf brd ff:ff:ff:ff:ff:ff
inet 172.26.40.146/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2405:c7ff:fe19:a8cf/64 scope link
valid_lft forever preferred_lft forever
# 路由信息
$ kubectl exec -it fileserver-7cb9d7d4d-mssdr -- ip r
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
# veth-pair對在宿主機網卡名稱
$ ip r | grep 172.26.40.146
172.26.40.146 dev calie64b9fa939d scope link
```
`fileserver-7cb9d7d4d-h99sp` 容器的信息
```shell
# IP地址信息
$ kubectl exec -it fileserver-7cb9d7d4d-h99sp -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1480 qdisc noqueue state UP
link/ether 7a:3a:28:54:4e:03 brd ff:ff:ff:ff:ff:ff
inet 172.26.40.147/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::783a:28ff:fe54:4e03/64 scope link
valid_lft forever preferred_lft forever
# 路由信息
$ kubectl exec -it fileserver-7cb9d7d4d-h99sp -- ip r
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
# veth-pair對在宿主機網卡名稱
$ ip r | grep 172.26.40.147
172.26.40.147 dev calic40aae79714 scope link
```
## IPIP
從 `fileserver-7cb9d7d4d-mssdr` 到 `fileserver-7cb9d7d4d-h99sp` 兩個pod在同節點上,數據包流程圖

抓包驗證
```shell
tcpdump -i calie64b9fa939d -penn
tcpdump -i calic40aae79714 -penn
```

## BGP
從 `fileserver-7cb9d7d4d-mssdr` 到 `fileserver-7cb9d7d4d-h99sp` 兩個pod在同節點上,數據包流程圖

抓包驗證
```shell
tcpdump -i calie64b9fa939d -penn
tcpdump -i calic40aae79714 -penn
```

> 三次握手詳細過程與IPIP是一致的,下面截圖就是抓包的數據。因為pod與宿主機在做IPIP協議的時候,已經arp表已經有緩存了。所以少一些arp廣報播文
# 跨節點通信
## 兩個pod背景信息
兩個pod分布情況
```shell
$ kubectl get pod -owide -l app=fileserver
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fileserver-595ccd77dd-hh8c7 1/1 Running 0 7s 172.26.40.161 192.168.32.127 <none> <none>
fileserver-595ccd77dd-k9bzv 1/1 Running 0 8s 172.26.122.151 192.168.32.128 <none> <none>
```
`fileserver-595ccd77dd-hh8c7` 容器的信息
```shell
# IP地址信息
$ kubectl exec -it fileserver-595ccd77dd-hh8c7 -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 82:de:a5:aa:e4:41 brd ff:ff:ff:ff:ff:ff
inet 172.26.40.161/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::80de:a5ff:feaa:e441/64 scope link
valid_lft forever preferred_lft forever
# 路由信息
$ kubectl exec -it fileserver-595ccd77dd-hh8c7 -- ip r
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
# veth-pair對在宿主機網卡名稱
$ ip r | grep 172.26.40.150
172.26.40.161 dev cali5e8dd2e9d68 scope link
```
`fileserver-595ccd77dd-k9bzv` 容器的信息
```shell
# IP地址信息
$ kubectl exec -it fileserver-595ccd77dd-k9bzv -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 12:ec:00:00:e6:71 brd ff:ff:ff:ff:ff:ff
inet 172.26.122.151/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::10ec:ff:fe00:e671/64 scope link
valid_lft forever preferred_lft forever
# 路由信息
$ kubectl exec -it fileserver-595ccd77dd-k9bzv -- ip r
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
# veth-pair對在宿主機網卡名稱
$ ip r | grep 172.26.122.141
172.26.122.151 dev cali7b1def0e886 scope link
```
## IPIP
從 `fileserver-595ccd77dd-hh8c7` 到 `fileserver-595ccd77dd-k9bzv` 兩個pod在跨節點上,數據包流程圖

抓包驗證
```shell
# 192.168.32.127 主機抓包
tcpdump -i ens33 -penn host 192.168.32.128 and 'ip proto 4'
tcpdump -i tunl0 -penn host 172.26.122.151
tcpdump -i cali5e8dd2e9d68 -penn
# 192.168.32.128 主機抓包
tcpdump -i ens33 -penn host 192.168.32.127 and 'ip proto 4'
tcpdump -i tunl0 -penn host 172.26.40.161
tcpdump -i cali7b1def0e886 -penn
```


## BGP
從 `fileserver-595ccd77dd-hh8c7` 到 `fileserver-595ccd77dd-k9bzv` 兩個pod在跨節點上,數據包流程圖

抓包驗證
```shell
# 192.168.32.127 主機抓包
tcpdump -i ens33 -penn host 172.26.122.151
tcpdump -i cali5e8dd2e9d68 -penn
# 192.168.32.128 主機抓包
tcpdump -i ens33 -penn host 172.26.40.161
tcpdump -i cali7b1def0e886 -penn
```


# 總結
- 同節點:無論是IPIP,BGP協議封裝,網絡通信過程都是一樣的。查宿主機路由表轉發請求
- 跨節點
- IPIP封裝:`tunl0` 網卡有數據包通過且封裝數據包(宿主機IP);宿主機網卡抓到 **數據包網絡層** 是兩層的(第一層源宿主機,目的宿主機;第二層源容器,目的容器);**數據包數據鏈路層** 是分別是源宿主機與目的宿主機MAC地址;
- BGP封裝:數據包不經過 `tunl0` 網卡;宿主機網卡抓到 **數據包網絡層** 分別是客戶端容器IP地址與服務端容器IP地址;**數據包數據鏈路層** 是分別是源宿主機與目的宿主機MAC地址;
- 從抓包層面來看:只有網絡層有區別,IPIP協議多一層宿主機之間的IP地址封裝,而BGP協議是沒有的
- 前言
- 架構
- 部署
- kubeadm部署
- kubeadm擴容節點
- 二進制安裝基礎組件
- 添加master節點
- 添加工作節點
- 選裝插件安裝
- Kubernetes使用
- k8s與dockerfile啟動參數
- hostPort與hostNetwork異同
- 應用上下線最佳實踐
- 進入容器命名空間
- 主機與pod之間拷貝
- events排序問題
- k8s會話保持
- 容器root特權
- CNI插件
- calico
- calicoctl安裝
- calico網絡通信
- calico更改pod地址范圍
- 新增節點網卡名不一致
- 修改calico模式
- calico數據存儲遷移
- 啟用 kubectl 來管理 Calico
- calico卸載
- cilium
- cilium架構
- cilium/hubble安裝
- cilium網絡路由
- IP地址管理(IPAM)
- Cilium替換KubeProxy
- NodePort運行DSR模式
- IP地址偽裝
- ingress使用
- nginx-ingress
- ingress安裝
- ingress高可用
- helm方式安裝
- 基本使用
- Rewrite配置
- tls安全路由
- ingress發布管理
- 代理k8s集群外的web應用
- ingress自定義日志
- ingress記錄真實IP地址
- 自定義參數
- traefik-ingress
- traefik名詞概念
- traefik安裝
- traefik初次使用
- traefik路由(IngressRoute)
- traefik中間件(middlewares)
- traefik記錄真實IP地址
- cert-manager
- 安裝教程
- 頒布者CA
- 創建證書
- 外部存儲
- 對接NFS
- 對接ceph-rbd
- 對接cephfs
- 監控平臺
- Prometheus
- Prometheus安裝
- grafana安裝
- Prometheus配置文件
- node_exporter安裝
- kube-state-metrics安裝
- Prometheus黑盒監控
- Prometheus告警
- grafana儀表盤設置
- 常用監控配置文件
- thanos
- Prometheus
- Sidecar組件
- Store Gateway組件
- Querier組件
- Compactor組件
- Prometheus監控項
- grafana
- Querier對接grafana
- alertmanager
- Prometheus對接alertmanager
- 日志中心
- filebeat安裝
- kafka安裝
- logstash安裝
- elasticsearch安裝
- elasticsearch索引生命周期管理
- kibana安裝
- event事件收集
- 資源預留
- 節點資源預留
- imagefs與nodefs驗證
- 資源預留 vs 驅逐 vs OOM
- scheduler調度原理
- Helm
- Helm安裝
- Helm基本使用
- 安全
- apiserver審計日志
- RBAC鑒權
- namespace資源限制
- 加密Secret數據
- 服務網格
- 備份恢復
- Velero安裝
- 備份與恢復
- 常用維護操作
- container runtime
- 拉取私有倉庫鏡像配置
- 拉取公網鏡像加速配置
- runtime網絡代理
- overlay2目錄占用過大
- 更改Docker的數據目錄
- Harbor
- 重置Harbor密碼
- 問題處理
- 關閉或開啟Harbor的認證
- 固定harbor的IP地址范圍
- ETCD
- ETCD擴縮容
- ETCD常用命令
- ETCD數據空間壓縮清理
- ingress
- ingress-nginx header配置
- kubernetes
- 驗證yaml合法性
- 切換KubeProxy模式
- 容器解析域名
- 刪除節點
- 修改鏡像倉庫
- 修改node名稱
- 升級k8s集群
- 切換容器運行時
- apiserver接口
- 其他
- 升級內核
- k8s組件性能分析
- ETCD
- calico
- calico健康檢查失敗
- Harbor
- harbor同步失敗
- Kubernetes
- 資源Terminating狀態
- 啟動容器報錯