天天看點

項目環境搭建【Docker+k8s】十二 || kubernetes Ingress Controller

目錄

  • ​​1、安裝Ingress-nginx(nodePort模式)​​
  • ​​2、安裝Ingress-nginx(hostNetwork模式)​​
  • ​​3、學習交流QQ群【883210148】​​
  • ​​4、關注微信公衆号,免費擷取文檔及資源​​

我們的目的就是将入口統一,不在通過LoadBalance等方式将端口暴露出來,而是使用Ingress提供的反向代理、負載均衡功能作為我們的唯一入口。Ingress Controller有很多種,我們選擇最熟悉的Nginx來處理請求。​​Ingress-nginx安裝文檔​​,本文中主要選擇nodePort和hostNetwork兩種部署方式進行介紹。

  • nodePort部署模式中需要部署的ingress-controller容器較少,一個叢集可以部署幾個就可以了。

    而hostNetwork模式需要在每個節點部署一個ingress-controller容器,是以總起來消耗資源較多。

  • nodePort模式主要占用的是svc的nodePort端口。而hostNetwork則需要占用實體機的80和443端口。
  • 通過nodePort通路時,nginx接收到的http請求中的source ip将會被轉換為接受該請求的node節點的ip,而非真正的client端ip。

    而使用hostNetwork的方式,ingress-controller将會使用的是實體機的DNS域名解析(即實體機的/etc/resolv.conf)。而無法使用内部的比如coredns的域名解析。

1、安裝Ingress-nginx(nodePort模式)

下載下傳Nginx Controller配置檔案。

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/mandatory.yaml
#github位址
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.26.1/deploy/static/mandatory.yaml      

通過資源檔案部署

[root@yn101-22 ingress]# kubectl apply -f mandatory.yaml
#輸出如下
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created      

通過指令檢視ingress-nginx安裝情況

#NodePort方式對外提供服務
[root@yn101-22 ingress]# kubectl get pods -n ingress-nginx -o wide
NAME                                        READY   STATUS    RESTARTS   AGE    IP           NODE                NOMINATED NODE   READINESS GATES
nginx-ingress-controller-69969b98db-tjl84   1/1     Running   0          2m3s   10.244.1.2   yn101-31.host.com   <none>           <none>      

通過ingress-controller對外提供服務,還需手動部署一個servcie,接收叢集外部流量。

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/provider/baremetal/service-nodeport.yaml
#github位址
https://github.com/kubernetes/ingress-nginx/blob/nginx-0.26.1/deploy/static/provider/baremetal/service-nodeport.yaml
#執行yaml
kubectl apply -f service-nodeport.yaml      

2、安裝Ingress-nginx(hostNetwork模式)

下載下傳Nginx Controller配置檔案,本教程選擇的版本為v0.26.1,配置檔案中檢視所需的鏡像image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1,

國内下載下傳鏡像由于網絡的原因,提前拉取鏡像到本地。

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/mandatory.yaml
#github位址
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.26.1/deploy/static/mandatory.yaml      

修改配置檔案,找到如下位置(搜尋serviceAccountName)在下面增加hostNetwork:true

,目的是開啟主機網絡模式,暴露nginx服務端口80

項目環境搭建【Docker+k8s】十二 || kubernetes Ingress Controller

通過資源檔案部署

[root@yn101-22 ingress]# kubectl apply -f mandatory.yaml
#輸出如下
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created      

通過指令檢視ingress-nginx安裝情況

#NodePort方式對外提供服務
[root@yn101-22 ingress]# kubectl get pods -n ingress-nginx -o wide
NAME                                        READY   STATUS    RESTARTS   AGE    IP           NODE                NOMINATED NODE   READINESS GATES
nginx-ingress-controller-69969b98db-tjl84   1/1     Running   0          2m3s   10.244.1.2   yn101-31.host.com   <none>           <none>
#hostNetwork方式對外提供服務
[root@yn101-22 ingress]# kubectl get pods -n ingress-nginx -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE                NOMINATED NODE   READINESS GATES
nginx-ingress-controller-6f7bc978b-tzzrj   1/1     Running   0          27m   192.168.101.32   yn101-32.host.com   <none>           <none>      

安裝過程中READY狀态為0/1,或者STATUS狀态不是Running,可用如下指令檢視具體錯誤資訊,如果為鏡像拉取失敗,下載下傳鏡像包手動加載。

kubectl describe pod <myapp-pod> -n ingress-nginx      

ingress示例:在k8s裡面部署一個tomcat,在内網裡面不能通路,通過nginx反向代理到tomcat

通過tomcat.yaml資源配置檔案部署tomcat,模式更改為ClusterIP,表示隻在内網提供服務

apiVersion: apps/v1
kind: Deployment
#中繼資料
metadata:
  name: tomcat-app
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 2
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5.43
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
 ---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-http
spec:
  ports:
  - port: 8080
    targetPort: 8080
# ClusterIP NodePort LoadBalancer
  type: ClusterIP
  selector:
    app: tomcat      

檢視服務啟動,可以看到服務暴露模式為ClusterIP,對内服務的端口為8080,沒有對外暴露端口,是以在内網是通路不到的

[root@yn101-22 service]# kubectl apply -f tomcat.yml
deployment.apps/tomcat-app created
[root@yn101-22 service]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
tomcat-app-54ccd97f96-9d6x4   1/1     Running   0          2m5s
tomcat-app-54ccd97f96-kr5ds   1/1     Running   0          2m5s
[root@yn101-22 service]# kubectl get deployment
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
tomcat-app   2/2     2            2           2m19s
[root@yn101-22 service]# kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP    3d7h
tomcat-http   ClusterIP   10.104.129.49   <none>        8080/TCP   3m4s      

部署ingress-nginx,建立一個ingress.yaml的配置檔案

apiVersion: extensions/v1beta1 #networking.k8s.io/v1betal
kind: Ingress
metadata:
  name: nginx-web
  #namespace: default
  annotations:
    #指定ingress controller的類型
    kubernetes.io/ingress.class: "nginx"
    #指定我們的roles的path可以使用正規表達式
    nginx.ingress.kubernetes.io/use-regex: "true"
    #連接配接逾時時間,預設為5s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    #後端伺服器回轉資料逾時時間,預設60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    #用戶端上傳檔案最大大小,預設20m
    nginx.ingress.kubernetes.io/proxy-body-timeout: "100m"
    #URL重寫
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  #路由規則
  rules:
  #主機名,隻能是域名
  - host: ingress.yn.com #生産中該域名應當可以被公網解析
    http:
      paths:
      - path:
        backend:
          #背景部署的service name
          serviceName: tomcat-http
          #背景部署的service port
          servicePort: 8080      

部署ingress入口路由規則,通過ingress.yn.com域名進行通路tomcat

[root@yn101-22 ingress]# kubectl apply -f ingress.yml
ingress.extensions/nginx-web created
[root@yn101-22 ingress]# kubectl get ingress
NAME        HOSTS            ADDRESS   PORTS   AGE
nginx-web   ingress.yn.com             80      8s      

是以,通過Ingress通路的邏輯為:Client Request -> Ingress-service(通過NodePort暴露端口) -> Ingress -> Service -> Deployment

3、學習交流QQ群【883210148】

4、關注微信公衆号,免費擷取文檔及資源