美文网首页
Service暴露的两种方式

Service暴露的两种方式

作者: 毛毛的学习笔记 | 来源:发表于2022-10-31 22:27 被阅读0次

    @[toc]

    一、前言

    kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一个稳定的IP,给集群外访问。

    本文所需要的 ingress-controller 的 mandatory.yaml 文件https://www.syjshare.com/res/6BFS49US

    本文所有涉及的Service的两种部署方式(NodePort和ClusterIP) yaml 文件https://www.syjshare.com/res/ZLYV4RE7

    Service暴露服务的方式一共有四种,如下:

    ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。

    NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

    LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

    ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

    其中,最常见的两种是 ClusterIP 和 NodePort ,本文实践这种两种方式。

    二、NodePort

    2.1 新建命名空间

    当我们需要开始做一件事情的时候,最好重新建一个命名空间,这样不干扰之前的,如下:

    image.png

    2.2 切换命名空间

    # 切换命名空间
    kubectl config set-context $(kubectl config current-context) --namespace=myns
    
    image.png

    2.3 新建Pod和Service并测试

    Service

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whoami-deployment
      labels:
        app: whoami
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: whoami
      template:
        metadata:
          labels:
            app: whoami
        spec:
          containers:
          - name: whoami
            image: jwilder/whoami
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whoami-service
    spec:
      ports:
      - port: 81   # 默认就是访问80端口 curl serviceIp 就好
        protocol: TCP
        targetPort: 8000  # 映射到targetPort为8000 就是上面pod那个 
      selector:
        app: whoami   # selector 匹配上模板上的 label
    

    要搞清楚pod-service的关联关系
    pod使用的是jwilder/whoami镜像,这个是公开的镜像,没问题
    pod和service通过 label-selector 关联起来,pod中定义 app: whoami 这个标签 ,然后servie中通过 selector: app: whoami 这个选择器找到这个标签,selector-label 标签选择器绑定完成之后,就是端口绑定,然后 service 使用的是 80 端口映射到所绑定的pod的8000的端口,就是访问 service 的 80 端口,就是访问 pod 的 8000 端口。

    要搞清楚pod的ip地址 service的ip地址 宿主机的ip地址的关联关系

    集群内端口 集群内ip 外网ip 外网port
    pod ports: - containerPort: 8000 指定(只能集群内访问) 自动分配(只能集群内访问)
    service ports:- port: 80 指定(只能集群内访问) 其中的 targetPort: 8000 映射到pod 自动分配(只能集群内访问) 宿主机静态IP 自动分配30000以上
    image.png
    image.png
    image.png image.png
    image.png

    三、Ingress

    3.1 总述

    ingress 和 ingress-controller 是两个不同东西,是两个不同的配置文件
    ingress -> ingress-controller -> service -> pod

    image.png

    3.2 实践

    3.2.1 新建ingressController

    kubectl label node m name=ingress   
    kubectl apply -f mandatory.yaml  
    kubectl get all -n ingress-nginx
    
    image.png

    mandatory.yaml 这个yaml文件太大了,不好放在博客里面,读者可以从 https://www.syjshare.com/res/6BFS49US 下载获得。
    另外,注意这个 ingress-controller 使用HostPort方式运行 ,所以 mandatory.yaml 文件中有 hostNetwork: true 这句。

    3.2.2 创建tomcat的pod和service

    创建tomcat的pod和service

    vi tomcat.yaml
    kubectl apply -f tomcat.yaml
    kubectl get svc 
    kubectl get pods
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tomcat-deployment
      labels:
        app: tomcat
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tomcat
      template:
        metadata:
          labels:
            app: tomcat
        spec:
          containers:
          - name: tomcat
            image: tomcat
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat-service
    spec:
      ports:
      - port: 80   
        protocol: TCP
        targetPort: 8080
      selector:
        app: tomcat
    
    image.png

    3.2.3 创建Ingress以及定义转发规则

    创建Ingress以及定义转发规则

    kubectl apply -f nginx-ingress.yaml
    kubectl get ingress
    kubectl describe ingress nginx-ingress
    
    #ingress   这个就是extensions/v1beta1,不要修改 
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-ingress
    spec:
      rules:
      - host: tomcat.jack.com
        http:
          paths:
          - path: /
            backend:
              serviceName: tomcat-service
              servicePort: 80
    
    image.png image.png

    3.2.4 测试

    image.png

    chrome浏览器访问这个就好了


    image.png

    3.2.5 再搞一个测试

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whoami-deployment
      labels:
        app: whoami
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: whoami
      template:
        metadata:
          labels:
            app: whoami
        spec:
          containers:
          - name: whoami
            image: jwilder/whoami
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whoami-service
    spec:
      ports:
      - port: 81   # 默认就是访问80端口 curl serviceIp 就好
        protocol: TCP
        targetPort: 8000  # 映射到targetPort为8000 就是上面pod那个 
      selector:
        app: whoami   # selector 匹配上模板上的 label
    
    image.png image.png

    成功


    image.png

    四、尾声

    Service暴露的两种方式,完成了。

    ClusterIP 直译就是集群内ip,所以就是 不暴露外部端口,是默认方式;
    NodePort 直译就是节点端口,所以就是 虚拟机/宿主机的端口,就是暴露外部端口。
    一般来说,Cluster IP是默认的服务类型,所以使用这种更好,但是比较复杂,需要配置 ingress 和 ingress-controlller ,将 ingress 作为入口。

    天天打码,天天进步!!

    相关文章

      网友评论

          本文标题:Service暴露的两种方式

          本文链接:https://www.haomeiwen.com/subject/axgltdtx.html