深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22715 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

38 | 从外界连通Service与Service调试“三板斧”

张磊 2018-11-19
你好,我是张磊。今天我和你分享的主题是:从外界连通 Service 与 Service 调试“三板斧”。
在上一篇文章中,我为你介绍了 Service 机制的工作原理。通过这些讲解,你应该能够明白这样一个事实:Service 的访问信息在 Kubernetes 集群之外,其实是无效的。
这其实也容易理解:所谓 Service 的访问入口,其实就是每台宿主机上由 kube-proxy 生成的 iptables 规则,以及 kube-dns 生成的 DNS 记录。而一旦离开了这个集群,这些信息对用户来说,也就自然没有作用了。
所以,在使用 Kubernetes 的 Service 时,一个必须要面对和解决的问题就是:如何从外部(Kubernetes 集群之外),访问到 Kubernetes 里创建的 Service?
这里最常用的一种方式就是:NodePort。我来为你举个例子。
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
- nodePort: 8080
targetPort: 80
protocol: TCP
name: http
- nodePort: 443
protocol: TCP
name: https
selector:
run: my-nginx
在这个 Service 的定义里,我们声明它的类型是,type=NodePort。然后,我在 ports 字段里声明了 Service 的 8080 端口代理 Pod 的 80 端口,Service 的 443 端口代理 Pod 的 443 端口。
当然,如果你不显式地声明 nodePort 字段,Kubernetes 就会为你分配随机的可用端口来设置代理。这个端口的范围默认是 30000-32767,你可以通过 kube-apiserver 的–service-node-port-range 参数来修改它。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • mazhen
    对ExternalName的作用没太理解。
    访问my-service.default.svc.cluster.local被替换为my.database.example.com,这和我从外部访问到 Kubernetes 里的服务有什么关系?
    感觉这更像是从Kubernetes内访问外部资源的方法。
    2018-11-19
    1
    11
  • 王天明
    终于算是清楚了,在nodePort模式下,关于端口的有三个参数,port, nodePort, targetPort。
    如果如下定义,(请张老师指出是否有理解偏差)
    spec:
      type: NodePort
      ports:
        - name: http
          port: 8080
          nodePort: 30080
          targetPort: 80
          protocol: TCP

    则svc信息如下,(注意下面无targetPort信息,只是ClustorPort与NodePort,注意后者为Nodeport)
    ingress-nginx ingress-nginx NodePort 10.105.192.34 <none> 8080:30080/TCP,8443:30443/TCP 28m

    则可访问的组合为
    1. clusterIP + port: 10.105.192.34:8080
    2. 内网IP/公网ip + nodePort: 172.31.14.16:30080。(172.31.14.16我的aws局域网ip.)

    30080为nodePort也可以在iptables-save中映证。
    还有,就是port参数是必要指定的,nodePort即使是显式指定,也必须是在指定范围内。

    (在三板斧中也问过张老师如何使用nodePort打通外网的问题,一并谢谢了)

    作者回复: 对

    2018-11-24
    8
  • LEON
    在我们通过 kubeadm 部署的集群里,你应该看到 kube-proxy 输出的日志如下所示:—输出日志的命令是什么?
    2018-11-19
    1
    2
  • Chenl07
    老师,我创建一个externalip的service后,对应的service端口为30100,externalip是一个VIP,实际指向集群中某两个节点。创建后,集群中任意节点上都没有侦听这个端口(netstat grep),那通过我的VIP,怎么能访问到30100这个端口了?
    2019-01-13
    1
    1
  • 勤劳的小胖子-libo
    请问一下什么应用场景下:“还有一种典型问题,就是 Pod 没办法通过 Service 访问自己?”
    为什么要访问自己?
    2018-11-22
    1
  • 勤劳的小胖子-libo
    写了一个简单的nodeport,可以访问上一节的hostname deployment.
    apiVersion: v1
    kind: Service
    metadata:
      name: hostnames
      labels:
        app: hostnames
    spec:
      type: NodePort
      selector:
        app: hostnames
      ports:
      - nodePort: 30225
        port: 80
        targetPort: 9376
        protocol: TCP
        name: http


    通过curl <任意Node>:30225可以访问。
    vagrant@kubeadm1:~/37ServiceDns$ curl 192.168.0.24:30225
    hostnames-84985c9fdd-sgwpp

    另外感觉我这边的输出关于kube-proxy:
    vagrant@kubeadm1:~/37ServiceDns$ kubectl logs -n kube-system kube-proxy-pscvh
    W1122 10:13:18.794590 1 server_others.go:295] Flag proxy-mode="" unknown, assuming iptables proxy
    I1122 10:13:18.817014 1 server_others.go:148] Using iptables Proxier.
    I1122 10:13:18.817394 1 server_others.go:178] Tearing down inactive rules.
    E1122 10:13:18.874465 1 proxier.go:532] Error removing iptables rules in ipvs proxier: error deleting chain "KUBE-MARK-MASQ": exit status 1: iptables: Too many links.
    I1122 10:13:18.894045 1 server.go:447] Version: v1.12.2

    后面信息都是正常的。不知道上面这些信息可以ignore吗?
    2018-11-22
    1
  • LEON
    而如果你的 Service 没办法通过 ClusterIP 访问到的时候,你首先应该检查的是这个 Service 是否有 Endpoints:———请问老师service ip与cluster ip有什么区别?为什么这块不直接是service ip?
    2018-11-19
    1
  • nodePort下必须要指定Service的port,我用的v1.14,可能检查的更严格了。
    2019-11-06
  • 随欲而安
    对ExternalName的作用没太理解,老师能解释一下么
    2019-06-17
  • zfei
    老师,你好,使用NodePort类型的Service,会创建 -A KUBE-NODEPORTS 类的 iptables规则及 SNAT规则,如果kube-proxy使用的是 ipvs模式,也同样会创建这两个规则吗

    作者回复: 对的

    2019-04-13
  • 程序修行
    一个有趣的问题,我每次从外部浏览器访问一个nodeport类型的service,在抓取访问客户端的源IP(source IP)的时候,总是抓取到10.1.0.0这样的pod的内部IP,而不是我本机的9.x.x.x这样的真实的我的IP。
    2019-02-15
  • 王天明
    张老师,我在使用NodePort暴露外网访问一直不成功,无论是公网IP还是局域网IP但不成功,只能使用ClusterIP+NodePort访问。查看events也都正常,只几节课里使用NodePort都有类似的问题。是我理解哪里存在偏差吗?

    作者回复: 你这主机是不是有防火墙?

    2018-11-23
  • foghost
    请教张老师,我在几个不同环境中实验ipvs模式下externalTrafficPolicy=local策略时发现,这个策略在ipvs模式下并不会只转发到本机pod,而是依然转发到了其他机器上到pod,ipvs 规则中hostname -i 对应的规则下有其他机器的pod,查了很多资料都没有结果,我在想这是不是k8s ipvs模式的bug,还请张老师解惑
    2018-11-22
  • Len
    因为 kubernetes 维护着 externalIPs IP + PORT 到具体服务的 endpoints 路由规则。
    2018-11-21
  • 虎虎❤️
    思考题 pod的external ip 应该是通过iptables进行配置。可能是一个虚拟ip,在网络中没有对应的设备。所以,必须有路由规则支持。否则客户端可能没办法找到该ip的路径,得到目的网络不可达的回复。
    2018-11-21
  • ingress 做转发也行 作者能讲解一下吗?
    2018-11-20
  • Gray13
    第一时间提示更新了 噢耶 小板凳坐前排
    2018-11-19
  • 余功鹏
    Ingress这个不介绍吗?
    2018-11-19
  • fox
    赞!
    老师我遇到一个实操的问题:
    一个service 后端有3个pod 组成的endpoints, 我通过(任何一台node)的nodeport 进行连续访问, 我观察到的现象是: 3个pod 收到的请求并不非常随机, 而是一段时间(比如连续几十次请求)落到podA, 然后又连续几十次落到podB, 总体上是随机均分, 但是在短时间内(持续几十秒或者几十次请求)并不是.
    service并没有开启会话粘滞, 使用外部IP/LB 访问也有类似现象.
    现象看上去是有根据clientIP做了会话粘滞, 但是不知道是哪个环节做的, 是iptables吗?
    2018-11-19
  • arlose
    老师,我这边有3台机器,在不同的局域网,然后一台作为master节点,然后kube init以后,生成的join语句的ip是内网ip,我另外两台机器想加入集群个怎么操作?
    2018-11-19
收起评论
23
返回
顶部