K8S的inress-nginx

1、Ingress 及 Ingress Controller 簡介

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 那樣給集羣打多個孔。
K8S的inress-nginx
因此,總的來講要使用 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

2、Ingress 組成

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

    3、ingress的工做原理

    ingress具體的工做原理以下:

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

4、Ingress 能夠解決什麼問題?

動態配置服務

若是按照傳統方式, 當新增長一個服務時, 咱們可能須要在流量入口加一個反向代理指向咱們新的k8s服務. 而若是用了Ingress, 只須要配置好這個服務, 當服務啓動時, 會自動註冊到Ingress的中, 不須要而外的操做.web

減小沒必要要的暴露端口

配置過k8s的都清楚, 第一步是要關閉防火牆的, 主要緣由是k8s的不少服務會以NodePort方式映射出去, 這樣就至關於給宿主機打了不少孔, 既不安全也不優雅. 而Ingress能夠避免這個問題, 除了Ingress自身服務可能須要映射出去, 其餘服務都不要用NodePort方式docker

5、Ingress-nginx配置示例

1) 建立一個web服務,用deployment資源, 用httpd鏡像,而後建立一個service資源與之關聯。

[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

K8S的inress-nginx

[root@master ingress]# kubectl get pod -n bdqn-ns

K8S的inress-nginx

訪問一下

K8S的inress-nginx

2) 建立一個web服務,用deployment 資源,用tomcat:8.5.45鏡像。

[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

K8S的inress-nginx

[root@master ingress]# kubectl get svc -n bdqn-ns

K8S的inress-nginx

訪問一下

K8S的inress-nginx

3) 在k8s集羣前邊部署一個反向代理服務器,這個服務器代理這k8s集羣內部的service資源。

1. Ingress:

(1)Ingress controller: vim

將新加入的Ingress轉化爲反向代理服務器的配置文件,並使之生效。後端

(2)Ingress :api

Ingress:將反向代理服務器的配置抽象成一個Ingress對象,每添加一個新的服務,只須要寫一個新的Ingress的yaml文件便可。

2. Nginx :反向代理服務器。

須要解決了兩個問題:

一、動態的配置服務。

二、減小沒必要要的暴露端口。

基於nginx的ingress controller根據不一樣的開發公司,又分爲兩種:
​ 一、k8s社區版的: Ingerss - nginx.
​ 二、nginx公司本身開發的: nginx- ingress .

3. 在gitbub上找到所需的ingress的yaml文件

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

4. master下載

[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml

5. 修改 mandatory.yaml 文件

[root@master ingress]# vim mandatory.yaml
      hostNetwork: true   #213

K8S的inress-nginx

---------若是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映射到宿主機 上的端口。)

(1)執行一下

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

(2)查看一下

[root@master ingress]# kubectl get pod -n ingress-nginx

6. 建立一個service的yaml文件

(1)執行一下

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

(2)查看一下

[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

K8S的inress-nginx

4)建立Ingress資源。

ingress :
ingress-nginx-controller: 動態感知ingress 資源的變化
ingress: 建立svc5ingress-nginx-contr011er 關聯的規則

(1)編寫ingress的yaml文件

[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

K8S的inress-nginx

[root@master yaml]# kubectl get ingresses. -n bdqn-ns

K8S的inress-nginx

[root@master yaml]# kubectl describe ingresses. -n bdqn-ns

K8S的inress-nginx

進入pod查看一下

[root@master yaml]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-5954d475b6-24k92 /bin/sh
/etc/nginx $ cat nginx.conf

K8S的inress-nginx

(2)訪問一下

進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。

K8S的inress-nginx

訪問http://ingress.bdqn.com/

K8S的inress-nginx

訪問http://ingress.bdqn.com/tomcat

K8S的inress-nginx

5)爲ingress-nginx建立一個service(使用官網的service文件就能夠)

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

複製上面的網址

[root@master yaml]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/provider/baremetal/service-nodeport.yaml
//下載文件到master節點

執行一下,下載的service文件

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

查看一下

[root@master yaml]# kubectl get service -n ingress-nginx

K8S的inress-nginx

訪問一下

進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。

K8S的inress-nginx

訪問http://ingress.bdqn.com:30817/

K8S的inress-nginx

訪問http://ingress.bdqn.com:30817/tomcat

K8S的inress-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

K8S的inress-nginx

進入本機的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)運行所在的節點IP。

添加完以後訪問一下http://ingress.xgp.com/

K8S的inress-nginx

相關文章
相關標籤/搜索