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
相关文章
相关标签/搜索