一、service:pod是有生命周期的,我們想給客戶一個固定的訪問端點,在客戶端與服務端之間啟動一個固定的中間層,依賴於kubernetes的一個附件CoreDns。kubernetes有三類網路地址
1.node network 節點網路,實在存在的,配置在節點接口之上的
2.pod network pod網絡,實在存在的,配置在pod資源之上的
3.cluster network 集群地址,虛擬地址,僅出現service的規則當中
service:有三種工作模式
userspace:用戶空間,用戶請求到達service以后,先把他轉為本地監聽在某個套接字上的用戶空間的kube-proxy,由kube-proxy負責處理。kube-proxy處理完成以后再轉給service ip 最終代理至這個service管理的各pod實現調度。效率很低,先到內核空間--->用戶空間--->內核空間.是kube-proxy負責調度的
iptables:客戶端ip請求時直接請求service ip,請求報文在本地內核空間的service規則截取,進而直接調度給相關的pod。由iptables規則直接負責調度。1.10-之前用
ipvs:客戶端ip請求時直接請求service ip,請求報文在本地內核空間的service ipvs截取,進而直接調度給相關的pod。由ipvs規則直接負責調度。1.1.1+用的是ipvs
service的pod資源發生改變,例如標簽選擇器適用的pod增加。適用的信息會立即反映到api server中,kube-proxy watch到api server中的變化 ,立即轉為ipvs的規則。動態實時轉換
使用清單創建service資源:
獲取service字段信息:kubectl explain service
type格式是clusterIP
apiVersion: v1 kind: Service metadata: name: redis namespace: default spec: selector: app: redis role: logstor clusterIP: 10.97.97.97 type: ClusterIP ports: - port: 6379 targetPort: 6379
type格式是nodeport,可以在集群外訪問。通過訪問每個節點的ip:nodeport
apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: selector: app: myapp release: canary clusterIP: 10.98.98.98 #如果將clusterIP設置為None就是無頭的service,沒有ip地址,但是可以通過名稱myapp.defalut.svc.cluster.local.進行訪問
sessionAffinity: ClientIP
type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080
紅色字體表示設置選擇session保持
二、ingress Controller + service(僅用於對pod的分類,service關聯的有幾個pod,就是upstream后端pod) 實現
ingress基於service分類,識別出有幾個pod和pod信息。並且把pod的信息(ip地址)生成配置信息,注入到ingress Controller
k8s還有yi一種引入集群外部流量的方式ingress,ingress資源是一種七層調度器,他利用一種七層pod來實現將外部流量引入到內部來。事實上他也脫離不了service的工作。 作為ingress 用於基於七層調度時,我們必須要用pod中的運行的七層服務功能的mirror調度。可用的解決方案nginx,haproxy等。
nginx
Traefik
Envooy(適用於微服務)
ingress的定義 kubectl explain ingress
安裝ingress可以參照 https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
用ingress-nginx代理到后端tomcat
定義后端tomcat的deployment和service
apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat release: canary ports: - name: http port: 8080 targetPort: 8080 - name: ajp port: 8009 targetPort: 8009 --- apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy namespace: default spec: replicas: 1 selector: matchLabels: app: tomcat release: canary strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: app: tomcat release: canary spec: containers: - name: tomcat-container image: tomcat:8.5.32-jre8-alpine imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 - name: ajp containerPort: 8009
vim ingress-tomcat.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat namespace: default annotations: kubernetes.io/ingress.clall: "nginx" spec: rules: - host: tomcat.yiruiduan.com http: paths: - path: /tomcat backend: serviceName: tomcat servicePort: 8080
紅色部分是想對應的,只有在同一個namespace才能找到后端的tomcat。ingress是通過service確定哪些是他的后端服務器的所以serviceName要和后端的service名稱相同
注:根據url路徑代理,后端的tomcat必須存在真是的path路徑。即tomcat的pod中/usr/local/tomcat/webapps的目錄下有tomcat路徑,否則會返回404
構建https服務
創建secret對象 kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
查看secret對象 kubectl get secret
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tomcat-tls namespace: default annotations: kubernetes.io/ingress.clall: "nginx" spec: tls: - hosts: - tomcat.yiruiduan.com secretName: tomcat-ingress-secret rules: - host: tomcat.yiruiduan.com http: paths: - path: /tomcat backend: serviceName: tomcat servicePort: 8080 - path: backend: serviceName: tomcat servicePort: 8080
訪問測試:https://tomcat.yiruiduan.com:80443