Spring Cloud Finchley.SR1 的學習與應用 12 - 整合Docker,使用Kubernetes編排容器

整合Docker,使用Kubernetes編排容器

這部分須要有必定k8s的知識基礎,建議瞭解k8s基本使用方法再閱讀node

整合Docker

詳見個人另一篇文章基於Docker的微服務CI CD流水線 nginx

使用Kubernetes編排容器

準備Docker鏡像

按照上面內容,準備好以下鏡像:git

dev.server:5000/woqu/gateway-woqu:0.0.1-SNAPSHOT

部署應用

建立Deploymentgithub

apiVersion: extensions/v1beta1 # kubectl api的版本
kind: Deployment # kubernetes的資源類型 對於無狀態應用 Deployment便可
metadata:
    name: gateway-woqu-001-SNAPSHOT # 部署的名稱 不能重複 由於我須要多個版本共存所以使用 名稱-版本號的命名方式
spec:
    strategy:
        rollingUpdate: # 滾動更新策略
            maxSurge: 10% # 數值越大 滾動更新時新建立的副本數量越多
            maxUnavailble: 10% # 數值越大 滾動更新時銷燬的舊副本數量越多
    replicas: 3 # 期待運行的Pod副本數量
    template:
        metadata:
            labels: # 自定義標籤
                serverType: http
                env: production
                version: 0.0.1-SNAPSHOT
        spec:
            containers:
                - name: httpapp
                  image: dev.server:5000/woqu/gateway-woqu:0.0.1-SNAPSHOT
                  readinessProbe: # 一種健康檢查決定是否加入到service 對外服務 當接口返回200-400以外的狀態碼時,k8s會認爲這個pod已經不可用,會從Service中移除
                      httpGet:
                          scheme: HTTP # 支持http https
                          path: /ready
                          port: 7001
                      initialDelaySeconds: 10 # 容器啓動多久後開始檢查
                      periodSecods: 5 # 幾秒檢查一次

            imagePullSecrets:
                - name: regsecret #獲取私有倉庫鏡像的Secret

建立對應的serviceshell

apiVersion: v1 # kubectl api的版本
kind: Service # kubernetes的資源類型 這裏是Service
metadata:
    name: gateway-woqu-001-SNAPSHOT # 服務的名稱 不能重複 不能有. 由於我須要多個版本共存所以使用 名稱-版本號並去掉.的方式命名
spec:
    type: ClusterIP # service的類型 ClusterIp類型 只有Cluster內部節點和Pod能夠訪問 NodePort Cluster外部能夠經過<NodeIp>:<NodePort>訪問 LoadBalancer負載均衡
    selector: # 匹配pod的標籤與上文Deployment中的labels一致
        serverType: http
        env: production
        version: 0.0.1-SNAPSHOT
    ports:
        - protocol: TCP # 只有TCP 或 UDP
          port: 7001 # 服務 監聽的端口
          targetPort: 7001 # Pod 監聽的端口 對應上面的Deployment中的HTTP_PORT

建立對應的ingress(路由)對外提供服務api

apiVersion: extensions/v1beta1 # kubectl api的版本
kind: Ingress # kubernetes的資源類型 這裏是Ingress
metadata:
  name: woqu-http # 路由的名稱
spec:
  rules:
    - host: xx.xxxx.com # 域名
      http:
        paths:
          - backend:
              serviceName: gateway-woqu-001-SNAPSHOT # 轉發的服務名
              servicePort: 7001 # 轉發到服務的哪一個端口 對應上文的service port
            path: / # 匹配路徑

爲什麼不直接使用Service對外提供服務?
其實咱們只須要把Service的類型改爲LoadBlancer,阿里雲(其餘雲服務商相似)會給Service添加一個監聽的nodePort,再自動建立一個負載均衡,經過tcp轉發到Service的nodePort上(這地方阿里雲有個bug每次更新Service它都會把轉發類型改爲tcp),可想而知,當咱們的Service愈來愈多時,nodePort的管理成本也就愈來愈高, k8s提供了另一個資源解決這種問題,就是Ingress,而Nginx-Ingress-Controller的註解能夠在這裏查詢 傳送門app

最後,使用kubectl命令部署負載均衡

kubectl apply -f gateway-woqu-deployment.yaml
kubectl apply -f gateway-woqu-service.yaml
kubectl apply -f woqu-http.yaml
相關文章
相關標籤/搜索