kubernetes將集群外部流量引入集群內


一、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM