国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

kubernetes_核心組件_KubeProxy_KubeProxy三種模式和參數(shù)解析

這篇具有很好參考價值的文章主要介紹了kubernetes_核心組件_KubeProxy_KubeProxy三種模式和參數(shù)解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

系列文章目錄


前言

在前面我們講解過提供相同服務(wù)的一組 Pod 可以抽象成為一個 Service,通過 Service 提供的統(tǒng)一入口(一個虛擬的 Cluster IP 地址)來提供服務(wù),Service 在這里起到了負(fù)載均衡器的作用,它會將接收到的請求轉(zhuǎn)發(fā)給后端的 Pod。在大部分情況下,Service 只是一個概念,而真正起作用的是在各個 Node 節(jié)點(diǎn)上運(yùn)行的 kube-proxy 服務(wù)進(jìn)程。本實驗將會介紹 kube-proxy 的原理和機(jī)制,方便大家能夠更加深入的理解 Service 背后的實現(xiàn)邏輯。

在 Kubernetes 集群中的每個 Node 節(jié)點(diǎn)上都會運(yùn)行一個 kube-proxy 服務(wù)進(jìn)程,可以把這個進(jìn)程看作是 Service 的透明代理兼負(fù)載均衡器,它的核心功能是將到某個 Service 的訪問請求轉(zhuǎn)發(fā)到后端的多個 Pod 實例上。

kube-proxy 提供了三種服務(wù)負(fù)載模式(按時間順序):

第一代模式,基于用戶態(tài)的 userspace 模式:早期的代理模式
第二代模式,iptables 模式:默認(rèn)內(nèi)核級代理模式
第三代模式,ipvs 模式:處于實驗性階段的代理模式

學(xué)習(xí) kubeProxy ,首先要明確這個組件的功能,就是將 svc 的流量轉(zhuǎn)到 Pod ,所以,與其相關(guān)的所有的知識點(diǎn)都是圍繞這個功能來的。

一、kube-proxy三種服務(wù)負(fù)載模式

kube-proxy是什么? kube-proxy是Kubernetes中的一個網(wǎng)絡(luò)代理組件,主要用于負(fù)責(zé)維護(hù)Kubernetes集群中各個節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信,包括負(fù)責(zé)實現(xiàn)Service的負(fù)載均衡、端口轉(zhuǎn)發(fā)、IP地址轉(zhuǎn)發(fā)等功能。

kube-proxy的作用? kube-proxy的作用主要是保證Pod可以與Service進(jìn)行通信,通過負(fù)載均衡功能將請求分發(fā)到后端的多個Pod中,同時也可以實現(xiàn)Service與外部網(wǎng)絡(luò)的通信。kube-proxy還可以通過ipvs和iptables兩種方式實現(xiàn)Service的負(fù)載均衡功能。

kube-proxy的實現(xiàn)原理? kube-proxy實現(xiàn)Service的負(fù)載均衡主要有兩種方式,一種是基于iptables,另一種是基于ipvs。

基于iptables:kube-proxy通過監(jiān)聽Kubernetes API Server的Service對象的變化,根據(jù)Service中配置的Labels來動態(tài)地生成iptables規(guī)則,實現(xiàn)Service的負(fù)載均衡。

基于ipvs:kube-proxy通過監(jiān)聽Kubernetes API Server的Service對象的變化,根據(jù)Service中配置的Labels來動態(tài)地生成ipvs規(guī)則,實現(xiàn)Service的負(fù)載均衡。相比于iptables,ipvs具有更高的性能和更強(qiáng)大的負(fù)載均衡能力。

1.1 userspace 模式

userspace 模式是 kube-proxy 使用的第一代模式,該模式在 kubernetes v1.0 版本開始支持使用。userspace 模式的實現(xiàn)原理圖示如下:

kubectl proxy,# 核心組件,kubernetes,容器,云原生

kube-proxy 會為每個 Service 隨機(jī)監(jiān)聽一個端口(proxy port),并在宿主機(jī)上增加一條 iptables 規(guī)則。所以通過 ClusterIP:Port 訪問 Service 的報文都 redirect 到 proxy port,kube-proxy 從它監(jiān)聽的 proxy port 收到報文以后,走 round robin(默認(rèn)) 或是 session affinity(會話親和力,即同一 client IP 都走同一鏈路給同一 pod 服務(wù)),分發(fā)給對應(yīng)的 pod。

由于 userspace 模式會造成所有報文都走一遍用戶態(tài)(也就是 Service 請求會先從用戶空間進(jìn)入內(nèi)核 iptables,然后再回到用戶空間,由 kube-proxy 完成后端 Endpoints 的選擇和代理工作),需要在內(nèi)核空間和用戶空間轉(zhuǎn)換,流量從用戶空間進(jìn)出內(nèi)核會帶來性能損耗,所以這種模式效率低、性能不高,不推薦使用。了解即可。

1.2 iptables 模式

iptables 模式是 kube-proxy 使用的第二代模式,該模式在 kubernetes v1.1 版本開始支持,從 v1.2 版本開始成為 kube-proxy 的默認(rèn)模式。

iptables 模式的負(fù)載均衡模式是通過底層 netfilter/iptables 規(guī)則來實現(xiàn)的,通過 Informer 機(jī)制 Watch 接口實時跟蹤 Service 和 Endpoint 的變更事件,并觸發(fā)對 iptables 規(guī)則的同步更新。

iptables 模式的實現(xiàn)原理圖示如下:

kubectl proxy,# 核心組件,kubernetes,容器,云原生

通過圖示我們可以發(fā)現(xiàn)在 iptables 模式下,kube-proxy 只是作為 controller,而不是 server,真正服務(wù)的是內(nèi)核的 netfilter,體現(xiàn)用戶態(tài)的是 iptables。所以整體的效率會比 userspace 模式高。

1.3 ipvs 模式

ipvs 模式被 kube-proxy 采納為第三代模式,模式在 kubernetes v1.8 版本開始引入,在 v1.9 版本中處于 beta 階段,在 v1.11 版本中正式開始使用。

ipvs(IP Virtual Server) 實現(xiàn)了傳輸層負(fù)載均衡,也就是 4 層LAN交換,作為 Linux 內(nèi)核的一部分。ipvs運(yùn)行在主機(jī)上,在真實服務(wù)器前充當(dāng)負(fù)載均衡器。ipvs 可以將基于 TCP 和 UDP 的服務(wù)請求轉(zhuǎn)發(fā)到真實服務(wù)器上,并使真實服務(wù)器上的服務(wù)在單個 IP 地址上顯示為虛擬服務(wù)。

ipvs 模式的實現(xiàn)原理圖示如下:

kubectl proxy,# 核心組件,kubernetes,容器,云原生

ipvs 和 iptables 都是基于 netfilter 的,那么 ipvs 模式有哪些更好的性能呢?

  1. ipvs 為大型集群提供了更好的可拓展性和性能
  2. ipvs 支持比 iptables 更復(fù)雜的負(fù)載均衡算法(包括:最小負(fù)載、最少連接、加權(quán)等)
  3. ipvs 支持服務(wù)器健康檢查和連接重試等功能
  4. 可以動態(tài)修改 ipset 的集合,即使 iptables 的規(guī)則正在使用這個集合

ipvs 依賴于 iptables。ipvs 會使用 iptables 進(jìn)行包過濾、airpin-masquerade tricks(地址偽裝)、SNAT 等功能,但是使用的是 iptables 的擴(kuò)展 ipset,并不是直接調(diào)用 iptables 來生成規(guī)則鏈。通過 ipset 來存儲需要 DROP 或 masquerade 的流量的源或目標(biāo)地址,用于確保 iptables 規(guī)則的數(shù)量是恒定的,這樣我們就不需要關(guān)心有多少 Service 或是 Pod 了。

使用 ipset 相較于 iptables 有什么優(yōu)點(diǎn)呢?iptables 是線性的數(shù)據(jù)結(jié)構(gòu),而 ipset 引入了帶索引的數(shù)據(jù)結(jié)構(gòu),當(dāng)規(guī)則很多的時候,ipset 依然可以很高效的查找和匹配。我們可以將 ipset 簡單理解為一個 IP(段) 的集合,這個集合的內(nèi)容可以是 IP 地址、IP 網(wǎng)段、端口等,iptables 可以直接添加規(guī)則對這個“可變的集合進(jìn)行操作”,這樣就可以大大減少 iptables 規(guī)則的數(shù)量,從而減少性能損耗。

舉一個例子,如果我們要禁止成千上萬個 IP 訪問我們的服務(wù)器,如果使用 iptables 就需要一條一條的添加規(guī)則,這樣會在 iptables 中生成大量的規(guī)則;如果用 ipset 就只需要將相關(guān)的 IP 地址(網(wǎng)段)加入到 ipset 集合中,然后只需要設(shè)置少量的 iptables 規(guī)則就可以實現(xiàn)這個目標(biāo)。

小結(jié):
(1) 從userspace模式到iptables模式,減少了用戶空間和內(nèi)核空間切換,減少了消耗;
(2) 從iptables模式到ipvs模式,減少了iptables規(guī)則條數(shù)。

二、kube-proxy 啟動參數(shù)

[root@w1 kubernetes]# kubectl get ds kube-proxy -o yaml -n kube-system
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    k8s-app: kube-proxy
  name: kube-proxy
  namespace: kube-system
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kube-proxy
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: kube-proxy
    spec:
      containers:
      - command:
        - /usr/local/bin/kube-proxy
        - --config=/var/lib/kube-proxy/config.conf
        - --hostname-override=$(NODE_NAME)
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName
        image: k8s.gcr.io/kube-proxy:v1.21.0
        imagePullPolicy: IfNotPresent
        name: kube-proxy
        resources: {}
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/lib/kube-proxy
          name: kube-proxy
        - mountPath: /run/xtables.lock
          name: xtables-lock
        - mountPath: /lib/modules
          name: lib-modules
          readOnly: true
      dnsPolicy: ClusterFirst
      hostNetwork: true
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-node-critical
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: kube-proxy
      serviceAccountName: kube-proxy
      terminationGracePeriodSeconds: 30
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      - operator: Exists
      volumes:
      - configMap:
          defaultMode: 420
          name: kube-proxy
        name: kube-proxy
      - hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
        name: xtables-lock
      - hostPath:
          path: /lib/modules
          type: ""
        name: lib-modules
  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate

2.1 基本參數(shù)

    spec:
      containers:
      - command:
        - /usr/local/bin/kube-proxy   # (容器中的)啟動二進(jìn)制文件和兩個參數(shù)
        - --config=/var/lib/kube-proxy/config.conf  # 使用容器中的配置文件
        - --hostname-override=$(NODE_NAME)  # 使用這個yaml中定義的env NODE_NAME
        env:
        - name: NODE_NAME   # 定義一個名為NODE_NAME的環(huán)境變量,其值來源spec.nodeName,這個環(huán)境變量會刷到Pod容器里面
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName
        name: kube-proxy
        resources: {}   # 資源對 cpu memory disk 的下限r(nóng)equest和上限limit
        securityContext: # 容器里的安全上下文,可以使用特權(quán)容器
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst  # 不使用 CluterFirstWithNet 的話,無法解析 servicename.ns
      hostNetwork: true   # 用來實現(xiàn)ds的Pod直接使用宿主機(jī)的ip和端口
      nodeSelector:    # Pod選擇Node,實現(xiàn)每個Node上一個Pod
        kubernetes.io/os: linux
      priorityClassName: system-node-critical  # Node上資源不夠,這個Pod優(yōu)先使用
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}  # Pod的安全上下文
      serviceAccount: kube-proxy   # Pod要訪問apiserver需要通過sa認(rèn)證,然后 sa - binding - role,這里指定使用哪個sa
      serviceAccountName: kube-proxy
      terminationGracePeriodSeconds: 30
      tolerations:     # Pod里面的容忍是應(yīng)對Node上的污點(diǎn)
      - key: CriticalAddonsOnly
        operator: Exists
      - operator: Exists

  updateStrategy:  # 部署策略包括滾動和重新創(chuàng)建兩種,這里是滾動
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate

2.2 目錄掛盤

    volumeMounts:
    - mountPath: /var/lib/kube-proxy      # 這個目錄下面的config.conf文件就是kube-proxy進(jìn)程的配置文件
      name: kube-proxy
    - mountPath: /run/xtables.lock
      name: xtables-lock
    - mountPath: /lib/modules
      name: lib-modules
      readOnly: true
  volumes:
  - configMap:
      defaultMode: 420
      name: kube-proxy
    name: kube-proxy     # 配置文件通過configmap引入進(jìn)來的
  - hostPath:     # 這里使用hostPath表示僅對Pod所在宿主機(jī)有效,因為ds,每個Node上一個Pod,所以可以這樣用
      path: /run/xtables.lock   # 這兩個目錄暫時不知道干什么的
      type: FileOrCreate
    name: xtables-lock
  - hostPath:
      path: /lib/modules
      type: ""
    name: lib-modules

2.3 kubeproxy配置項(ConfigMap)

[root@w1 kubernetes]# kubectl get configmap kube-proxy -o yaml -n kube-system
apiVersion: v1
data:
  config.conf: |-
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    bindAddress: 0.0.0.0
    bindAddressHardFail: false
    clientConnection:
      acceptContentTypes: ""
      burst: 0
      contentType: ""
      kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
      qps: 0
    clusterCIDR: 10.244.0.0/16
    configSyncPeriod: 0s
    conntrack:
      maxPerCore: null
      min: null
      tcpCloseWaitTimeout: null
      tcpEstablishedTimeout: null
    detectLocalMode: ""
    enableProfiling: false
    healthzBindAddress: ""
    hostnameOverride: ""
    iptables:             # iptables 屬性
      masqueradeAll: false
      masqueradeBit: null
      minSyncPeriod: 0s
      syncPeriod: 0s
    ipvs:                 # ipvs 屬性
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration   # 資源種類
    metricsBindAddress: ""
    mode: ""
    nodePortAddresses: null
    oomScoreAdj: null
    portRange: ""
    showHiddenMetricsForVersion: ""
    udpIdleTimeout: 0s
    winkernel:
      enableDSR: false
      networkName: ""
      sourceVip: ""
  kubeconfig.conf: |-   # kube-proxy訪問apiserver所用到的kubeconfig, 通過配置項刷入到Pod里面
    apiVersion: v1  # 這個kubeconfig,由 cluster user 構(gòu)成,然后兩者組成 context
    kind: Config
    clusters:
    - cluster:
        certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server: https://192.168.100.151:6443
      name: default
    contexts:
    - context:
        cluster: default
        namespace: default
        user: default
      name: default
    current-context: default
    users:
    - name: default
      user:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
kind: ConfigMap
metadata:
  labels:
    app: kube-proxy
  name: kube-proxy
  namespace: kube-system

2.4 kube-proxy 啟動參數(shù)

kube-proxy 啟動參數(shù)包括

–config:kube-proxy 的主配置文件
–hostname-override:設(shè)置本 Node 在集群中的主機(jī)名,不設(shè)置時將使用本機(jī) hostname

[root@w1 kubernetes]# netstat -ntlp | grep kube-proxy
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      2627/kube-proxy     
tcp6       0      0 :::10256                :::*                    LISTEN      2627/kube-proxy 

如上,PID相同,表示只有一個進(jìn)程,但是占用了兩個端口,第一個是metrics server監(jiān)聽的端口,僅適用于統(tǒng)計本機(jī),另一個是健康服務(wù)監(jiān)聽的端口,都是使用默認(rèn)值

–metrics-bind-address:Metrics Server 的監(jiān)聽地址,設(shè)置為 0.0.0.0 表示使用所有 IP 地址,默認(rèn)值為 127.0.0.1:10249

–healthz-bind-address:healthz 服務(wù)綁定主機(jī) IP 地址,設(shè)置為 0.0.0.0 表示使用所有 IP 地址,默認(rèn)值為 0.0.0.0:10256
–healthz-port:healthz 服務(wù)監(jiān)聽的主機(jī)端口號,設(shè)置為 0 表示不啟用,默認(rèn)值為 10256

–bind-address:kube-proxy 綁定主機(jī)的 IP 地址,默認(rèn)值為 0.0.0.0,表示綁定所有 IP 地址
–cleanup:設(shè)置為 true 表示在清除 iptables 規(guī)則和 ipvs 規(guī)則后退出
–cluster-cidr:集群中 Pod 的 CIDR 地址范圍,用于橋接集群外部流量到內(nèi)部
–config-sync-period:從 API Server 更新配置的時間間隔,必須大于 0,默認(rèn)值為 15m0s
–conntrack-max-per-core:跟蹤每個 CPU core 的 NAT 連接的最大數(shù)量(設(shè)置為 0 表示無限制,并忽略 conntrack-min 的值),默認(rèn)值為 32768
–conntrack-min:最小 conntrack 條目的分配數(shù)量,默認(rèn)值為 131072
–conntrack-tcp-timeout-close-wait:當(dāng) TCP 連接處于 CLOSE_WAIT 狀態(tài)時的 NAT 超時時間,默認(rèn)值為 1h0m0s
–conntrack-tcp-timeout-established:建立 TCP 連接的超時時間,設(shè)置為 0 表示無限制,默認(rèn)值為 24h0m0s
–kube-api-burst:每秒發(fā)送到 API Server 的請求的數(shù)量,默認(rèn)值為 10
–kubeconfig:kubeconfig 配置文件路徑,在配置文件中包括 Master 地址信息及必要的認(rèn)證信息
–masquerade-all:設(shè)置為 true 表示使用純 iptables 代理,所有網(wǎng)絡(luò)包都將進(jìn)行 SNAT 轉(zhuǎn)換
–master:API Server 的地址
–proxy-mode:代理模式,可選項為 userspace、iptables、ipvs,默認(rèn)值為 iptables,當(dāng)操作系統(tǒng)內(nèi)核版本或 iptables 版本不夠新時,將自動降級為 userspace 模式

三、kube-proxy 常用命令

kube-proxy的配置方法? kube-proxy的配置方法主要有兩種,一種是通過kube-proxy配置文件進(jìn)行配置,另一種是通過kube-proxy的命令行參數(shù)進(jìn)行配置。通過配置文件進(jìn)行配置可以使用yaml或json格式,而通過命令行參數(shù)進(jìn)行配置則更為靈活,可以在啟動kube-proxy時指定相關(guān)參數(shù),達(dá)到定制化的效果。

kube-proxy的常用命令?
kubectl proxy 啟動kube-proxy
kube-proxy --version 查看kube-proxy的版本信息
kube-proxy --config 查看kube-proxy的配置信息
kube-proxy --cleanup-iptables 清理iptables規(guī)則等

kubectl proxy --help

### 以下為打印幫助內(nèi)容
Creates a proxy server or application-level gateway between localhost and the Kubernetes API Server. It also allows
serving static content over specified HTTP path. All incoming data enters through one port and gets forwarded to the
remote kubernetes API Server port, except for the path matching the static content path.

Examples:
  # To proxy all of the kubernetes api and nothing else.
  kubectl proxy --api-prefix=/
  
  # To proxy only part of the kubernetes api and also some static files.
  # You can get pods info with 'curl localhost:8001/api/v1/pods'
  kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/
  
  # To proxy the entire kubernetes api at a different root.
  # You can get pods info with 'curl localhost:8001/custom/api/v1/pods'
  kubectl proxy --api-prefix=/custom/
  
  # Run a proxy to kubernetes apiserver on port 8011, serving static content from ./local/www/
  kubectl proxy --port=8011 --www=./local/www/
  
  # Run a proxy to kubernetes apiserver on an arbitrary local port.
  # The chosen port for the server will be output to stdout.
  kubectl proxy --port=0
  
  # Run a proxy to kubernetes apiserver, changing the api prefix to k8s-api
  # This makes e.g. the pods api available at localhost:8001/k8s-api/v1/pods/
  kubectl proxy --api-prefix=/k8s-api

Options:
      --accept-hosts='^localhost$,^127\.0\.0\.1$,^\[::1\]$': Regular expression for hosts that the proxy should accept.
      --accept-paths='^.*': Regular expression for paths that the proxy should accept.
      --address='127.0.0.1': The IP address on which to serve on.
      --api-prefix='/': Prefix to serve the proxied API under.
      --disable-filter=false: If true, disable request filtering in the proxy. This is dangerous, and can leave you
vulnerable to XSRF attacks, when used with an accessible port.
      --keepalive=0s: keepalive specifies the keep-alive period for an active network connection. Set to 0 to disable
keepalive.
  -p, --port=8001: The port on which to run the proxy. Set to 0 to pick a random port.
      --reject-methods='^$': Regular expression for HTTP methods that the proxy should reject (example
--reject-methods='POST,PUT,PATCH'). 
      --reject-paths='^/api/.*/pods/.*/exec,^/api/.*/pods/.*/attach': Regular expression for paths that the proxy should
reject. Paths specified here will be rejected even accepted by --accept-paths.
  -u, --unix-socket='': Unix socket on which to run the proxy.
  -w, --www='': Also serve static files from the given directory under the specified prefix.
  -P, --www-prefix='/static/': Prefix to serve static files under, if static file directory is specified.

Usage:
  kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

kubectl proxy 就是啟動一個服務(wù)器,其他所有的參數(shù)都是服務(wù)這個功能的

kubectl proxy,# 核心組件,kubernetes,容器,云原生

四、宿主機(jī)上的iptables規(guī)則(Kube-Proxy)

kube-proxy三種模式中,現(xiàn)在使用的就是只有 iptables 模式 或者 ipvs 模式,不管哪種,這兩個模式都是依賴 node 節(jié)點(diǎn)上的 iptables 規(guī)則,所以,要學(xué)好 kube-proxy 其中一個重要點(diǎn)就是看懂當(dāng)前 k8s 集群的 iptables 規(guī)則。

4.1 給定K8S集群

假設(shè)當(dāng)前整個 k8s 集群所有的 pod 和 svc 如下:
kubectl proxy,# 核心組件,kubernetes,容器,云原生
kube-proxy 的功能是將 svc 上的請求轉(zhuǎn)發(fā)的 pod 上,無論是 iptables 模式還是 ipvs 模式,這個功能都是通過 iptables 鏈來完成的,使用三條命令中的任何一條,就可以打印出 kube-proxy 相關(guān)的鏈

iptables -t nat -L
iptables-save -t nat > iptables_rules.txt  # 這里使用這一條
iptables-save | grep KUBE > kube_rules.txt

打印出來的東西,KUBE-SVC 是代表 service,KUBE-SEP 是代表 Pod,我們的目的是要查看 kube-proxy 底層如何將 svc 轉(zhuǎn)給Pod,就只要看帶有 KUBE-SVC 和 KUBE-SEP 前綴的就好了

4.2 DNS Service將流量發(fā)送給兩個Pod

從 service 出發(fā),看 coredns 的兩個 Pod

(1) 從service出發(fā)

-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.0.10/32 -p tcp -m tcp --dport 9153 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m tcp --dport 9153 -j KUBE-SVC-JD5MR3NA4I4DYORP

ChatGPT解析:這是Kubernetes生成的iptables規(guī)則的一部分,用于Service之間的通信。

第一條規(guī)則匹配所有源IP地址不在10.244.0.0/16網(wǎng)段內(nèi)且目標(biāo)IP地址為10.96.0.10/32(即Kubernetes服務(wù)IP地址)以及目標(biāo)端口為9153的TCP流量,并將其標(biāo)記為MASQUERADE。這個規(guī)則確保返回流量可以正確地返回到源Service。

第二條規(guī)則匹配所有目標(biāo)IP地址為10.96.0.10/32(即Kubernetes服務(wù)IP地址)以及目標(biāo)端口為9153的TCP流量,并將其轉(zhuǎn)發(fā)到名為"KUBE-SVC-JD5MR3NA4I4DYORP"的Service上。這個規(guī)則完成了Service之間的端口轉(zhuǎn)發(fā),確保了Service之間的通信。

(2) 來看一下這個 KUBE-SVC-JD5MR3NA4I4DYORP 規(guī)則,如下:

-A KUBE-SVC-JD5MR3NA4I4DYORP -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-JHFPANVLGNVDZUQD
-A KUBE-SVC-JD5MR3NA4I4DYORP -j KUBE-SEP-VIW7FEYKGV27ZZL4

ChatGPT解析:這是Kubernetes生成的iptables規(guī)則的一部分,用于服務(wù)發(fā)現(xiàn)和負(fù)載均衡。

第一條規(guī)則匹配名為"KUBE-SVC-JD5MR3NA4I4DYORP"的服務(wù),并將其分發(fā)到名為"KUBE-SEP-JHFPANVLGNVDZUQD"的后端Pod。這個規(guī)則使用了統(tǒng)計模式的隨機(jī)方式,設(shè)置了50%的概率將流量轉(zhuǎn)發(fā)到該后端Pod。這個規(guī)則保證了流量的負(fù)載均衡,避免了某個后端Pod過度負(fù)載的情況。

第二條規(guī)則匹配名為"KUBE-SVC-JD5MR3NA4I4DYORP"的服務(wù),并將其分發(fā)到名為"KUBE-SEP-VIW7FEYKGV27ZZL4"的后端Pod。這個規(guī)則沒有使用任何負(fù)載均衡的技術(shù),所以它假定流量的分發(fā)已經(jīng)由其他負(fù)載均衡機(jī)制處理過了。這個規(guī)則通常用于具有自己負(fù)載均衡功能的應(yīng)用程序,如MySQL Cluster和HAProxy等。

所以,50% 發(fā)送到 KUBE-SEP-JHFPANVLGNVDZUQD,則另外其他所有的流量 (100%-50%=50%) 發(fā)送到了 KUBE-SEP-VIW7FEYKGV27ZZL4。

(3) 兩個Pod,先看一下前面這個 KUBE-SEP-JHFPANVLGNVDZUQD ,如下:

-A KUBE-SEP-JHFPANVLGNVDZUQD -s 192.168.159.2/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-JHFPANVLGNVDZUQD -p tcp -m tcp -j DNAT --to-destination 192.168.159.2:9153

ChatGPT解析:這是Kubernetes生成的iptables規(guī)則的一部分,用于Pod內(nèi)部通信。

第一條規(guī)則匹配名為"KUBE-SEP-JHFPANVLGNVDZUQD"的后端Pod,并將來自IP地址為192.168.159.2的流量標(biāo)記為MASQUERADE。這個規(guī)則確保返回流量可以正確地返回到源Pod。

第二條規(guī)則匹配名為"KUBE-SEP-JHFPANVLGNVDZUQD"的后端Pod,并將TCP流量DNAT到IP地址為192.168.159.2、端口為9153的目標(biāo)Pod上。這個規(guī)則完成了Pod之間的端口轉(zhuǎn)發(fā),確保了Pod之間的通信。

(4) 再看后面這個 KUBE-SEP-VIW7FEYKGV27ZZL4 ,如下:

-A KUBE-SEP-VIW7FEYKGV27ZZL4 -s 192.168.159.3/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-VIW7FEYKGV27ZZL4 -p tcp -m tcp -j DNAT --to-destination 192.168.159.3:9153

不用說,剩下50%的流量轉(zhuǎn)發(fā)給了另外一個Pod 192.168.159.3 .

4.3 Kubernetes Service將流量發(fā)送給APIServer的6443端口

還有一個 svc kubernetes ,看一下

-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.0.1/32 -p tcp -m tcp --dport 443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp -m tcp --dport 443 -j KUBE-SVC-NPX46M4PTMTKRN6Y

ChatGPT解釋:第一句命令將TCP流量標(biāo)記為KUBE-MARK-MASQ,這個標(biāo)記表示應(yīng)用NAT規(guī)則以將源IP地址轉(zhuǎn)換為主機(jī)地址。同時,這個規(guī)則還排除了IP地址為10.244.0.0/16的源地址,意味著匹配的流量是除Kubernetes集群外的所有流量。

第二句命令使用KUBE-SVC-NPX46M4PTMTKRN6Y鏈將TCP流量路由到kubernetes服務(wù)的HTTPS端口(默認(rèn)是443端口)。這個鏈指示Kubernetes服務(wù)網(wǎng)絡(luò)代理(kube-proxy)重定向流量到后端的Service或Endpoint對象,以便流量可以到達(dá)相應(yīng)的Pod。

看一下這個 KUBE-MARK-MASQ,如下:

-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000

ChatGPT解釋:這個命令將匹配的TCP流量標(biāo)記為0x4000,即第14位為1的十六進(jìn)制數(shù)。這個標(biāo)記告訴iptables應(yīng)用NAT規(guī)則以將源IP地址轉(zhuǎn)換為主機(jī)地址,這對于使流量從Kubernetes集群外部發(fā)出并且需要保護(hù)Pod IP地址的私密性非常重要。在Kubernetes中,當(dāng)節(jié)點(diǎn)發(fā)出流量時,它不會直接使用Pod的IP地址,而是使用主機(jī)IP地址并且Kubernetes代理為其執(zhí)行NAT。

看一下 KUBE-SVC-NPX46M4PTMTKRN6Y

-A KUBE-SVC-NPX46M4PTMTKRN6Y -j KUBE-SEP-XZ7UW2RNYK4JTL7X

解釋:這個SVC直接跳轉(zhuǎn)到了Pod KUBE-SEP-XZ7UW2RNYK4JTL7X,那就看一下這個Pod吧

-A KUBE-SEP-XZ7UW2RNYK4JTL7X -s 192.168.100.151/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-XZ7UW2RNYK4JTL7X -p tcp -m tcp -j DNAT --to-destination 192.168.100.151:6443

ChatGPT解釋:這兩個命令是Kubernetes生成的iptables規(guī)則的一部分,用于Pod之間的通信。

第一條規(guī)則匹配源IP地址為192.168.100.151的數(shù)據(jù)包,并在后續(xù)處理中將其標(biāo)記為需要進(jìn)行NAT處理。這通常用于使Pod連接到外部網(wǎng)絡(luò)時,通過節(jié)點(diǎn)進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換以保護(hù)Pod的IP地址不被外部知曉。

第二條規(guī)則匹配TCP流量,并將其目標(biāo)IP地址轉(zhuǎn)換為192.168.100.151:6443。這通常用于將流量從一個Pod重定向到另一個Pod或服務(wù),以實現(xiàn)負(fù)載均衡和高可用性。在這個例子中,它將流量重定向到一個Pod,該P(yáng)od提供Kubernetes API服務(wù)器的服務(wù),該服務(wù)通常需要通過這個端口進(jìn)行訪問。

kubectl proxy,# 核心組件,kubernetes,容器,云原生

kubectl proxy,# 核心組件,kubernetes,容器,云原生

kubectl proxy,# 核心組件,kubernetes,容器,云原生

總結(jié)

參考資料:kube-proxy 組件詳解文章來源地址http://www.zghlxwxcb.cn/news/detail-761349.html

到了這里,關(guān)于kubernetes_核心組件_KubeProxy_KubeProxy三種模式和參數(shù)解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Kubernetes核心組件之kube-proxy實現(xiàn)原理

    Kubernetes核心組件之kube-proxy實現(xiàn)原理

    kube-proxy,負(fù)責(zé)為Service提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡。 了解不同網(wǎng)絡(luò)組件的工作原理有助于正確設(shè)計和配置它們,以滿足你的應(yīng)用程序需求。 在Kubernetes網(wǎng)絡(luò)的背后,有一個在幕后工作的組件。它將你的服務(wù)(Services)轉(zhuǎn)化為一些可用的網(wǎng)絡(luò)規(guī)則。這個組件被稱為 Kube

    2024年02月03日
    瀏覽(24)
  • Kubernetes_核心組件_kubelet_kubelet服務(wù)全解析

    Kubernetes_核心組件_kubelet_kubelet服務(wù)全解析

    kubelet所有知識點(diǎn) 查看kubelet當(dāng)前運(yùn)行 查看kubelet當(dāng)前運(yùn)行(啟動文件10-kubeadm.conf) kubelet使用的kubeconfig kubelet使用的配置文件 kubelet使用的環(huán)境變量文件 kubelet使用的額外參數(shù) kubelet啟動全過程 (自定義啟動參數(shù)文件) kubelet和pause鏡像的關(guān)系就是Pod內(nèi)容器間通信 systemctl status kubelet 可

    2024年02月04日
    瀏覽(66)
  • Kubernetes_核心組件_kubelet_kubelet服務(wù)全解析(二)

    Kubernetes_核心組件_kubelet_kubelet服務(wù)全解析(二)

    controller-manager包含了一組控制器,它是整個集群的大腦,每個控制器會關(guān)注自己所關(guān)注的對象,這些控制器里面都會有一個固定的模式,每個控制器都會通過list watcher,去watch它所關(guān)注的對象,當(dāng)這些對象發(fā)生變化以后,以事件通知的形式,告知controller,controller會注冊這些事

    2024年02月15日
    瀏覽(41)
  • 云計算的含義及其基本特征和kubernetes的核心組件及相應(yīng)用途

    云計算是指能夠按照需求,隨時隨地、便捷高效地從可配置的計算資源共享池中獲取網(wǎng)絡(luò)、服務(wù)器、存儲、應(yīng)用及服務(wù)等所需資源的模式。 規(guī)模大、虛擬化、高可靠性、響應(yīng)速度快、高可伸縮性、按需服務(wù)、托管省心、更安全等。 kubernetes整體架構(gòu)包括Master、Node以及etcd。 3.

    2024年02月02日
    瀏覽(47)
  • 本文將從云原生的概念、背景知識、Kubernetes架構(gòu)及核心組件、應(yīng)用場景、案例研究等方面深入剖析云原生課程的相關(guān)知識點(diǎn)

    作者:禪與計算機(jī)程序設(shè)計藝術(shù) 2020年,技術(shù)快速發(fā)展,云計算火爆。云原生領(lǐng)域也隨之蓬勃發(fā)展。云原生已經(jīng)成為大勢所趨,大量企業(yè)都在逐漸轉(zhuǎn)型云原生應(yīng)用架構(gòu)。國內(nèi)外云服務(wù)廠商也紛紛推出基于Kubernetes的服務(wù)平臺,而Kubernetes又是云原生開源技術(shù)體系的一部分。為了幫

    2024年02月07日
    瀏覽(50)
  • Kubernetes核心概念匯總—Kubernetes 架構(gòu)

    Kubernetes核心概念匯總—Kubernetes 架構(gòu)

    目錄 ?編輯 一、概述 1、時光回溯 2、為什么需要 Kubernetes,它能做什么? 3、Kubernetes 不是什么 ?二、Kubernetes 架構(gòu) ?1、節(jié)點(diǎn) 2、管理 節(jié)點(diǎn)名稱唯一性 節(jié)點(diǎn)自注冊 手動節(jié)點(diǎn)管理 3、節(jié)點(diǎn)狀態(tài) 地址 狀況 容量(Capacity)與可分配(Allocatable) 信息(Info) 4、心跳 5、節(jié)點(diǎn)控制器

    2024年02月11日
    瀏覽(18)
  • 【云原生、Kubernetes】Kubernetes核心概念理解

    【云原生、Kubernetes】Kubernetes核心概念理解

    首先我們要掌握 Kubernete 的一些核心概念。 這些核心可以幫助我們更好的理解 Kubernetes 的特性和工作機(jī)制。 首先,Kubernetes 集群中包含2類節(jié)點(diǎn),分別是:master控制節(jié)點(diǎn)和node工作節(jié)點(diǎn)。 master 控制節(jié)點(diǎn) 負(fù)責(zé)管理整個集群系統(tǒng),可以說它是集群的網(wǎng)關(guān)和中樞,是Kubernetes 的大腦和

    2024年02月13日
    瀏覽(28)
  • Cilium系列-5-Cilium替換KubeProxy

    Cilium系列-5-Cilium替換KubeProxy

    Cilium 系列文章 將 Kubernetes 的 CNI 從其他組件切換為 Cilium, 已經(jīng)可以有效地提升網(wǎng)絡(luò)的性能. 但是通過對 Cilium 不同模式的切換/功能的啟用, 可以進(jìn)一步提升 Cilium 的網(wǎng)絡(luò)性能. 具體調(diào)優(yōu)項包括不限于: 啟用本地路由(Native Routing) 完全替換 KubeProxy IP 地址偽裝(Masquerading)切換為基于

    2024年02月16日
    瀏覽(21)
  • 【云原生 ? Kubernetes】kubernetes 核心技術(shù) - Service

    【云原生 ? Kubernetes】kubernetes 核心技術(shù) - Service

    1. Service 的定義 Service 是 Kubernetes 的核心概念之一,創(chuàng)建一個 Service 可以為一組具有相同功能的容器應(yīng)用提供一個統(tǒng)一的入口地址,并且將請求負(fù)載分發(fā)到后端的各個容器應(yīng)用上。 完整 yaml 格式的 Service 定義文件如下: 2. Service 的基本用法 一般情況下,對外部提供服務(wù)的應(yīng)用

    2024年02月01日
    瀏覽(23)
  • kubernetes核心概念 controller

    kubernetes核心概念 controller

    controller用于控制pod 參考: https://kubernetes.io/zh/docs/concepts/workloads/controllers/ 控制器主要分為: Deployments 部署無狀態(tài)應(yīng)用,控制pod升級,回退 ReplicaSet 副本集,控制pod擴(kuò)容,裁減 ReplicationController(相當(dāng)于ReplicaSet的老版本,現(xiàn)在建議使用Deployments加ReplicaSet替代RC) StatefulSets 部署有狀態(tài)應(yīng)用

    2024年02月11日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包