Kubernetes
提供了兩種內建的雲端負載均衡機制(cloud load balancing
)用於發佈公共應用,一種是工做於傳輸層的Service
資源,它實現的是「TCP負載均衡器」
,另外一種是Ingress
資源,它實現的是「HTTP(S)負載均衡器」
。html
TCP負載均衡器前端
不管是
iptables
仍是ipvs
模型的Service
資源都配置於Linux
內核中的Netfilter
之上進行四層調度,是一種類型更爲通用的調度器,支持調度HTTP
、MySQL
等應用層服務。不過,也正是因爲工做於傳輸層從而使得它沒法作到相似卸載HTTPS
中的SSL
會話等一類操做,也不支持基於URL
的請求調度機制,並且,Kubernetes
也不支持爲此類負載均衡器配置任何類型的健康狀態檢查機制。nodeHTTP(S)負載均衡器linux
HTTP(S)
負載均衡器是應用層負載均衡機制的一種,支持根據環境作出更好的調度決策。與傳輸層調度器相比,它提供了諸如可自定義URL
映射和TLS
卸載等功能,並支持多種類型的後端服務器健康狀態檢查機制。nginx
一般狀況下,
service
和pod
僅可在集羣內部網絡中經過IP
地址訪問。全部到達邊界路由器的流量或被丟棄或被轉發到其餘地方。從概念上講,可能像下面這樣:gitinternet | ------------ [ Services ]Ingress是受權入站鏈接到達集羣服務的規則集合。github
internet | [ Ingress ] --|-----|-- [ Services ]你能夠給
Ingress
配置提供外部可訪問的URL
、負載均衡、SSL
、基於名稱的虛擬主機等。用戶經過POST Ingress
資源到API Server
的方式來請求Ingress
。Ingress controller
負責實現Ingress
,一般使用負載平衡器,它還能夠配置邊界路由和其餘前端,這有助於以HA
方式處理流量。vim
Ingress
是Kubernetes API
的標準資源類型之一,它其實就是一組基於DNS
名稱(host
)或URL
路徑把請求轉發至指定的Service
資源的規則,用於將集羣外部的請求流量轉發至集羣內部完成服務發佈。然而,Ingress
資源自身並不能進行「流量穿透」,它僅是一組路由規則的集合,這些規則要想真正發揮做用還須要其餘功能的輔助,如監聽某套接字,而後根據這些規則的匹配機制路由請求流量。這種可以爲Ingress
資源監聽套接字並轉發流量的組件稱爲Ingress
控制器(Ingress Controller
)。後端
Ingress
控制器並不直接運行爲kube-controller-manager
的一部分,它是Kubernetes
集羣的一個重要組件,相似CoreDNS
,須要在集羣上單獨部署。api
以下圖所示,流量到達外部負載均衡器(externalLB
)後,首先轉發至Service
資源Ingres-nginx
上,而後經過Ingress
控制器基於Ingress
資源定義的規則將客戶端請求流量直接轉發至與Service
對應的後端Pod
資源之上。這種轉發機制會繞過Service
資源(app Service
;api Service
),從而省去了由kube-proxy
實現的端口代理開銷。Ingress
規則須要由一個Service
資源對象輔助識別相關的全部Pod
資源。以下Ingress
經過app service
資源去匹配後端的pod1
和pod2
;這個app service
只是起到一個輔助識別功能。
在使用
Ingress resource
以前,必須先了解下面幾件事情。Ingress
是beta
版本的resource
,在kubernetes1.1
以前尚未。你須要一個Ingress Controller
來實現Ingress
,單純的建立一個Ingress
沒有任何意義。
GCE/GKE
會在master
節點上部署一個Ingress Controller
。你能夠在一個Pod
中部署任意個自定義的Ingress Controller
。你必須正確的annotate
每一個Ingress
,好比運行多個Ingress Controller
和關閉glbc
。
Ingress
資源是基於HTTP
虛擬主機或URL
的轉發規則,spec
字段中嵌套了rules
、backend
、tls
等字段進行定義。下面這個示例中,它包含了一個轉發規則,把發往www.ilinux.io
的請求代理給名爲myapp-svc
的Service
資源。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-demo namespace: default annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: www.ilinux.io http: paths: - backend: serviceName: myapp-svc servicePort: 80 #說明:上面資源清單文件中的annotations用於識別其所屬的Ingress控制器的類別,這一點在集羣上部署多個Ingress控制器時尤其重要。
Ingress Spec
(# kubectl explain ingress.spec
)中的字段是定義Ingress
資源的核心組成部分,主要嵌套以下三個字段:
rules <[]Object>:用於定義當前
Ingress
資源的轉發規則列表;未由rules
定義規則,或者沒有匹配到任何規則時,全部流量都會轉發到由backend
定義的默認後端。backend <Object>:默認的後端用於服務那些沒有匹配到任何規則的請求;定義
Ingress
資源時,至少應該定義backend
或rules
二者之一;此字段用於讓負載均衡器指定一個全局默認的後端。tls <[]Object>:
TLS
配置,目前僅支持經過默認端口443
提供服務;若是要配置指定的列表成員指向了不一樣的主機,則必須經過SNI TLS
擴展機制來支持此功能。
ingress.spec.rules.http.paths.backend
對象的定義由兩個必須的內嵌字段組成:serviceName
和servicePort
,分別用於指定流量轉發的後端目標Service
資源的名稱和端口。
Ingress
控制器自身是運行於Pod
中的容器應用,通常是Nginx
或Envoy
一類的具備代理及負載均衡功能的守護進程,它監視着來自API Server
的Ingress
對象狀態,並根據規則生成相應的應用程序專有格式的配置文件並經過重載或重啓守護進程而使新配置生效。
Ingress
控制器其實就是託管於Kubernetes
系統之上的用於實如今應用層發佈服務的Pod
資源,跟蹤Ingress
資源並實時生成配置規則。
運行爲Pod
資源的Ingress
控制器進程經過下面兩種方式接入外部請求流量:
一、以Deployment
控制器管理Ingress
控制器的Pod
資源,經過NodePort
或LoadBalancer
類型的Service
對象爲其接入集羣外部的請求流量,這就意味着,定義一個Ingress
控制器時,必須在其前端定義一個專用的Service
資源。
二、藉助於DaemonSet
控制器,將Ingress
控制器的Pod
資源各自以單一實例的方式運行於集羣的全部或部分工做節點之上,並配置這類Pod
對象以HostPort
(以下圖中的a)或HostNetwork
(以下圖中的b)的方式在當前節點接入外部流量。
1)在github
上下載配置清單yaml
文件,並建立部署
[root@k8s-master ~]# mkdir ingress-nginx #這裏建立一個目錄專門用於ingress-nginx(可省略) [root@k8s-master ~]# cd ingress-nginx/ [root@k8s-master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml #下載配置清單yaml文件 [root@k8s-master ingress-nginx]# ls #查看下載的文件 mandatory.yaml [root@k8s-master ingress-nginx]# kubectl apply -f mandatory.yaml #建立Ingress 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
2)驗證
[root@k8s-master ingress-nginx]# kubectl get pods -n ingress-nginx #查看生成的pod,注意這裏在ingress-nginx名稱空間 NAME READY STATUS RESTARTS AGE nginx-ingress-controller-79f6884cf6-5fb6v 1/1 Running 0 18m [root@k8s-master ingress-nginx]# kubectl describe pod nginx-ingress-controller-79f6884cf6-5fb6v -n ingress-nginx 查看該pod的詳細信息 Name: nginx-ingress-controller-79f6884cf6-5fb6v Namespace: ingress-nginx Priority: 0 Node: k8s-node2/192.168.1.33 Start Time: Fri, 27 Sep 2019 17:53:07 +0800 Labels: app.kubernetes.io/name=ingress-nginx app.kubernetes.io/part-of=ingress-nginx pod-template-hash=79f6884cf6 Annotations: prometheus.io/port: 10254 prometheus.io/scrape: true Status: Running IP: 10.244.2.73 ......
3)若是是裸機部署,還須要安裝service
。(好比VMware
虛擬機、硬件服務器等)
---一樣去官網下載配置清單文件,也能夠自定義建立。 [root@k8s-master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml [root@k8s-master ingress-nginx]# kubectl apply -f service-nodeport.yaml #建立service資源 service/ingress-nginx created [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx #查看service資源 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 9s [root@k8s-master ingress-nginx]# kubectl describe svc/ingress-nginx -n ingress-nginx #查看該service的詳細信息 Name: ingress-nginx Namespace: ingress-nginx Labels: app.kubernetes.io/name=ingress-nginx app.kubernetes.io/part-of=ingress-nginx Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/par... Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx Type: NodePort IP: 10.107.40.182 Port: http 80/TCP TargetPort: 80/TCP NodePort: http 32699/TCP Endpoints: 10.244.2.73:80 Port: https 443/TCP TargetPort: 443/TCP NodePort: https 30842/TCP Endpoints: 10.244.2.73:443 Session Affinity: None External Traffic Policy: Cluster Events: <none>
經過上面建立的service
資源對象能夠看出,隨機分配的http
的NodePort
爲32668
,https
的NodePort
的爲30606
。該端口也能夠自定義,在前面的service
章節說過。單通常不建議自定義。
該示例中建立的全部資源都位於新建的testing
名稱空間中。與其餘的資源在邏輯上進行隔離,以方便管理。
首先建立一個單獨的目錄爲了方便管理
[root@k8s-master ~]# mkdir ingress-nginx/ingress [root@k8s-master ~]# cd ingress-nginx/ingress/
(1)、建立testing
名稱空間(也可使用命令直接建立# kubectl create namespace my-namespace
,不過這裏使用資源清單格式建立)
[root@k8s-master ingress]# vim namespace-testing.yaml #編寫namespace清單文件 apiVersion: v1 kind: Namespace metadata: name: testing labels: env: testing [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl apply -f namespace-testing.yaml #建立namespace namespace/testing created [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl get namespace testing #驗證 NAME STATUS AGE testing Active 12s
(2)、部署nginx
實例,這裏使用Deployment
控制器於testing
中部署nginx
相關的Pod
對象。
[root@k8s-master ingress]# vim deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: testing spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.12 ports: - name: http containerPort: 80 [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl apply -f deployment-nginx.yaml deployment.apps/deploy-nginx created [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl get deploy -n testing NAME READY UP-TO-DATE AVAILABLE AGE deploy-nginx 3/3 3 3 5s [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl get pods -n testing NAME READY STATUS RESTARTS AGE deploy-nginx-686bddcb56-9g7pq 1/1 Running 0 6s deploy-nginx-686bddcb56-gqpm2 1/1 Running 0 6s deploy-nginx-686bddcb56-vtwkq 1/1 Running 0 6s
(3)、建立Service
資源,關聯後端的Pod
資源。這裏經過service
資源svc-nginx
的80
端口去暴露容器的80
端口。
[root@k8s-master ingress]# vim service-nginx.yaml apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: testing labels: app: svc-nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 protocol: TCP [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl apply -f service-nginx.yaml service/svc-nginx created [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl get svc -n testing NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc-nginx ClusterIP 10.99.233.90 <none> 80/TCP 6s [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl describe svc/svc-nginx -n testing Name: svc-nginx Namespace: testing Labels: app=svc-nginx Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"svc-nginx"},"name":"svc-nginx","namespace":"testing"},"s... Selector: app=nginx Type: ClusterIP IP: 10.99.233.90 Port: http 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.76:80,10.244.1.77:80,10.244.2.74:80 Session Affinity: None Events: <none>
(4)、建立Ingress
資源,匹配Service
資源svc-nginx
,並將svc-nginx
的80端口暴露。
[root@k8s-master ingress]# vim ingress-nginx.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx namespace: testing annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: nginx.ilinux.io http: paths: - path: backend: serviceName: svc-nginx servicePort: 80 [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl apply -f ingress-nginx.yaml ingress.extensions/nginx created [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl get ingress -n testing NAME HOSTS ADDRESS PORTS AGE nginx nginx.ilinux.io 80 16s [root@k8s-master ingress]# [root@k8s-master ingress]# kubectl describe ingress -n testing Name: nginx Namespace: testing Address: Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- tomcat.ilinux.io svc-nginx:80 (10.244.1.76:80,10.244.1.77:80,10.244.2.74:80) Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"nginx","namespace":"testing"},"spec":{"rules":[{"host":"nginx.ilinux.io","http":{"paths":[{"backend":{"serviceName":"svc-nginx","servicePort":80},"path":null}]}}]}} kubernetes.io/ingress.class: nginx Events: <none>
(5)、測試,經過Ingress
控制器的前端的Service
資源的NodePort
來訪問此服務,
#首先查看前面部署Ingress控制器的前端的Service資源的映射端口 [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 3m59s #終端測試,添加hosts [root@k8s-master ~]# cat /etc/hosts 192.168.1.31 k8s-master nginx.ilinux.io 192.168.1.32 k8s-node1 nginx.ilinux.io 192.168.1.33 k8s-node2 nginx.ilinux.io #訪問測試 [root@k8s-master ~]# curl nginx.ilinux.io:32699 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> ......
驗證是否調度到後端的Pod
資源,查看日誌
[root@k8s-master ~]# kubectl get pods -n testing NAME READY STATUS RESTARTS AGE deploy-nginx-686bddcb56-9g7pq 1/1 Running 0 56m deploy-nginx-686bddcb56-gqpm2 1/1 Running 0 56m deploy-nginx-686bddcb56-vtwkq 1/1 Running 0 56m [root@k8s-master ~]# kubectl logs deploy-nginx-686bddcb56-9g7pq -n testing 10.244.2.75 - - [28/Sep/2019:02:33:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "10.244.0.0" 10.244.2.75 - - [28/Sep/2019:02:44:02 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "10.244.0.0"
(6)、配置TLS Ingress
資源(這裏使用自簽證書)
1)生成key [root@k8s-master ingress]# openssl genrsa -out tls.key 2048 2)生成證書 [root@k8s-master ingress]# openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=nginx.ilinux.io -days 3650 3)建立secret資源 [root@k8s-master ingress]# kubectl create secret tls nginx-ingress-secret --cert=tls.crt --key=tls.key -n testing secret/nginx-ingress-secret created [root@k8s-master ingress]# kubectl get secret -n testing NAME TYPE DATA AGE default-token-lfzrt kubernetes.io/service-account-token 3 116m nginx-ingress-secret kubernetes.io/tls 2 16s 4)編寫Ingress資源清單文件 [root@k8s-master ingress]# vim ingress-nginx-https.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-ingress-tls namespace: testing annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - nginx.ilinux.io secretName: nginx-ingress-secret rules: - host: nginx.ilinux.io http: paths: - path: / backend: serviceName: svc-nginx servicePort: 80 5)查看Ingress資源信息 [root@k8s-master ingress]# kubectl get ingress -n testing NAME HOSTS ADDRESS PORTS AGE nginx nginx.ilinux.io 80 66m nginx-ingress-tls nginx.ilinux.io 80, 443 15s [root@k8s-master ingress]# kubectl describe ingress/nginx-ingress-tls -n testing Name: nginx-ingress-tls Namespace: testing Address: Default backend: default-http-backend:80 (<none>) TLS: nginx-ingress-secret terminates nginx.ilinux.io Rules: Host Path Backends ---- ---- -------- nginx.ilinux.io / svc-nginx:80 (10.244.1.76:80,10.244.1.77:80,10.244.2.74:80) Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"nginx-ingress-tls","namespace":"testing"},"spec":{"rules":[{"host":"nginx.ilinux.io","http":{"paths":[{"backend":{"serviceName":"svc-nginx","servicePort":80},"path":"/"}]}}],"tls":[{"hosts":["nginx.ilinux.io"],"secretName":"nginx-ingress-secret"}]}} kubernetes.io/ingress.class: nginx Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CREATE 64s nginx-ingress-controller Ingress testing/nginx-ingress-tls
(7)、測試https
(這裏因爲是自籤,因此上面提示不安全)
#首先查看前面部署Ingress控制器的前端的Service資源的映射端口 [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 3m59s
準備工做:這裏建立一個目錄保存本示例的全部資源配置清單
[root@k8s-master ~]# mkdir ingress-nginx/multi_svc [root@k8s-master ~]# cd !$
建立一個名稱空間保存本示例的全部對象(方便管理)
[root@k8s-master multi_svc]# vim namespace-ms.yaml #編寫配置清單文件 apiVersion: v1 kind: Namespace metadata: name: multisvc labels: env: multisvc [root@k8s-master multi_svc]# kubectl apply -f namespace-ms.yaml #建立上面定義的名稱空間 namespace/multisvc created [root@k8s-master multi_svc]# kubectl get namespace multisvc #查看名稱空間 NAME STATUS AGE multisvc Active 9s
這裏後端應用建立爲一組nginx
應用和一組tomcat
應用
1)編寫資源清單文件,這裏將service
資源對象和deployment
控制器寫在這一個文件裏
[root@k8s-master multi_svc]# vim deploy_service-ms.yaml #tomcat應用的Deployment控制器 apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy namespace: multisvc spec: replicas: 3 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: tomcat:jdk8 imagePullPolicy: IfNotPresent ports: - name: httpport containerPort: 8080 - name: ajpport containerPort: 8009 --- #tomcat應用的Service資源 apiVersion: v1 kind: Service metadata: name: tomcat-svc namespace: multisvc labels: app: tomcat-svc spec: selector: app: tomcat ports: - name: httpport port: 8080 targetPort: 8080 protocol: TCP - name: ajpport port: 8009 targetPort: 8009 protocol: TCP --- #nginx應用的Deployment控制器 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy namespace: multisvc spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.12 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 --- #nginx應用的Service資源 apiVersion: v1 kind: Service metadata: name: nginx-svc namespace: multisvc labels: app: nginx-svc spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 protocol: TCP
2)建立上面定義資源對象並查看驗證
[root@k8s-master multi_svc]# kubectl apply -f deploy_service-ms.yaml deployment.apps/tomcat-deploy created service/tomcat-svc created deployment.apps/nginx-deploy created service/nginx-svc created [root@k8s-master multi_svc]# kubectl get pods -n multisvc -o wide #查看pod資源 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-86c667ff66-hl6rx 1/1 Running 0 13s 10.244.2.78 k8s-node2 <none> <none> nginx-deploy-86c667ff66-hx4j8 1/1 Running 0 13s 10.244.2.77 k8s-node2 <none> <none> nginx-deploy-86c667ff66-tl9mm 1/1 Running 0 13s 10.244.1.79 k8s-node1 <none> <none> tomcat-deploy-6484688ddc-n25hn 1/1 Running 0 13s 10.244.1.78 k8s-node1 <none> <none> tomcat-deploy-6484688ddc-s8dts 1/1 Running 0 13s 10.244.1.80 k8s-node1 <none> <none> tomcat-deploy-6484688ddc-snszk 1/1 Running 0 13s 10.244.2.76 k8s-node2 <none> <none> [root@k8s-master multi_svc]# kubectl get svc -n multisvc #查看service資源對象 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-svc ClusterIP 10.104.213.237 <none> 80/TCP 26s tomcat-svc ClusterIP 10.103.75.161 <none> 8080/TCP,8009/TCP 26s [root@k8s-master multi_svc]# kubectl describe svc/nginx-svc -n multisvc #查看service對象nginx-svc的詳細信息 Name: nginx-svc Namespace: multisvc Labels: app=nginx-svc Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx-svc"},"name":"nginx-svc","namespace":"multisvc"},"... Selector: app=nginx Type: ClusterIP IP: 10.104.213.237 Port: http 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.79:80,10.244.2.77:80,10.244.2.78:80 Session Affinity: None Events: <none> [root@k8s-master multi_svc]# kubectl describe svc/tomcat-svc -n multisvc #查看service對象tomcat-svc的詳細信息 Name: tomcat-svc Namespace: multisvc Labels: app=tomcat-svc Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"tomcat-svc"},"name":"tomcat-svc","namespace":"multisvc"}... Selector: app=tomcat Type: ClusterIP IP: 10.103.75.161 Port: httpport 8080/TCP TargetPort: 8080/TCP Endpoints: 10.244.1.78:8080,10.244.1.80:8080,10.244.2.76:8080 Port: ajpport 8009/TCP TargetPort: 8009/TCP Endpoints: 10.244.1.78:8009,10.244.1.80:8009,10.244.2.76:8009 Session Affinity: None Events: <none>
1)編寫資源清單文件
[root@k8s-master multi_svc]# vim ingress_host-ms.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: multi-ingress namespace: multisvc spec: rules: - host: nginx.imyapp.com http: paths: - path: / backend: serviceName: nginx-svc servicePort: 80 - host: tomcat.imyapp.com http: paths: - path: / backend: serviceName: tomcat-svc servicePort: 8080
2)建立上面定義資源對象並查看驗證
[root@k8s-master multi_svc]# kubectl apply -f ingress_host-ms.yaml ingress.extensions/multi-ingress created [root@k8s-master multi_svc]# kubectl get ingress -n multisvc #查看ingress資源對象 NAME HOSTS ADDRESS PORTS AGE multi-ingress nginx.imyapp.com,tomcat.imyapp.com 80 18s [root@k8s-master multi_svc]# kubectl describe ingress/multi-ingress -n multisvc #查看ingress資源multi-ingrsss的詳細信息 Name: multi-ingress Namespace: multisvc Address: Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- nginx.imyapp.com / nginx-svc:80 (10.244.1.79:80,10.244.2.77:80,10.244.2.78:80) tomcat.imyapp.com / tomcat-svc:8080 (10.244.1.78:8080,10.244.1.80:8080,10.244.2.76:8080) Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"multi-ingress","namespace":"multisvc"},"spec":{"rules":[{"host":"nginx.imyapp.com","http":{"paths":[{"backend":{"serviceName":"nginx-svc","servicePort":80},"path":"/"}]}},{"host":"tomcat.imyapp.com","http":{"paths":[{"backend":{"serviceName":"tomcat-svc","servicePort":8080},"path":"/"}]}}]}} Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CREATE 39s nginx-ingress-controller Ingress multisvc/multi-ingress
這是測試自定義的域名,故須要配置host
192.168.1.31 nginx.imyapp.com tomcat.imyapp.com 192.168.1.32 nginx.imyapp.com tomcat.imyapp.com 192.168.1.33 nginx.imyapp.com tomcat.imyapp.com
查看部署的Ingress
的Service
對象的端口
[root@k8s-master multi_svc]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 6h39m
訪問nginx.imyapp.com:32699
訪問tomcat.imyapp.com:32699
這裏使用自簽證書,經過OpenSSL
進行建立
1)建立證書
#建立nginx.imyapp.com域名的證書 [root@k8s-master multi_svc]# openssl genrsa -out nginx.imyapp.com.key 2048 [root@k8s-master multi_svc]# openssl req -new -x509 -key nginx.imyapp.com.key -out nginx.imyapp.com.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=nginx.imyapp.com -days 3650 #建立tomcat.imyapp.com域名的證書 [root@k8s-master multi_svc]# openssl genrsa -out tomcat.imyapp.com.key 2048 [root@k8s-master multi_svc]# openssl req -new -x509 -key tomcat.imyapp.com.key -out tomcat.imyapp.com.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=tomcat.imyapp.com -days 3650 #查看生成的證書 [root@k8s-master multi_svc]# ll *.com.* -rw-r--r-- 1 root root 1298 9月 28 17:23 nginx.imyapp.com.crt -rw-r--r-- 1 root root 1675 9月 28 17:22 nginx.imyapp.com.key -rw-r--r-- 1 root root 1302 9月 28 17:24 tomcat.imyapp.com.crt -rw-r--r-- 1 root root 1679 9月 28 17:24 tomcat.imyapp.com.key
2)建立secrte
#建立nginx域名的secret [root@k8s-master multi_svc]# kubectl create secret tls nginx-ingress-secret --cert=nginx.imyapp.com.crt --key=nginx.imyapp.com.key -n multisvc secret/nginx-ingress-secret created #建立tomcat域名的secret [root@k8s-master multi_svc]# kubectl create secret tls tomcat-ingress-secret --cert=tomcat.imyapp.com.crt --key=tomcat.imyapp.com.key -n multisvc secret/tomcat-ingress-secret created #查看secret [root@k8s-master multi_svc]# kubectl get secret -n multisvc NAME TYPE DATA AGE default-token-mf5wd kubernetes.io/service-account-token 3 5h12m nginx-ingress-secret kubernetes.io/tls 2 53s tomcat-ingress-secret kubernetes.io/tls 2 27s
3)編寫帶TLS
的Ingress
資源清單(這裏經過複製,沒有刪除上面建立的ingress
)
[root@k8s-master multi_svc]# cp ingress_host-ms.yaml ingress_host_https-ms.yaml [root@k8s-master multi_svc]# vim ingress_host_https-ms.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: multi-ingress-https namespace: multisvc annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - nginx.imyapp.com secretName: nginx-ingress-secret - hosts: - tomcat.imyapp.com secretName: tomcat-ingress-secret rules: - host: nginx.imyapp.com http: paths: - path: / backend: serviceName: nginx-svc servicePort: 80 - host: tomcat.imyapp.com http: paths: - path: / backend: serviceName: tomcat-svc servicePort: 8080
4)建立ingress
資源
[root@k8s-master multi_svc]# kubectl apply -f ingress_host_https-ms.yaml ingress.extensions/multi-ingress-https created [root@k8s-master multi_svc]# kubectl get ingress -n multisvc NAME HOSTS ADDRESS PORTS AGE multi-ingress nginx.imyapp.com,tomcat.imyapp.com 80 44m multi-ingress-https nginx.imyapp.com,tomcat.imyapp.com 80, 443 3s
5)測試,經過Ingress
控制器的前端的Service
資源的NodePort
來訪問此服務,上面看到ingress
控制器的service
資源的443
端口對應的節點的30842
端口。
訪問nginx
訪問tomcat
在這種狀況下,根據請求的
URL
中的路徑,請求將發送到兩個不一樣的服務。所以,客戶端能夠經過一個IP
地址(Ingress
控制器的IP
地址)訪問兩種不一樣的服務。注意:這裏
Ingress
中path
的定義,須要與後端真實Service
提供的Path
一致,不然將被轉發到一個不存在的path
上,引起錯誤。
Ingress定義示例
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: tomcat-ingress namespace: multisvc spec: rules: - host: www.imyapp.com http: paths: - path: /nginx backend: serviceName: nginx-svc servicePort: 80 - path: /tomcat backend: serviceName: tomcat-svc servicePort: 8080