默認本文讀者具有必定的k8s基礎,並對k8s的apiserver、service、controller manager等基本概念有所瞭解。前端
Ingress在service以前加了一層ingress,結構以下:node
ingress -> service -> label selector -> pods www.ok1.com -> app1-service -> app1 selector -> app1 1234 Port:80 or other -> www.ok2.com -> app2-service -> app2 selector -> app2 3456
增長了7層的識別能力,能夠根據 http header, path 等進行路由轉發。
複雜度大爲提高。
Ingress 的實現分爲兩個部分 Ingress Controller 和 Ingress。
Ingress Controller 是流量的入口,是一個實體軟件, 通常是Nginx 和 Haproxy(較少使用)。
Ingress 描述具體的路由規則。
Ingress Controller 會監聽 api server上的 /ingresses 資源 並實時生效。
Ingerss 描述了一個或者多個 域名的路由規則,以 ingress 資源的形式存在。
簡單說: Ingress 描述路由規則, Ingress Controller 實時實現規則。nginx
more deploy-demo.yaml git
apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: selector: app: myapp release: canary ports: - name: http targetPort: 80 port: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 2 selector: matchLabels: app: myapp release: canary template: metadata: labels: app: myapp release: canary spec: containers: - name: myapp image: ikubernetes/myapp:v2 ports: - name: http containerPort: 80
下載並部署:github
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
default-http-backend默認鏡像使用:gcr.io/google_containers/defaultbackend:1.4
因被牆的緣由,改成:registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4後端
kubectl apply -f mandatory.yaml
kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE default-http-backend-5ccf4689c5-tc4mr 1/1 Running 0 19m nginx-ingress-controller-5b6864749-5kcc9 1/1 Running 0 19m
下載並部署:api
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
修改yaml文件,增長nodePort設置,將隨機端口固定。
more service-nodeport.yamltomcat
apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 30080 - name: https port: 443 targetPort: 443 protocol: TCP nodePort: 30443 selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx
more ingress-myapp.yaml app
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-myapp namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: www.ok.com http: paths: - path: backend: serviceName: myapp servicePort: 80
測試:
修改本機hosts,訪問截圖以下:ide
生成證書:
openssl genrsa -out tls.key 2048 openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.ok.com
轉格式:
kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key kubectl get secret kubectl describe secret tomcat-ingress-secret
more tomcat-demo.yaml
apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat release: canary ports: - name: http targetPort: 8080 port: 8080 - 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 release: canary spec: containers: - name: tomcat image: tomcat:latest ports: - name: http containerPort: 8080 - name: ajp containerPort: 8009
more ingress-tomcat-tls.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat-tls namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - tomcat.ok.com secretName: tomcat-ingress-secret rules: - host: tomcat.ok.com http: paths: - path: backend: serviceName: tomcat servicePort: 8080
測試:
後續可在其前端增長四層或七層負載,完成高可用。
https://github.com/kubernetes/ingress-nginx/tree/master/deploy
https://kubernetes.github.io/ingress-nginx/deploy/
https://www.jianshu.com/p/189fab1845c5