每天5分钟玩转Kubernetes | 外网如何访问Service

书籍来源:cloudman《每天5分钟玩转Kubernetes》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:每天5分钟玩转Kubernetes | 汇总_COCOgsta的博客-CSDN博客


除了Cluster内部可以访问Service,很多情况下我们也希望应用的Service能够暴露给Cluster外部。Kubernetes提供了多种类型的 Service,默认是ClusterIP。

(1)ClusterIP

Service通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问,这是默认的Service类型,前面实验中的Service都是ClusterIP。

(2)NodePort

Service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过<NodeIP>:<NodePort>访问Service。

(3)LoadBalancer

Service利用cloud provider特有的load balancer对外提供服务,cloud provider负责将load balancer的流量导向Service。目前支持的cloud provider有GCP、AWS、Azur等。

下面我们来实践NodePort,Service httpd-svc的配置文件修改如下所示。

[root@k8s-master ~]# cat httpd-svc.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      run: httpd
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
spec:
  type: NodePort
  selector:
    run: httpd
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
[root@k8s-master ~]# 

添加type: NodePort,重新创建httpd-svc,如图所示。

Kubernetes依然会为httpd-svc分配一个ClusterIP,不同的是:

(1)EXTERNAL-IP为none。

(2)PORT(S)为8080:30439。8080是ClusterIP监听的端口, 30439则是节点上监听的端口。Kubernetes会从30000~32767中分配一 个可用的端口,每个节点都会监听此端口并将请求转发给Service,如图所示。

下面测试NodePort是否正常工作,如图所示。

通过三个节点IP+32312端口都能够访问httpd-svc。

接下来我们深入探讨一个问题:Kubernetes是如何将<NodeIP>:<NodePort>映射到Pod的呢?

与ClusterIP一样,也是借助了iptables。与ClusterIP相比,每个节点的iptables中都增加了下面两条规则,如图所示。

规则的含义是:访问当前节点30439端口的请求会应用规则KUBE-SVC-RL3JAE4GN7VOGDGP,内容如图所示。

其作用就是负载均衡到每一个Pod。

NodePort默认的是随机选择,不过我们可以用nodePort指定某个特定端口,如下所示。

[root@k8s-master ~]# cat httpd-svc.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      run: httpd
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
spec:
  type: NodePort
  selector:
    run: httpd
  ports:
  - protocol: TCP
    nodePort: 30000
    port: 8080
    targetPort: 80
[root@k8s-master ~]# 

现在配置文件中就有三个Port了:

  • nodePort是节点上监听的端口。
  • port是ClusterIP上监听的端口。
  • targetPort是Pod监听的端口。

最终,Node和ClusterIP在各自端口上接收到的请求都会通过iptables转发到Pod的targetPort。

应用新的nodePort并验证,如图所示。

nodePort: 30000已经生效了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值