首页 > 其他分享 >Kubernetes(三) 如何从外部访问服务

Kubernetes(三) 如何从外部访问服务

时间:2022-12-24 23:55:24浏览次数:66  
标签:Ingress LB Kubernetes 外部 端口 访问 复制 test k8s

Kubernetes教程之对外暴露服务

文章地址: blog.piaoruiqing.com/2019/10/20/…

前言

通过前文的讲解,《跟着官方文档从零搭建K8S》《应用部署》相信读者已经对Kubernetes安装及部署应用有了一定的了解. 接下来, 本文将针对如何将服务暴露给外部进行讲解.

阅读这篇文章你能收获到:

  • 了解Kubernetes暴露服务的几种方案及其优缺点.

阅读本文你需要:

  • 了解基本的Kubernetes命令.
  • 有一个Kubernetes环境

将服务暴露给外部客户端的几种方式

  • 通过port-forward转发, 这种方式在之前的文章中有提到过, 操作方便、适合调试时使用, 不适用于生产环境.
  • 通过NodePort, 此时集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护.
  • 通过LoadBalance来暴露服务. LoadBalance(负载均衡 LB)通常由云服务商提供, 如果云环境中不提供LB服务, 我们通常直接使用Ingress, 或使用MetalLB来自行配置LB.
  • 通过Ingress公开多个服务. Ingress公开了从群集外部到群集内 services 的HTTP和HTTPS路由. 流量路由由Ingress资源上定义的规则控制. 在云服务商不提供LB服务的情况下, 我们可以直接使用Ingress来暴露服务. (另外, 使用LB + Ingress的部署方案可以避免过多LB应用带来的花费).

准备

在开始之前, 笔者已经创建好了测试应用, 代码过长此处略去, 详见附录[1]附录[2]

我们通过kubectl get pods查看pod列表.

指的一提的是, 我们可以通过--namespace参数查看指定命名空间的pod列表, 也可以通过--all-namespaces来查看全部命名空间的pod列表.

由于没有指定命名空间,所以应用被放到default中了.

[root@nas-centos1 k8s-test]# kubectl get pods --namespace default
NAME                        READY   STATUS    RESTARTS   AGE
k8s-test-578b77cd47-sw5pd   1/1     Running   0          6m29s
k8s-test-578b77cd47-v6kmp   1/1     Running   0          6m29s
复制代码

port-forward

port-forward这种方式访问pod, 可以指定pod实例, 简单方便, 很适合调试之用.

通过kubectl port-forward来配置转发:

[root@nas-centos1 k8s-test]# kubectl port-forward --address 0.0.0.0 k8s-test-578b77cd47-sw5pd 9999:8080
Forwarding from 0.0.0.0:9999 -> 8080
复制代码

此时, 我们可以通过通过访问宿主机的9999端口来访问到k8s-test-578b77cd47-sw5pd8080端口.

/k8s-test/timestamp是该示例应用唯一一个api, 用于获取当前时间戳

[root@nas-centos1 k8s-test]# curl http://10.33.30.95:9999/k8s-test/timestamp
1571151584224
复制代码
[版权声明]
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: [email protected].

NodePort

集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护.

参考文档: kubernetes.io/docs/concep…

创建一个Service, 并指定其类型为NodePort.

k8s-test-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80			# 服务端口, 内部可访问
      targetPort: 8080		# 目标端口, 此处指的是pod的8080端口
      nodePort: 30080		# 节点端口, 外部可访问
      protocol: TCP
  type: NodePort
复制代码

执行kubectl apply -f k8s-test-service.yaml发布这个Service.

通过kubectl get services可查看Service列表如下:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   NodePort    10.244.234.143   <none>        80:30080/TCP   8s
kubernetes         ClusterIP   10.244.0.1       <none>        443/TCP        32d
复制代码

我们可以看到, 30080端口已经被绑定到该服务的80端口.

尝试通过node节点来访问应用:

[root@nas-centos3 ~]# curl http://10.33.30.94:30080/k8s-test/timestamp
1571152525336
复制代码

LoadBalance

参考文档:

  1. metallb.universe.tf/
  2. kubernetes.io/docs/concep…

LoadBalance(负载均衡 LB)通常由云服务商提供. 如果环境不支持LB, 那么创建的LoadBalance将始终处于<pending>状态:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.29.126   <pending>     80:32681/TCP   13s
kubernetes         ClusterIP      10.244.0.1      <none>        443/TCP        33d
复制代码

如果想要在本地开发环境测试LB, 我们可以选择MetalLB. 它是一个负载均衡实现. 安装方式此处不进行展开, 可参考官方文档

当我们的环境支持LB时, 我们可以创建如下Service, 来暴露服务:

apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80	        # 服务端口
      targetPort: 8080	# 目标端口, 此处指的是pod的8080端口
      protocol: TCP
  type: LoadBalancer
复制代码

执行kubectl apply -f k8s-test-lb.yaml命令发布配置. 此时可以查看到Service已经有了EXTERNAL-IP(10.33.30.2). 如下:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.151.128   10.33.30.2    80:31277/TCP   2s
kubernetes         ClusterIP      10.244.0.1       <none>        443/TCP        33d
复制代码

尝试通过LB的IP来访问应用, 如下:

[root@nas-centos1 k8s-test]# curl http://10.33.30.2/k8s-test/timestamp
1571235898264
复制代码

Ingress

Ingress公开了从群集外部到群集内 services 的HTTP和HTTPS路由. 流量路由由Ingress资源上定义的规则控制.

参考文档: kubernetes.github.io/ingress-ngi…

我们使用ingress controller的nginx实现来进行测试. 首先下载部署文件:

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
复制代码

编辑文件vim mandatory.yaml, 加入以下内容:

template:
  spec:
    hostNetwork: true
复制代码
  • hostNetwork: 开启hostNetwork, 可以使ingress绑定到主机的80和443端口.

  • 访问ingress有多种方式, (1). 通过hostNetwork直接绑定到80和443端口, (2). 通过NodePort在Node上暴露端口(但这种方式只能绑定固定范围的端口, 默认值 30000-32767), (3). 通过LoadBalance, 这种方式和NodePort其实都是通过Service来暴露, 只不过是Service的不同类型.

  • mandatory.yaml中template只有一个, 很好找. (tips: 在vim中可以用/进行查找).

  • Ingress Controller: 是一个反向代理程序, 它负责解析 Ingress 的反向代理规则.

  • Ingress: Ingress 是反向代理规则. 不要混淆Ingress ControllerIngress的概念.

发布完成后, 我们创建一个Ingress来测试, 内容如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /k8s-test
spec:
  rules:
    - http:
        paths:
          - path: /k8s-test
            backend:
              serviceName: k8s-test-service
              servicePort: 80
复制代码

尝试访问:

[root@nas-centos1 ingress]# curl http://10.33.30.94/k8s-test/timestamp
1571321623058
复制代码

小结

通常地, 我们会考虑 LoadBalanceIngress配合使用. 一方面是只是用LB会产生大量的花费, 另一方面大量的LB同样会提高维护成本. 而LB配合Ingress使用, 通过不同的path来区分服务能达到很棒的效果. (这里和通过Nginx来暴露多个服务的原理基本相同)

如果这篇文章对您有帮助,请点个赞吧 ( ̄▽ ̄)"

参考文献

附录

[1] Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-test
  labels:
    app: k8s-test
spec:
  replicas: 2
  template:
    metadata:
      name: k8s-test
      labels:
        app: k8s-test
        env: test
    spec:
      containers:
        - name: k8s-test
          image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - name: http-port
              containerPort: 8080
      imagePullSecrets:
        - name: docker-registry-secret
      restartPolicy: Always
  selector:
    matchLabels:
      app: k8s-test
复制代码

[2] K8sTestApplication.java

/**
 * @author piaoruiqing
 * @description: k8s test
 * @date: 2019/09/22 10:01
 * @since JDK 1.8
 */
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
    /**
     * get timestamp
     * @return
     */
    @GetMapping(value = "/timestamp")
    public ResponseEntity<?> getTimestamp() {
        return ResponseEntity.ok(System.currentTimeMillis() + "\n");
    }
  
    public static void main(String[] args) {
        SpringApplication.run(K8sTestApplication.class, args);
    }
}
复制代码

系列文章

欢迎关注公众号(代码如诗):

[版权声明]
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: [email protected]. 来源:https://juejin.cn/post/6844903974206701575

标签:Ingress,LB,Kubernetes,外部,端口,访问,复制,test,k8s
From: https://www.cnblogs.com/konglxblog/p/17003567.html

相关文章

  • Kubernetes-集群ETCD故障排查
    前言记录一次本地虚拟机Kubernetes集群排障过程。修复内容包括:1、Kubernetes证书过期,2、ETCD数据损坏发现问题[root@xuegod63~]#kubectlgetnodesTheconnectiontothe......
  • Microsoft Azure 解决方案:如何提升Azure AD全局管理员的访问权限
    51CTO博客地址:​ ​​​​https://blog.51cto.com/14669127​​Azure培训视频地址:​ ​​​https://space.bilibili.com/2000820534​​我们都知道一些Azure虚拟桌面过......
  • Kubernetes(k8s) kubectl taint常用命令
    kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。本文主要介绍K......
  • Docker和Kubernetes网络模型
    Docker网络模型Bridge模式(默认)Docker程序启动后会创建一个bridge0网桥,并分配一个IP,可以想象成一个虚拟的交换机,创建的容器实例都会通过虚拟网卡vethpair设备连接到这个......
  • 远程访问Jupyter配置
    生成配置文件$jupyternotebook--generate-config会返回一个存放jupyter_notebook_config.py的路径生成密码打开ipython,创建一个密文的密码:[root@datanode1~]#ip......
  • nginx 禁止外国ip地址访问同时放行内网ip
    前言处于安全性考虑,网站需要屏蔽国外IP的访问,仅开放内网和国内网络访问。nginx原来的geo模块ngx_http_geoip已经因为太老而被抛弃了,官方也停止了数据库的维护和更新,推荐......
  • requests访问https页面
     requests访问http很简单,但访问https页面时,需要设置是否验证服务器等情况。当验证服务器时需要指定根证书路径进行访问,不验证证书访问时会返回证书验证警告。 访问......
  • Kubernetes-部署WordPress
    回顾Kubernetes把集群里的计算资源定义为节点(Node),其中又划分成控制面和数据面两类。控制面是Master节点,负责管理集群和运维监控应用,里面的核心组件是apiserver、etcd、s......
  • Kubernetes-ConfigMap/Secret
    想让业务更顺利地运行,有一个问题不容忽视,那就是应用的配置管理。Kubernetes里专门用来管理配置信息的两种对象:ConfigMap和Secret,使用它们来灵活地配置、定制我们的应用。C......
  • 访问者模式(一)
    在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。 //Product.javapackagetest25;publicinterfaceProduct{voidaccept(......