1. 程式人生 > 其它 >|NO.Z.00165|——————————|CloudNative|——|KuberNetes&服務釋出.V16|-------------------------------------------------------|ingress.v04|建立ingress.pod|

|NO.Z.00165|——————————|CloudNative|——|KuberNetes&服務釋出.V16|-------------------------------------------------------|ingress.v04|建立ingress.pod|



[CloudNative:KuberNetes&服務釋出.V16]                                                               [Applications.KuberNetes] [|DevOps|k8s|服務釋出|什麼是Ingress|使用helm安裝ingress|Ingress簡單使用|Ingress多級域名使用|]








一、Ingress入門使用
### --- 使用詳解:

~~~     # 地址:
~~~     https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/
~~~     # 配置域名的方式有好幾種:
~~~     ConfigMap,Annotations,Custom template自定義模板(使用不多);一般使用Annotations
~~~     在k8s中Ingress也是一種資源型別,它和我們的其它資源也是一樣的,
~~~     都是通過yaml檔案去宣告一個Ingress的例項,這個Ingress例項配置了我們的域名,
~~~     這個域名反向的到那個service,
~~~     # 所以說:
~~~     無論你起了多少個IngressPod,我們只需要建立一個yaml檔案即可,
~~~     它就會Ingress Controller會監聽Ingress的例項檔案,讀取裡面的配置,
~~~     然後自動生成nginx的配置檔案
~~~     我們無需去修改每個controller的配置,這樣相對傳統架構簡單化了。
~~~     而且Ingress controler它會有一個校驗的功能,若是這個Ingress這個yaml檔案寫錯了。
~~~     或者配置不對,它就不會去應用,不會影響你的業務正確性。
~~~     # Annotations:
~~~     應用釋出,跨域的配置,限速的配置等配置檔案一般寫在Annotations裡面,
~~~     然後Ingress Controller會分析你這個Ingress的例項,從Annotations裡面讀取它的配置,
~~~     然後生成我們的nginx的配置檔案。
二、建立一個ingress:建立ingress.yaml配置檔案
### --- 建立ingress.yaml配置檔案

[root@k8s-master01 ~]# vim ingress.yaml 
apiVersion: networking.k8s.io/v1beta1 # networking.k8s.io/v1 / extensions/v1beta1 
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"        #  宣告配置的為ingress.class name為nginx的這個配置,
  name: example
spec:
  rules:                                        #  一個Ingress可以配置多個rules
  - host: foo.bar.com                           #  域名配置,可以不寫,匹配*, *.bar.com
    http:
      paths:                                    #  相當於nginx的location配合,同一個host可以配置多個path / /abc
      - backend:
          serviceName: nginx-svc 
          servicePort: 80
        path: / 
### --- 註釋:宣告ingress.class name的位置

~~~     # ********註釋1************
apiVersion: networking.k8s.io/v1beta1           // apiVersion在k8s1.19以後都是建議使用networking.k8s.io/v1beta1這個。這個暫時還沒有被廢棄掉,在k8s1.22之後會被廢棄掉。 
#extensions/v1beta1                             // 這種的是ingress最開始的格式,已經被廢棄掉了。 
~~~     # ********註釋2************
    annotations:                                // 在建立Ingress中,需要高速ingress,我們實現的配置是什麼呢?配置一般都會寫在annotations中。 
~~~     # ********註釋3************
~~~     我們在建立這個Ingress的時候,指定了一個IngressClass的名稱為nginx,
~~~     建立Ingress例項的時候,需要告訴這個介面使用的是一個叫nginx的ingress.class
~~~     因為一個叢集中不止一個Ingress,可能會很多,
~~~     宣告這個例項需要用nginx的Ingress去解析。其它的可能解析不了。

[root@k8s-master01 ~]# vim /root/ingress-nginx/values.yaml 
  ingressClass: nginx
~~~     # ********註釋4************  
spec:   
  rules:                                        // 規定寫法 一個Ingress可以配置多個rules
  - host: foo.bar.com                           // 域名配置,可以不寫,匹配*, *.bar.com;寫固定域名是用的最多的。
    http:
      paths:                                    // 相當於nginx的location配合,同一個host可以配置多個path / /abc
      - backend:
          serviceName: nginx-svc                // 當前域名代理到那個service,匹配了一個域名下的兩個路徑,也是可以配置的
          servicePort: 80                       // 埠號是service的埠號
        path: /  
三、通過service解析配置的nginx-ingress.pod
### --- 檢視建立的ingress-nginx.service
~~~     這種IP地址+埠號的形式是非常不建議的,所以我們可以配置一個Ingress,
~~~     通過域名的方式訪問到這個服務上。

[root@k8s-master01 ~]# kubectl get svc
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
nginx-svc            NodePort       10.101.145.83   <none>          80:31000/TCP,443:32765/TCP   47h
### --- 測試service地址是否正常解析
~~~     配置一個域名,反代到這個service上。   
~~~     Ingress也是有namespace隔離的,Ingress和你的service在同一個namespace下。

[root@k8s-master01 ~]# curl 10.101.145.83   // 這個service可以正常訪問
<h1>Welcome to nginx!</h1>
四、通過Chrome驗證是否正常解析
### --- 建立Ingress並通過Chrome驗證
~~~     提示v1beta1在1.22版本之後會被廢棄掉,建議使用v1 

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/example created 
### --- 檢視建立的ingress

[root@k8s-master01 ~]# kubectl get ingress
NAME      CLASS    HOSTS         ADDRESS   PORTS   AGE
example   <none>   foo.bar.com             80      15s
### --- 訪問一下這個域名

~~~     配置hosts檔案,這個hosts需要解析到Ingress所在的宿主機節點上面。
~~~     在生產環境中,購買的域名;可以做一個DNS解析,DNS解析應該是解析到公司入口的LB上的,
~~~     LB在反代到你的k8s的ingress的節點的IP地址和埠號上。
~~~     我們只需要解析到宿主機的IP地址上即可。
~~~     配置本地hosts檔案:192.168.1.14 foo.bar.com
~~~     通過Chrome訪問:http://foo.bar.com/可以正常解析到welcome to nginx;
~~~     可以正常訪問後端的服務。
五、Ingress例項詳解
### --- Ingress例項的詳解;登入pod裡面:它會監聽ingress的例項,對應的生成配置檔案。
~~~     實現了域名釋出的方式。就不用去維護nginx的配置;直接去維護yaml檔案即可

[root@k8s-master01 ~]# kubectl exec -ti ingress-nginx-controller-brbvs -n ingress-nginx -- sh
/etc/nginx $ grep "foo.bar.com" nginx.conf
    ## start server foo.bar.com                 //這個域名的開始的配置
        server_name foo.bar.com ;
    ## end server foo.bar.com                   //這個域名的結束的配置
/etc/nginx $ grep "## start server foo.bar.com" nginx.conf -A 20    //檢視這個檔案的後20行
    ## start server foo.bar.com
    server {
        server_name foo.bar.com ;               //server的名稱;
        
        listen 80  ;
        listen [::]:80  ;
        listen 443  ssl http2 ;
        listen [::]:443  ssl http2 ;
        
        set $proxy_upstream_name "-";
        
        ssl_certificate_by_lua_block {
            certificate.call()
        }
        
        location / {
            
            set $namespace      "default";
            set $ingress_name   "example";
            set $service_name   "nginx-svc";
            set $service_port   "80";








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                    ——W.S.Landor



來自為知筆記(Wiz)