Ingress簡單的理解: 原先暴露的service,如今給定個統一的訪問入口。 前端
Ingress 是 k8s 資源對象,用於對外暴露服務,該資源對象定義了不一樣主機名(域名)及 URL 和對應後端 Service(k8s Service)的綁定,根據不一樣的路徑路由 http 和 https 流量。而 Ingress Contoller 是一個 pod 服務,封裝了一個 web 前端負載均衡器,同時在其基礎上實現了動態感知 Ingress 並根據 Ingress 的定義動態生成 前端 web 負載均衡器的配置文件,好比 Nginx Ingress Controller 本質上就是一個 Nginx,只不過它能根據 Ingress 資源的定義動態生成 Nginx 的配置文件,而後動態 Reload。我的以爲 Ingress Controller 的重大做用是將前端負載均衡器和 Kubernetes 完美地結合了起來,一方面在雲、容器平臺下方便配置的管理,另外一方面實現了集羣統一的流量入口,而不是像 nodePort 那樣給集羣打多個孔。
因此,總的來講要使用 Ingress,得先部署 Ingress Controller 實體(至關於前端 Nginx),而後再建立 Ingress (至關於 Nginx 配置的 k8s 資源體現),Ingress Controller 部署好後會動態檢測 Ingress 的建立狀況生成相應配置。Ingress Controller 的實現有不少種:有基於 Nginx 的,也有基於 HAProxy的,還有基於 OpenResty 的 Kong Ingress Controller 等,更多 Controller 見:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/,本文使用基於 Nginx 的 Ingress Controller:ingress-nginx。
node
ingress contronler經過與k8s的api進行交互,動態的去感知k8s集羣中ingress服務規則的變化,而後讀取它,並按照定義的ingress規則,轉發到k8s集羣中對應的service。nginx
而這個ingress規則寫明瞭哪一個域名對應k8s集羣中的哪一個service,而後再根據ingress-controller中的nginx配置模板,生成一段對應的nginx配置。git
而後再把該配置動態的寫到ingress-controller的pod裏,該ingress-controller的pod裏面運行着一個nginx服務,控制器會把生成的nginx配置寫入到nginx的配置文件中,而後reload一下,使其配置生效。以此來達到域名分配置及動態更新的效果。github
若是按照傳統方式, 當新增長一個服務時, 咱們可能須要在流量入口加一個反向代理指向咱們新的k8s服務. 而若是用了Ingress, 只須要配置好這個服務, 當服務啓動時, 會自動註冊到Ingress的中, 不須要而外的操做.web
配置過k8s的都清楚, 第一步是要關閉防火牆的, 主要緣由是k8s的不少服務會以NodePort方式映射出去, 這樣就至關於給宿主機打了不少孔, 既不安全也不優雅. 而Ingress能夠避免這個問題, 除了Ingress自身服務可能須要映射出去, 其餘服務都不要用NodePort方式docker
[root@master ingress]# vim deploy_1.yaml apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpd-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-ns spec: containers: - name: httpd image: httpd --- apiVersion: v1 kind: Service metadata: name: httpd-svc namespace: bdqn-ns spec: type: NodePort selector: app: bdqn-ns ports: - name: http-port port: 80 targetPort: 80 nodePort: 31033
[root@master ingress]# kubectl apply -f deploy_1.yaml
[root@master ingress]# kubectl get svc -n bdqn-ns
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# vim deploy_2.yaml apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpd-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-ns spec: apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-tomcat spec: containers: - name: tomcat image: tomcat:8.5.45 --- apiVersion: v1 kind: Service metadata: name: tomcat-svc namespace: bdqn-ns spec: type: NodePort selector: app: bdqn-tomcat ports: - name: tomcat-port port: 8080 targetPort: 8080 nodePort: 32033
[root@master ingress]# kubectl apply -f deploy_2.yaml
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# kubectl get svc -n bdqn-ns
(1)Ingress controller: vim
將新加入的Ingress轉化爲反向代理服務器的配置文件,並使之生效。後端
(2)Ingress :api
Ingress:將反向代理服務器的配置抽象成一個Ingress對象,每添加一個新的服務,只須要寫一個新的Ingress的yaml文件便可。
須要解決了兩個問題:
一、動態的配置服務。
二、減小沒必要要的暴露端口。
基於nginx的ingress controller根據不一樣的開發公司,又分爲兩種:
一、k8s社區版的: Ingerss - nginx.
二、nginx公司本身開發的: nginx- ingress .
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml
[root@master ingress]# vim mandatory.yaml hostNetwork: true #213
---------若是ingress-controller鏡像下載不成功,能夠直接使用下邊的鏡像。
docker pull registry.cn-hangzhou.aliyuncs.com/ilanni/nginx-ingress-controller:0.22.0
須要注意的是,若是使用上述鏡像,須要將deployment資源指定的鏡像名稱進行修改。
修改的是madatory.yaml文件裏的deployment資源。
在deployment資源中,若是添加了此字段,意味着Pod中運行的應用能夠直接使用node節點的端口,這樣node節 點主機所在網絡的其餘主機,就能夠經過訪問該端口訪問此應用。(相似於docker映射到宿主機 上的端口。)
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# kubectl get pod -n ingress-nginx
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# vim mandatory-svc.yaml apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx spec: type: NodePort ports: - name: httpd port: 80 targetPort: 80 - name: https port: 443 selector: app: ingress-nginx
執行一下
[root@master ingress]# kubectl apply -f mandatory-svc.yaml
查看一下
[root@master ingress]# kubectl get svc -n ingress-nginx
ingress :
ingress-nginx-controller: 動態感知ingress 資源的變化
ingress: 建立svc5ingress-nginx-contr011er 關聯的規則
[root@master yaml]# vim ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: bdqn-ingress namespace: bdqn-ns annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: #規則 - host: ingress.bdqn.com #域名 http: paths: - path: / backend: serviceName: httpd-svc #關聯service servicePort: 80 #關聯service的映射端口 - path: /tomcat backend: serviceName: tomcat-svc #關聯service servicePort: 8080 #關聯service的映射端口
[root@master yaml]# kubectl apply -f ingress.yaml
[root@master yaml]# kubectl get pod -n ingress-nginx -o wide
[root@master yaml]# kubectl get ingresses. -n bdqn-ns
[root@master yaml]# kubectl describe ingresses. -n bdqn-ns
[root@master yaml]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-5954d475b6-24k92 /bin/sh /etc/nginx $ cat nginx.conf
複製上面的網址
[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/provider/baremetal/service-nodeport.yaml //下載文件到master節點
[root@master yaml]# kubectl apply -f service-nodeport.yaml
[root@master yaml]# kubectl get service -n ingress-nginx
Service -Nodeport:由於ingress - nginx - controller運行在了集羣內的其中一個節點,爲了保證即便這個節點宕機,咱們對應的域名仍然可以正常訪問服務,因此咱們將ingress -nginx- controller也暴露爲一個service資源。
建立一個deploymen資源,基於nginx鏡像,repolicas:2個.而後建立一個service資源關聯這個deployment資源。最後建立一個ingress資源,將上述svc關聯到ingress.bdqn.com/nginx 目錄下。
[root@master yaml]# vim lianxi.yaml apiVersion: v1 kind: Namespace metadata: name: xgp-666 labels: name: xgp-666 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: xgp namespace: xgp-666 spec: replicas: 2 template: metadata: labels: app: xgp-nginx spec: containers: - name: xgp-nginx image: nginx --- apiVersion: v1 kind: Service metadata: name: xgp-svc namespace: xgp-666 spec: type: NodePort selector: app: xgp-nginx ports: - name: xgp-port port: 80 targetPort: 80 nodePort: 30000 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: xgp-ingress namespace: xgp-666 annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: ingress.xgp.com http: paths: - path: / backend: serviceName: xgp-svc servicePort: 80
[root@master yaml]# kubectl apply -f lianxi.yaml
[root@master yaml]# kubectl describe ingresses. -n xgp-666