<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] 參考連接:[https://www.qikqiak.com/k8s-book/docs/40.ingress.html](https://www.qikqiak.com/k8s-book/docs/40.ingress.html) 參考鏈接:https://www.funtl.com/zh/service-mesh-kubernetes/Ingress-%E7%BB%9F%E4%B8%80%E8%AE%BF%E9%97%AE%E5%85%A5%E5%8F%A3.html#%E4%B8%89%E7%A7%8D%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE%E6%96%B9%E5%BC%8F ## 緣由 看了statefulset[基礎教程]([https://kubernetes.io/zh/docs/tutorials/stateful-application/basic-stateful-set/](https://kubernetes.io/zh/docs/tutorials/stateful-application/basic-stateful-set/))的基礎教程,并且把環境搭建起來后。pod內部是可以連通了。但是我不知道怎么去從外部訪問。 ## 三種外部訪問方式 ### NodePort NodePort 服務是引導外部流量到你的服務的最原始方式。NodePort,正如這個名字所示,**在所有節點(虛擬機)上開放一個特定端口**,任何發送到該端口的流量都被轉發到對應服務。 NodePort 服務特征如下: * 每個端口只能是一種服務 * 端口范圍只能是 30000-32767(可調) * 不在 YAML 配置文件中指定則會分配一個默認端口 > **建議:**不要在生產環境中使用這種方式暴露服務,大多數時候我們應該讓 Kubernetes 來選擇端口 ![](https://www.funtl.com/assets1/Lusifer_2019060601200002.png) ### LoadBalancer LoadBalancer 服務是暴露服務到 Internet 的標準方式。所有通往你指定的端口的流量都會被轉發到對應的服務。它沒有過濾條件,沒有路由等。這意味著你幾乎可以發送任何種類的流量到該服務,像 HTTP,TCP,UDP,WebSocket,gRPC 或其它任意種類。 ![](https://www.funtl.com/assets1/Lusifer_2019060601200003.png) ## Ingress Ingress 事實上不是一種服務類型。相反,它處于多個服務的前端,扮演著 “智能路由” 或者集群入口的角色。你可以用 Ingress 來做許多不同的事情,各種不同類型的 Ingress 控制器也有不同的能力。它允許你基于路徑或者子域名來路由流量到后端服務。 Ingress 可能是暴露服務的最強大方式,但同時也是最復雜的。Ingress 控制器有各種類型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio,等等。它還有各種插件,比如 cert-manager (它可以為你的服務自動提供 SSL 證書)/ 如果你想要使用同一個 IP 暴露多個服務,這些服務都是使用相同的七層協議(典型如 HTTP),你還可以獲取各種開箱即用的特性(比如 SSL、認證、路由等等) ![](https://www.funtl.com/assets1/Lusifer_2019060601200004.png) ### Ingress組成 Ingress 使用開源的反向代理負載均衡器來實現對外暴露服務目的,比如用Nginx、Apache、Haproxy等。用的最多的是使用nginx來做的。 Nginx Ingress 一般有三個組件組成: * **ingress**是kubernetes的一個資源對象,用于編寫定義規則。將nginx的配置抽象成一個Ingress對象,當用戶每添加一個新的服務,只需要編寫一個新的ingress的yaml文件即可。 * **反向代理負載均衡器**通常以Service的Port方式運行,接收并按照ingress定義的規則進行轉發,通常為nginx,haproxy,traefik等,本文使用nginx。 * **ingress-controller**監聽apiserver,獲取服務新增,刪除等變化,并結合ingress規則動態更新到反向代理負載均衡器上,并重載配置使其生效。 以上三者有機的協調配合起來,就可以完成 Kubernetes 集群服務的暴漏。 ![](https://cdn.jsdelivr.net/gh/wandouduoduo/wandouduoduo.github.io/articles/f6f38be4/1.png) **組件說明** externalLB : 外部的4層負載均衡器 ingress-nginx : nodePort 類型的 service 為ingress-nginx 的 pod 接入外部流量 ingress-nginx : ingress-nginx pod, 負責創建負載均衡 : Ingress 根據后端 Service 實時識別分類及 IP 把結果生成配置文件注入到 ingress-nginx pod 中 site1 : Service 對后端的pod 進行分類(只起分類作用) ### Ingress工作原理 * ingress controller通過和kubernetes api交互,動態的去感知集群中ingress規則變化。 * 然后讀取它,按照自定義的規則,規則就是寫明了那個域名對應哪個service,生成一段nginx配置。 * 在寫到nginx-ingress-controller的pod里,這個Ingress controller的pod里運行著一個Nginx服務,控制器會把生成的nginx配置寫入/etc/nginx.conf文件中。 * 然后reload一下使配置生效,以此達到分配和動態更新問題。 ### **Ingress解決痛點** **動態配置服務** 如果按照傳統方式,當新增加一個服務時,我們可能需要在流量入口加一個反向代理指向我們新的服務,而使用ingress,只需要配置好ingress,當服務啟動時,會自動注冊到ingress當中,不需要額外的操作。 **減少不必要的Port暴露(安全,端口容易管理)** 我們知道部署k8s時,是需要關閉防火墻的,主要原因是k8s的很多服務會以nodeport方式映射出去,這樣對于宿主機來說是非常的不安全的,而ingress可以避免這個問題,只需要將ingress自身服務映射出去,就可代理后端所有的服務,則后端服務不需要映射出去。 ### nginx服務 結合Statefulset的示例進行配置。這是未配置之前的示例: ``` apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: v1 kind: PersistentVolume metadata: name: "www-data-pv" labels: name: www-data-pv release: stable spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /nfs/www/data server: 192.168.84.75 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: www-data-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: www-data-pv release: stable --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumes: - name: www persistentVolumeClaim: claimName: www-data-pvc ``` ## Ingress示例 我們知道前面我們使用 NodePort 和 LoadBlancer 類型的 Service 可以實現把應用暴露給外部用戶使用,除此之外,Kubernetes 還為我們提供了一個非常重要的資源對象可以用來暴露服務給外部用戶,那就是 ingress。 創建一個 ingress 對象:(ingress.yaml) ``` # Ingress 配置 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: web-cluster-external labels: name: web-cluster-external app: nginx spec: rules: - host: nginx.com http: paths: - backend: serviceName: web-cluster-external servicePort: 80 path: / ``` 然后為 traefik dashboard 創建對應的 ingress 對象: ``` $ kubectl create -f ingress.yaml ``` 可以查看ingress是否創建成功 ``` kubectl describe ingress web-cluster-external ``` 要注意上面的 ingress 對象的規則,特別是 rules 區域,我們這里是要為 ngin 建立一個 ingress 對象,所以這里的 serviceName 對應的是上面我們創建的 web-cluster-external ,端口也要注意對應 80端口,為了避免端口更改,這里的 servicePort 的值也可以替換成上面定義的 port 的名字: web ` ` 創建完成后,我們應該怎么來測試呢? * 第一步,在本地的**/etc/hosts**里面添加上 nginx.com 與 節點外網 IP 的映射關系 * 第二步,在瀏覽器中訪問:nginx.com 我們會發現并沒有得到我們期望的 inde.html界面,這是因為我們上面statefulset 部署 nginx 的時候沒有外放NodePort端口。需要配置。ClusterIP都是集群內部訪問的。需要我們建立一個名為service對象node.yaml ``` # cluster ip apiVersion: v1 kind: Service metadata: name: web-cluster-external labels: name: web-cluster-external app: nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 nodePort: 32002 #增加 type: NodePort ``` 創建service對象 ``` kubectl apply node.yaml ``` 這樣就可以通過節點 ip:32002來訪問nginx啦。或者是通過域名來訪問
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看