Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

20|Service:微服务架构的应对之道

你好,我是 Chrono。
在前面的课里我们学习了 Deployment 和 DaemonSet 这两个 API 对象,它们都是在线业务,只是以不同的策略部署应用,Deployment 创建任意多个实例,Daemon 为每个节点创建一个实例。
这两个 API 对象可以部署多种形式的应用,而在云原生时代,微服务无疑是应用的主流形态。为了更好地支持微服务以及服务网格这样的应用架构,Kubernetes 又专门定义了一个新的对象:Service,它是集群内部的负载均衡机制,用来解决服务发现的关键问题。
今天我们就来看看什么是 Service、如何使用 YAML 来定义 Service,以及如何在 Kubernetes 里用好 Service。

为什么要有 Service

有了 Deployment 和 DaemonSet,我们在集群里发布应用程序的工作轻松了很多。借助 Kubernetes 强大的自动化运维能力,我们可以把应用的更新上线频率由以前的月、周级别提升到天、小时级别,让服务质量更上一层楼。
不过,在应用程序快速版本迭代的同时,另一个问题也逐渐显现出来了,就是“服务发现”。
在 Kubernetes 集群里 Pod 的生命周期是比较“短暂”的,虽然 Deployment 和 DaemonSet 可以维持 Pod 总体数量的稳定,但在运行过程中,难免会有 Pod 销毁又重建,这就会导致 Pod 集合处于动态的变化之中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中的Service对象在微服务架构中扮演着关键角色,实现了负载均衡和服务发现技术。本文详细介绍了Service的工作原理和使用方法,强调了其简单定义和与Pod的关联关系。通过创建ConfigMap和对Deployment的改造,展示了如何使用`kubectl apply`命令创建Service对象,并演示了Service的负载均衡效果和自动化服务发现。此外,文章还介绍了如何以域名方式使用Service,以及如何让Service对外暴露服务,特别是NodePort类型的Service。通过DNS域名和NodePort类型的Service,读者可以更方便地访问和管理后端服务。总的来说,本文通过清晰的语言和实际操作示例,帮助读者快速了解了Service在Kubernetes中的作用和使用方法,为微服务架构的实践提供了有益的指导。文章还提出了两个思考题,引发读者深入思考和讨论。通过本文,读者能够全面了解Service对象的重要性和应用价值,为其在实际应用中提供了指导和启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(51)

  • 最新
  • 精选
  • 西门吹牛
    Service 的 IP 是 vip,其实就是保证外部请求的ip不变,不会因为节点变动,而 ip 跟着动,和 lvs + nginx 部署高可用集群一样,主要保证高可用。方便。 负载均衡算法,Service 会用哪种呢? 轮询,加权轮询,随机,针对有状态的一致性hash,还有针对最少活跃调用数的。 最好的负载均衡是自适应负载均衡,可以动态的监控收集服务的状态,各种指标进行加权计算,从中选出个最合适的。 感觉,service 应该是自适应,都有能力自动编排了,对于一些服务状态的数据指标,收集应该问题不大

    作者回复: 说的很好。 Service的负载均衡能力比较弱,只支持最简单的round-robin。

    2022-08-05归属地:北京
    2
    28
  • 郑海成
    Q1: svc是基于内核的netfilter技术实现的,在用户态通过iptable和ipvs应用hook链和表,所以它的IP注定是虚拟的,至于静态考虑则是为暴露的服务提供相对稳定性能的dns解析 Q2: 负载均衡技术分为DNS、四层和七层,dns也是一种简单的负载均衡只是算法很简单随机;四层负载均衡主要有nat、IP隧道等,主要是做一些IP和端口的变换,算法也不多比如rr,七层负载均衡则是基于http header来做负载算法很多,可以做一些流量控制;其次还有在客户端做负载均衡比如nacos、istio等

    作者回复: great

    2022-08-08归属地:上海
    17
  • dao
    前几节课多节点集群看起来一切正常,但本节的 dns 测试一直无法通过。周末搞了两天,最终发现是 virtualbox 两张网卡的坑。首先是集群节点的 kubelet 配置需要分别指定 `KUBELET_EXTRA_ARGS="--node-ip=192.168.56.x"`;然后时安装 flannel 需要指定 `--iface=enp0s3`,这张网卡应该时前面的 node-ip 对应的网卡。

    作者回复: great,两张网卡确实会遇到一些问题,感谢经验分享。

    2022-08-14归属地:北京
    5
    15
  • YueShi
    各位大佬们,如果有用虚拟机的,使用挂起再恢复的,建议每次遇到问题先重启虚拟机,踩了很多次这种挂起再恢复导致的网络问题的坑了

    作者回复: 是的,Kubernetes感觉比较娇贵,不那么皮实,重启可以解决很多问题。

    2022-08-05归属地:上海
    11
  • ppd0705
    不知道有没有同样遇到 dns 无法解析域名的同学,重启coredns试试: kubectl -n kube-system rollout restart deployment coredns

    作者回复: 有的时候这些pod会有问题,用describe或者logs看看,有问题就重启。

    2022-08-06归属地:上海
    6
    8
  • 朱雯
    nginx负载均衡是可以设置策略的,权重之类的,svc和nodeport是怎么设置这方面的信息呢

    作者回复: 因为Kubernetes是基础设施,高级的负载均衡策略属于应用层次,Kubernetes来做这个就属于越位了。

    2022-08-18归属地:北京
    5
  • zero
    不知道有没有同样遇到 dns 无法解析域名的同学,可能你不能访问的原因是你网络插件Flannel的问题,我自己的虚拟机双网卡,需要在kube-flannel.yml上面指定你的网卡 args: - --ip-masq - --kube-subnet-mgr - --iface=enp0s3 // 这里替换成自己的网卡

    作者回复: great! 我的电脑是m1的,对virtualbox用的不多,可能有的问题没有遇到,感谢经验分享。

    2023-01-08归属地:北京
    2
    4
  • 龙之大者
    进入pod后,如果curl ngx-svc出现Could not resolve hostnames报错,可以重启coredns deployment kubectl -n kube-system rollout restart deployment coredns https://stackoverflow.com/questions/45805483/kubernetes-pods-cant-resolve-hostnames

    作者回复: 是的,Kubernetes里的组件也不会总是运行正常的,发现有问题就可以简单地重启解决。

    2022-08-24归属地:北京
    5
    4
  • 大毛
    对于使用 virtualBox 搭建环境,无法使用 DNS 和 exec 进入容器内部的同学,这里有我解决问题的方法,可以尝试参考一下。 问题的原因是,virtualBox 给每个虚拟机默认一个 NAT 的网口,这个网口的 IP 是 virtualBox 自动分配的,且所有的地址都是 10.0.2.15,这个所有节点都相同的 IP 显然会对 kubernetes 造成困扰。解决问题的办法很简单,只要指定 kubelet 使用其他网口即可(网口通常使用的是 192.168 开头的你的路由器的 IP),具体方法是在 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf(我使用的是 ubuntu 系统,其他系统可能是其他路径)文件中添加如下代码 Environment="KUBELET_EXTRA_ARGS=--node-ip=xxx.xxx.xxx.xxx" ,其中 xxx 就是你虚拟机分配的 IP 地址。修改完成后使用 sudo systemctl daemon-reload 和 sudo systemctl restart kubelet.service 重启 kubelet。然后使用 kubectl get nodes -o wide 查看节点的 IP 是否变更 通常到这里问题就可以解决了,如果你发现依然有问题(使用 kubectl get pod -n kube-system -o wide 看是否有 pod 没有 running),可能要重新安装 flannel 插件。具体情况请问 GPT。

    作者回复: awesome!

    2023-06-12归属地:北京
    2
    3
  • alexgreenbar
    NodePort 设置后,得注意可以通过curl集群的节点来访问服务,但这里面不包括master节点

    作者回复: 一般master节点不会调度运行Pod,如果去掉污点就可以了,可以参考一下DaemonSet。

    2022-09-26归属地:北京
    5
    3
收起评论
显示
设置
留言
51
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部