K8S的inress-nginx

一、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。

二、Ingress 組成

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

    三、ingress的工作原理

    ingress具體的工作原理如下:

ingress contronler通過與k8s的api進行交互,動態的去感知k8s集羣中ingress服務規則的變化,然後讀取它,並按照定義的ingress規則,轉發到k8s集羣中對應的service。

而這個ingress規則寫明瞭哪個域名對應k8s集羣中的哪個service,然後再根據ingress-controller中的nginx配置模板,生成一段對應的nginx配置。

然後再把該配置動態的寫到ingress-controller的pod裏,該ingress-controller的pod裏面運行着一個nginx服務,控制器會把生成的nginx配置寫入到nginx的配置文件中,然後reload一下,使其配置生效。以此來達到域名分配置及動態更新的效果。

四、Ingress 可以解決什麼問題?

動態配置服務

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

減少不必要的暴露端口

配置過k8s的都清楚, 第一步是要關閉防火牆的, 主要原因是k8s的很多服務會以NodePort方式映射出去, 這樣就相當於給宿主機打了很多孔, 既不安全也不優雅. 而Ingress可以避免這個問題, 除了Ingress自身服務可能需要映射出去, 其他服務都不要用NodePort方式

五、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:

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

(2)Ingress :

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

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

需要解決了兩個問題:

1、動態的配置服務。

2、減少不必要的暴露端口。

基於nginx的ingress controller根據不同的開發公司,又分爲兩種:
​ 1、k8s社區版的: Ingerss - nginx.
​ 2、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章