目录

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

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

  • Microsoft SQL Server数据库部署


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

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

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

YAML定义如下所示:

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

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

  1. kubectl create -f nodePortService.yaml
  2. 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定义如下所示:

  1. apiVersion: v1 #api版本
  2. kind: Service #Service
  3. metadata: #标准元数据
  4. name: demo #名称
  5. namespace: default #命名空间
  6. spec: #规范
  7. clusterIP: 10.3.255.28 #集群IP
  8. loadBalancerIP: 106.52.99.55 #负载均衡IP
  9. ports: #端口列表
  10. - name: tcp--
  11. nodePort: #节点IP
  12. port: #Pod端口
  13. protocol: TCP #协议
  14. targetPort: #服务端口
  15. selector: #选择器
  16. app: demo
  17. k8s-app: demo
  18. qcloud-app: demo
  19. 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文件定义如下如下所示:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: mssql
  6. name: mssql #当前Deployment对象名称,同一个命名空间下必须唯一
  7. spec:
  8. replicas: #副本集数量
  9. revisionHistoryLimit: #保留的历史记录数,设置为0将清理部署的所有历史记录,无法回滚
  10. strategy:
  11. type: Recreate
  12. template:
  13. metadata:
  14. labels:
  15. app: mssql
  16. spec:
  17. containers:
  18. - env: #环境变量设置
  19. - name: ACCEPT_EULA
  20. value: "Y"
  21. - name: SA_PASSWORD #sa密码设置
  22. value: 123456abcD
  23. image: mcr.microsoft.com/mssql/server:-latest-ubuntu #镜像
  24. imagePullPolicy: Always
  25. name: mssql
  26. ports:
  27. - containerPort: #容器端口,SQLServer数据库默认端口为1433
  28. resources: #资源限制
  29. limits:
  30. cpu: ""
  31. memory: 2096Mi
  32. requests:
  33. cpu: 100m
  34. memory: 827Mi
  35. volumeMounts:
  36. - mountPath: /var/opt/mssql/
  37. name: data-vol
  38. restartPolicy: Always
  39. terminationGracePeriodSeconds: #Pod结束时等待时长(单位为秒)
  40. volumes:
  41. - name: data-vol
  42. hostPath: #使用主机目录
  43. path: /var/mssql
  44. ---
  45. apiVersion: v1
  46. kind: Service
  47. metadata:
  48. labels:
  49. app: mssql
  50. name: mssql #服务名称
  51. spec:
  52. ports:
  53. - name: tcp--
  54. nodePort: #节点端口,注意默认的端口范围为“-”,注意不要冲突
  55. port: #端口
  56. protocol: TCP
  57. targetPort: #目标端口
  58. selector: #Pod标签选择器
  59. app: mssql
  60. sessionAffinity: None
  61. type: NodePort #服务类型,这里是负载均衡类型
  • 执行部署

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

  1. kubectl apply -f mssqlserver.yaml

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

  1. kubectl get svc -o wide -lapp=mssql
  2. kubectl get po -o wide -lapp=mssql
  3. kubectl get deployment -o wide -lapp=mssql

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

往期内容链接

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

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

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

使用Kubectl部署应用

通过Service访问应用 (1)

通过Service访问应用 (2)的更多相关文章

  1. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)

    本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...

  2. k8s通过service访问pod(五)--技术流ken

    service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...

  3. k8s Nodeport方式下service访问,iptables处理逻辑(转)

    原文 https://www.myf5.net/post/2330.htm k8s Nodeport方式下service访问,iptables处理逻辑 2017年07月11日 0条评论 976次阅读 ...

  4. 通过 Service 访问 Pod

    我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通过动态创建和销毁 Pod 来保 ...

  5. 通过Service访问应用 (1)

    目录 通过Service访问应用  通过Pod IP访问应用  通过ClusterIP Service在集群内部访问  通过Service访问应用 通过之前的操作,应用部署完成了,我们的Demo网站已 ...

  6. linux运维、架构之路-K8s通过Service访问Pod

    一.通过Service访问Pod 每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的I ...

  7. 通过 Service 访问 Pod【转】

    本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...

  8. k8s通过service访问pod(五)

    service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...

  9. k8s通过Service访问Pod

    如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...

随机推荐

  1. 消息中间件-activemq安全机制

    activemq作为消息中间件这样一个独立的个体存在,连通用户和服务器.如果没有一套完备的安全机制去设置用户权限设置消息分发机制可想后果是非常严重.ActiveMQ如果不加入安全机制的话,任何人只要知 ...

  2. vue 使用gojs绘制简单的流程图

    在vue项目中需要展示工作流进度,可以使用的流程图插件很多 flowchart.js  http://adrai.github.io/flowchart.js/ , 基于SVG创建Flow Chart ...

  3. python+爬虫+微信机器人 打造属于你的网购价格监督利器

    写在最前 程序是为人类服务的,最近正好身边小伙伴们在做球衣生意,当然是去nikenba专区购买了,可是有些热门球衣发布几分钟就被抢完,有些折扣球衣也是很快就被抢售一空,那么我们只能靠自己的眼睛一直盯着 ...

  4. 教你如何认识人脸识别开发套件中的双目摄像、3D结构光摄像头、单目摄像头的区别及详细讲解

    深圳市宁远电子提供的人脸识别模组可支持双目摄像头和3D结构光摄像头,在客户咨询中经常有被问到双目的为什么会比单目的成本高,区别在哪里,他们的适用于哪些场景呢?在此,深圳市宁远电子技术工程师就为大家详细 ...

  5. 行车记+翻车记:.NET Core 新车改造,C# 节能降耗,docker swarm 重回赛道

    非常抱歉,10:00~10:30 左右博客站点出现故障,给您带来麻烦了,请您谅解. 故障原因与博文中谈到的部署变更有关,但背后的问题变得非常复杂,复杂到我们都在怀疑与阿里云服务器 CPU 特性有关. ...

  6. Linux下复位USB设备

    有时候USB设备出错,这时我们希望通过软件复位一下USB设备,可以参考下面这段代码: #include <stdio.h> #include <unistd.h> #inclu ...

  7. Hive常用函数的使用

    Hive常用函数的使用 文章作者:foochane  原文链接:https://foochane.cn/article/2019062501.html 1 基本介绍 1.1 HIVE简单介绍 Hive ...

  8. 装饰器修复技术@wraps

    @wrap修复技术 首先我先说一下wrap的效果 如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称如果使用了@wraps,当A调用了装 ...

  9. YARN底层基础库

      YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...

  10. unity之截屏功能

    1.全屏截图 方法一:在unity的API中,unity给我们提供了一个现成的API  :  Application.CaptureScreenshot(imagename). 但是这个API虽然简单 ...