|NO.Z.00165|——————————|CloudNative|——|KuberNetes&服務釋出.V16|-------------------------------------------------------|ingress.v04|建立ingress.pod|
阿新 • • 發佈:2022-03-30
[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)