经过NodePort Service在外部访问集群应用 html
经过LoadBalancer Service在外部访问集群应用 前端
Microsoft SQL Server数据库部署 node
为了便于理解和学习,请先阅读上一篇《经过Service访问应用 (1)》再继续学习本篇内容。sql
这时候咱们就可使用NodePort类型的Service了。NodePort服务类型容许在每一个节点的IP(任意节点IP)上使用静态端口(NodePort)公开服务,咱们能够在集群以外经过请求<NodeIP>:<NodePort>来访问服务。数据库
YAML定义以下所示:ubuntu
kind: Service #资源类型 apiVersion: v1 metadata: #标准元数据 name: nodeport-service #服务名称 spec: #规范定义 type: NodePort #服务类型,这里是节点端口 ports: #端口列表 - port: 80 #当前端口 nodePort: 31001 #节点端口,注意默认的端口范围为“30000-32767”,注意不要冲突 selector: #标签选择器 app: demo
接下来,咱们来执行Service的建立并查询Service:api
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):端口”进行访问。bash
接下来,在集群外部的计算机,咱们经过节点IP和节点端口(172.16.2.201:31001)便可访问刚刚部署的Demo应用:session
虽然咱们能够在外部访问集群中的应用,可是也能够看到该方案有很多不足:架构
每一个端口仅能支持一个服务,不能冲突
端口范围必须为“30000-32767”,很是不友好
若是节点IP发生变化,服务也将没法访问
所以,用于开发测试还说得过去,用于生产的话,会影响“升职加薪赢取白富美”!咱们得寻求更佳方案。
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数据库来进行部署。
部署目标
完成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
如上图所示,部署已经成功,那么接下来咱们可使用管理工具进行链接访问: