kubernetes1.13.1部署ingress-nginx-十一(2)


一、Ingress 簡介 

  (1)

  在Kubernetes中,服務和Pod的IP地址僅可以在集群網絡內部使用,對於集群外的應用是不可見的。
  為了使外部的應用能夠訪問集群內的服務,
  在Kubernetes 目前 提供了以下幾種方案:

    NodePort
    LoadBalancer
    Ingress

  (2)

  Ingress包含 :

    ingress controller
      將新加入的Ingress轉化成Nginx的配置文件並使之生效;
    ingress服務
      將Nginx的配置抽象成一個Ingress對象,每添加一個新的服務只需寫一個新的Ingress的yaml文件即可;

  (3) 

  Ingress 工作原理:

    ingress controller通過和kubernetes api交互,動態的去感知集群中ingress規則變化,

    然后讀取它,按照ingress中自定義的規則,規則寫明了哪個域名對應哪個service,生成一段nginx配置,

    再寫到nginx-ingress-controller的pod里,這個Ingress controller的pod里運行着一個Nginx服務,控制器會把生成的nginx配置寫入/etc/nginx.conf文件中,

    然后reload一下使配置生效。
    以此達到域名分配置和動態更新的問題。

 

  Ingress 可以解決什么問題:

   動態配置服務:
      如果按照傳統方式, 當新增加一個服務時, 我們可能需要在流量入口加一個反向代理指向我們新的k8s服務.

       而如果用了Ingress, 只需要配置好這個服務, 當服務啟動時, 會自動注冊到Ingress的中, 不需要額外的操作.
   減少不必要的端口暴露:
       配置k8s時, 第一步是要關閉防火牆, 原因是k8s的很多服務會以NodePort方式映射出去, 這樣就相當於給宿主機打了很多孔, 既不安全也不優雅.       

      而Ingress可以避免這個問題, 除了Ingress自身服務可能需要映射出去, 其他服務都不要用NodePort方式。

  (4)

  結構圖:

  

  因為整個結構中,要創建不止一個service、pod,我這里用A和B加以區分說明:

    service-A:此service是讓ingress-controller能夠接入集群外部的流量,因為默認外部是不能訪問的;要將此service的端口暴露出去(nodepod);

    service-B:此service就是就是正常的pod service ,關聯至pod-B; 

    ingress-controller:也就是圖中的pod-A,運行在service-A后面,(ingress-controller)以一個pod的形式存在,里面運行着nginx,此pod的namespace

              為ingress-nginx,它會動態感知ingress中的規則變化,ingress規則寫明了哪個域名對應哪個service,ingress會生成一段nginx配置,然后將配置注入

              到ingress-controller的nginx中,reload使其生效,達到動態配置、更新的效果;

               pod-B: 也就是正常的pod

 

二、部署配置Ingress

  (1)獲取配置文件

    https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy    

    下載以下幾個文件:
    configmap.yaml  default-backend.yaml  mandatory.yaml  namespace.yaml  rbac.yaml  tcp-services-configmap.yaml  udp-services-configmap.yaml  with-rbac.yaml

    

 

  (2) 准備鏡像

    a、

    [root@master ingress-nginx]# vim mandatory.yaml  #mandatory.yaml是其他文件的集合

    編輯mandatory.yaml文件,將defaultbackend鏡像地址改成阿里雲的鏡像地址(如下圖),至於原因 你懂得...

    image: registry.cn-hangzhou.aliyuncs.com/allinpay/defaultbackend-amd64:v1.5

    

    b、

    至於nginx-ingress-controller的鏡像,國內可以訪問quay.io,就不用改了;

  (3) 安裝ingress-controller

    [root@master ingress-nginx]# kubectl apply -f mandatory.yaml  #這里執行mandatory.yaml這一個文件就行了

    

    稍等片刻,只要操作不出問題,應該就OK了,如下圖:

    

  (4)創建后端pod和service (pod-B、service-B)

    [root@master ~]# cd /root/manifests/ingress

    [root@master ingress]# cat deploy-demo.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
      namespace: default
    spec:
      selector:
        app: myapp
        release: canary
      ports:
      - name: http
        targetPort: 80
        port: 80
    ---  

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
          release: canary
      template:
        metadata:
          labels:
            app: myapp
            release: canary
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v2
            ports:
            - name: http
              containerPort: 80

   ------------------------------------------------------------------------------

    [root@master ingress]# kubectl apply -f deploy-demo.yaml

      [root@master ingress]# kubectl get pods

    [root@master ingress]# kubectl get svc

    

   (5)創建service-A

    [root@master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml

    [root@master ingress-nginx]# cat service-nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      type: NodePort
      ports:
        - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
      - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx

    ---

    

    [root@master ingress-nginx]# kubectl apply -f service-nodeport.yaml 

    

    在外部瀏覽器中中訪問:ip:30080

     

    此時報錯的原因是因為沒有生成ingress-controller關聯到service-B的ingress規則;

    (5)

              kubectl explain ingress

              kubectl explain ingress.spec.rules

    定義ingress規則,此間規則會自動注入到ingress-controller(pod)的nginx.conf中;

    ingress-controller是直接關聯到service-B的,但是這中間由ingress來生成各種規則;  

    

    - path : 后不加內容代指nginx.conf中生成的路徑為 / (location / ),serviceName:代理到的service名字,靠service找到后端的pod

               此時ingress-controller的nginx.conf中會自動生成一個server段的配置,也就是一個nginx的虛擬主機的字段,還有upstream配置等;

    upstream中自動代理到后端pod ip(pod-B),service會識別到pod,這些都是自動生成,所以就實現了自動生成配置,自動更改配置等;

    只需要改此yaml文件即可;

 

    [root@master ingress]# kubectl apply -f ingress-myapp.yaml 

    

    

    在外部主機上配置好host文件:

    

    然后在瀏覽器中再訪問,發現已經可以訪問到后端pod了:

    

 

三、再來一個例子

  舉一個后端pod(pod-B)為Tomcat的例子:

   草圖如下:

  

   service-B和后端的Tomcat-pod上要開啟8080和8009端口;

   ingress-controller上用80(這里是30080)映射到8080端口,來代理Tomcat;

   此圖中的兩個nginx和兩個tomcat都是pod(pod-B)

   (1)創建后端pod(pod-B、service-B

  

  

   查看一下Tomcat容器中所開的端口,發現8080和8009已經打開:

  

  查看tomcat的svc:

  

  (2)創建ingress

  

  

  (3)

  修改hosts文件:

  

  訪問,發現已經有了,我們這里ingress-controller的nginx暴露的30080端口,不是80,所以要訪問30080:

  

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM