• 通过Service访问应用 (2)


     目录  

    • 通过NodePort Service在外部访问集群应用 

    • 通过LoadBalancer Service在外部访问集群应用 

    • Microsoft SQL Server数据库部署 


     为了便于理解和学习,请先阅读上一篇《通过Service访问应用 (1)》再继续学习本篇内容。

    通过NodePort Service在外部访问集群应用

    这时候我们就可以使用NodePort类型的Service了。NodePort服务类型允许在每个节点的IP(任意节点IP)上使用静态端口(NodePort)公开服务,我们可以在集群之外通过请求<NodeIP>:<NodePort>来访问服务。

    YAML定义如下所示:

    kind: Service #资源类型
    apiVersion: v1
    metadata: #标准元数据
      name: nodeport-service  #服务名称
    spec:  #规范定义
      type: NodePort #服务类型,这里是节点端口
      ports:  #端口列表
        - port: 80  #当前端口
          nodePort: 31001 #节点端口,注意默认的端口范围为“30000-32767”,注意不要冲突
      selector: #标签选择器
        app: demo
     

    接下来,我们来执行Service的创建并查询Service:

    kubectl create -f nodePortService.yaml
    kubectl get services nodeport-service

    如上图所示,我们创建了名为“nodeport-service”的Service,该Service映射“31001”节点端口,并且创建了“11.3.138.104”的集群IP,也就是说,Service可以通过“节点IP:节点端口”或“集群IP(spec.clusterIp):端口”进行访问。

    接下来,在集群外部的计算机,我们通过节点IP和节点端口(172.16.2.201:31001)即可访问刚刚部署的Demo应用:

    虽然我们可以在外部访问集群中的应用,但是也可以看到该方案有不少不足:

    • 每个端口仅能支持一个服务,不能冲突

    • 端口范围必须为“30000-32767”,非常不友好

    • 如果节点IP发生变化,服务也将无法访问

    因此,用于开发测试还说得过去,用于生产的话,会影响“升职加薪赢取白富美”!我们得寻求更佳方案。

    通过LoadBalancer Service在外部访问集群应用

     

    LoadBalancer Service是暴露服务到外部(Internet)的标准方式,它可以完美的解决我们上面的问题,不过使用之前,我们得有一个loadBalancerIP——负载均衡IP。一般的云厂商都能够提供这个服务。这里我们以腾讯云为例进行讲解。

    首先,我们需要在腾讯云的k8s集群创建一个Demo Deployment,配置参考上文。

    接下来,我们需要创建一个负载均衡服务,以便得到负载均衡IP:

    有了IP,我们就可以创建LoadBalancer Service了,YAML定义如下所示:

    apiVersion: v1  #api版本
    kind: Service #Service
    metadata: #标准元数据
      name: demo  #名称
      namespace: default #命名空间
    spec: #规范
      clusterIP: 10.3.255.28 #集群IP
      loadBalancerIP: 106.52.99.55 #负载均衡IP
      ports:  #端口列表
      - name: tcp-80-80
        nodePort: 31504 #节点IP
        port: 80 #Pod端口
        protocol: TCP #协议
        targetPort: 80 #服务端口
      selector: #选择器
        app: demo
        k8s-app: demo
        qcloud-app: demo
      type: LoadBalancer #服务类型,这里为负载均衡服务类型

    如上述定义所示,我们进行创建Service。该定义设置了集群IP为“10.3.255.28”,负载均衡IP(loadBalancerIP)为“106.52.99.55”,节点端口为“31504”。Service定义好了,我们对负载均衡服务进行配置,配置一个TCP监听器如下所示:

    接下来,我们就可以尽情访问了。通过节点IP和端口访问:

    通过负载均衡IP访问:

     通过绑定域名访问(请设置域名解析为负载均衡IP):

     

     

    Microsoft SQL Server数据库部署

    为了让大家更好的使用上述对象进行部署,本节笔者使用大家熟知的Microsoft SQL Server数据库来进行部署。

    • 部署目标

      完成Linux版本的Microsoft SQL Server 2017的部署

      使用节点目录“/var/mssql”来存储数据库文件

      设置初始密码为“123456abcD”

      开放1433端口,并且允许外部应用通过节点端口“30338”访问数据库

    • YAML定义

    接下来,我们需要定义YAML文件。根据部署目标,我们确定可以使用Deployment对象和Service对象来完成本次部署。YAML文件定义如下如下所示:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        app: mssql
      name: mssql #当前Deployment对象名称,同一个命名空间下必须唯一
    spec:
      replicas: 1 #副本集数量
      revisionHistoryLimit: 2 #保留的历史记录数,设置为0将清理部署的所有历史记录,无法回滚
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: mssql
        spec:
          containers:
          - env:  #环境变量设置
            - name: ACCEPT_EULA
              value: "Y"
            - name: SA_PASSWORD #sa密码设置
              value: 123456abcD
            image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu #镜像
            imagePullPolicy: Always
            name: mssql
            ports:
              - containerPort: 1433 #容器端口,SQLServer数据库默认端口为1433
            resources:  #资源限制
              limits:
                cpu: "2"
                memory: 2096Mi
              requests:
                cpu: 100m
                memory: 827Mi
            volumeMounts:
            - mountPath: /var/opt/mssql/
              name: data-vol
          restartPolicy: Always
          terminationGracePeriodSeconds: 30 #Pod结束时等待时长(单位为秒)
          volumes:
            - name: data-vol
              hostPath:   #使用主机目录
                path: /var/mssql
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: mssql
      name: mssql #服务名称
    spec:
      ports:
      - name: tcp-1433-1433
        nodePort: 30338 #节点端口,注意默认的端口范围为“30000-32767”,注意不要冲突
        port: 1433  #端口
        protocol: TCP
        targetPort: 1433 #目标端口
      selector: #Pod标签选择器
        app: mssql
      sessionAffinity: None
      type: NodePort #服务类型,这里是负载均衡类型
    • 执行部署

    接下来,我们使用命令执行部署:

    kubectl apply -f mssqlserver.yaml

    “kubectl apply”命令既可以创建资源,也可以用于更新资源对象。接下来我们通过命令可以查看部署状态:

    kubectl get svc -o wide -lapp=mssql
    kubectl get po -o wide -lapp=mssql
    kubectl get deployment -o wide -lapp=mssql

    如上图所示,部署已经成功,那么接下来我们可以使用管理工具进行连接访问:

    往期内容链接

    集群故障处理之处理思路以及健康状态检查(三十二)

    集群故障处理之处理思路以及听诊三板斧(三十三)

    开源导入导出通用库Magicodes.ExporterAndImporter发布

    使用Kubectl部署应用

    通过Service访问应用 (1)

  • 相关阅读:
    “智商平平”学软件
    一个多线程示例程序的BUG修复
    金旭亮《C#面向对象程序设计》2011完整版发布
    《.NET 4.0网络开发入门之旅》7:填平缓冲区陷阱
    《.NET 4.0网络开发入门之旅》5:与Socket的“再次见面”
    《.NET 4.0网络开发入门之旅》6:“麻烦”的数据缓冲区
    软件天才与技术民工
    .NET 4.0 技术亮点剖析——在中科院计算所的讲座PPT及源码下载
    C#实现程序的开机启动
    C#获取当前时间、日期
  • 原文地址:https://www.cnblogs.com/codelove/p/11527089.html
Copyright © 2020-2023  润新知