天天看點

Kubernets之Ingress

Ingress出現的原因

由于每個Service都要有一個負載均衡服務,這種做法實際上既浪費成本又高。作為使用者,我們其實更希望看到Kubernetes内置一個全局的負載均衡器。然後通過我通路的URL,把請求轉發到不同的後端Service。

這種全局的、為了代理不同後端 Service 而設定的負載均衡服務,就是 Kubernetes 裡的 Ingress 服務。

是以,Ingress 的功能其實很容易了解:所謂 Ingress,就是 Service 的“Service”。

執行個體:把tomcat service通過ingress釋出出去

  1. 部署Nginx Ingress Controller
    $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
               
    kubectl get pod -n ingress-nginx -o wide 
    
    NAME                                        READY     STATUS    RESTARTS   AGE       IP             NODE
    nginx-ingress-controller-775d945fdd-xjc7b   1/1       Running   1          30d       10.244.0.248   10.10.13.127
    
               
  2. 部署service-nodeport

     service-nodeport服務,實作把叢集外部流量接入到叢集中來。

kubectl get svc -n ingress-nginx

NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.100.44.0   <none>        80:31454/TCP,443:31077/TCP   1y
           

    3. 部署tomcat-svc

[[email protected] ingress]# cat tomcat-demo.yaml 
apiVersion: v1
kind: Service
#必須設定為無頭service
metadata:
 name: tomcat
 namespace: default
spec:
  selector:
    app: tomcat
    release: canary
  ports:
  - name: http
    targetPort: 8080   #這是容器port
    port: 8080  #這是service port
  - name: ajp
    targetPort: 8009
    port: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deploy
  namespace: default
spec:
  replicas: 2
  selector: #标簽選擇器
    matchLabels: #比對的标簽為
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat #和上面的myapp要比對
        release: canary
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5.34-jre8-alpine  #在https://hub.docker.com/r/library/tomcat/tags/上面找
        ports:
        - name: http
          containerPort: 8080
        - name: ajp
          containerPort: 8009
           

    kubectl apply -f tomcat-demo.yaml 

[[email protected]]$kubectl get svc
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
tomcat      ClusterIP   10.103.174.6   <none>        8080/TCP,8009/TCP   6h

[[email protected]]$kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
tomcat-deploy-85799c8666-4l2hd   1/1       Running   0          6h
tomcat-deploy-85799c8666-6x6f7   1/1       Running   0          6h
           

    4.部署ingress

[[email protected] ingress]# cat ingress-tomcat.yaml 
apiVersion: extensions/v1beta1 
kind: Ingress
metadata:
  name: ingress-tomcat
  namespace: default #要和deployment和要釋出的service處于同一個名稱空間
  annotations: #這個注解說明我們要用到的ingress-controller是nginx,而不是traefic,enjoy
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: tomcat.zhixin.com #表示通路這個域名,就會轉發到後端myapp管理的pod上的服務:
    http:
      paths: 
      - path:
        backend:
          serviceName: tomcat
          servicePort: 8080
           

kubectl apply -f ingress-tomcat.yaml 

[[email protected]]$kubectl get ingress
NAME             HOSTS               ADDRESS   PORTS     AGE
ingress-tomcat   tomcat.zhixin.com             80        6h

[[email protected]]$kubectl describe ingress ingress-tomcat
Name:             ingress-tomcat
Namespace:        testing-wmh
Address:          
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host               Path  Backends
  ----               ----  --------
  tomcat.zhixin.com  
                        tomcat:8080 (<none>)
Annotations:
Events:  <none>
           

5.本機hosts裡增加域名-ip映射

10.10.13.127 tomcat.zhixin.com

Kubernets之Ingress

原了解釋:

Kubernets之Ingress

建立service,能夠從外網通路Ingress controller。這個 Pod 本身,就是一個監聽 Ingress 對象以及它所代理的後端 Service 變化的控制器。當一個新的 Ingress 對象由使用者建立後,nginx-ingress-controller 就會根據 Ingress 對象裡定義的内容,生成一份對應的 Nginx 配置檔案(/etc/nginx/nginx.conf),并使用這個配置檔案啟動一個 Nginx 服務。

Kubernets之Ingress

nginx  server_name對應請求header中的host

參考資料:

https://kubernetes.io/docs/concepts/services-networking/ingress/

https://time.geekbang.org/column/article/69214

繼續閱讀