通过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: #当前端口
nodePort: #节点端口,注意默认的端口范围为“-”,注意不要冲突
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--
nodePort: #节点IP
port: #Pod端口
protocol: TCP #协议
targetPort: #服务端口
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: #副本集数量
revisionHistoryLimit: #保留的历史记录数,设置为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:-latest-ubuntu #镜像
imagePullPolicy: Always
name: mssql
ports:
- containerPort: #容器端口,SQLServer数据库默认端口为1433
resources: #资源限制
limits:
cpu: ""
memory: 2096Mi
requests:
cpu: 100m
memory: 827Mi
volumeMounts:
- mountPath: /var/opt/mssql/
name: data-vol
restartPolicy: Always
terminationGracePeriodSeconds: #Pod结束时等待时长(单位为秒)
volumes:
- name: data-vol
hostPath: #使用主机目录
path: /var/mssql
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mssql
name: mssql #服务名称
spec:
ports:
- name: tcp--
nodePort: #节点端口,注意默认的端口范围为“-”,注意不要冲突
port: #端口
protocol: TCP
targetPort: #目标端口
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发布
通过Service访问应用 (2)的更多相关文章
- 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...
- k8s通过service访问pod(五)--技术流ken
service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...
- k8s Nodeport方式下service访问,iptables处理逻辑(转)
原文 https://www.myf5.net/post/2330.htm k8s Nodeport方式下service访问,iptables处理逻辑 2017年07月11日 0条评论 976次阅读 ...
- 通过 Service 访问 Pod
我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通过动态创建和销毁 Pod 来保 ...
- 通过Service访问应用 (1)
目录 通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用 通过之前的操作,应用部署完成了,我们的Demo网站已 ...
- linux运维、架构之路-K8s通过Service访问Pod
一.通过Service访问Pod 每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的I ...
- 通过 Service 访问 Pod【转】
本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...
- k8s通过service访问pod(五)
service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod ...
- k8s通过Service访问Pod
如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...
随机推荐
- 如何搭建环境---初识mybatis
一:mybatis概念1:简介 MyBatis本是apache的一个开源项目iBatis,2010年改名为 MyBatis, MyBatis 是一个基于Java的持久层框架.( ...
- RocketMQ中PullConsumer的消息拉取源码分析
在PullConsumer中,有关消息的拉取RocketMQ提供了很多API,但总的来说分为两种,同步消息拉取和异步消息拉取 同步消息拉取以同步方式拉取消息都是通过DefaultMQPullConsu ...
- (十二)c#Winform自定义控件-分页控件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- npm执行命令行报错
今天在学习react-router时候使用命令npm start 报了一个错误 npm ERR! missing script: start npm ERR! A complete log of th ...
- HBase的高可用(HA)
在公司写文档时候查到的一些资料,感觉对自己很有帮助,现在整理如下: 介绍 HBase是一个高可靠性.高性能.列存储.可伸缩.实时读写的分布式数据库系统,基于列的存储模式适合于存储非结构化数据. 适用场 ...
- 解决Mac下VSCode打开zsh乱码
1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码. iTerm2展示如下: VS ...
- 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)
</pre><pre name="code" class="cpp">/* Theme:八皇后(非递归) Coder:秒针的声音 Tim ...
- python 36 进程池、线程池
目录 1. 死锁与递归锁 2. 信号量Semaphor 3. GIL全局解释器锁:(Cpython) 4. IO.计算密集型对比 4.1 计算密集型: 4.2 IO密集型 5. GIL与Lock锁的区 ...
- 实战redhat6.5离线升级openssl&openssh
记录一次RedHat6.5升级openssl&openssh踩坑填坑.由于机房信息安全员用绿盟扫描出服务器openssh有8个重要的安全漏洞,最好的解决方式就是升级版本. 注意事项: 先升级o ...
- 各IDE代码自用开头模板
Pycharm #!/usr/bin/env python # -*- coding: utf-8 -*- # @version : 1.0 # @Time : ${DATE} ${TIME} # @ ...