k8s集群外访问集群内部服务的几种方式

2023-11-07

前言

       目前k8s+docker算是运维必修了,docker能让我们的环境一键迁移,k8s能自动编排,还能保证服务高可用,两者结合自然是无敌,那我们要不要使用k8s呢?这要根据自身情况,任何技术的使用,都需要根据具体情况来定,就像你要杀鸡,却非要选牛刀,牛刀是很锋利,但还不够你折腾的

       本文重点介绍k8s集群外如何访问集群内的服务,主要方式有:hostPort或hostNetwork、NodePort、Ingress

一、hostPort或hostNetwork

 hostPort和hostNetwork 放在首位是因为大家很容易忽略它们,它们也可让集群外访问集群内应用,用法:

  • hostNetwork

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      nodeSelector:      # node节点选择器
        role: master     # node节点标签(Label)
      hostNetwork: true  # 使用node节点网络
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 8080

重点在和containers平级的hostNetwork: true,表示pod使用宿主机网络,配合nodeSelector,把pod实例化在固定节点,如上,我给mater节点加上标签role: master,通过nodeSelector,nginx就会实例化在master节点,这样就可以通过master节点的ip和8080端口访问这个nginx了

  • hostPort
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      nodeSelector:      # node节点选择器
        role: master     # node节点标签(Label)
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 8080
          hostPort: 80                #重点

hostNetwork相比多了映射能力,可以把容器端口映射为node节点不同端口,hostPort,当然也需要nodeSelector来固定节点,不然每次创建,节点不同,ip也会改变

访问方式:nodeSelector所选节点ip:hostPort, 如上:role=Master标签节点Ip:80

二、NodePort

NodePort是最常见的提供集群外访问的方式之一,该方式使用Service提供集群外访问

 apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-pod-service
  labels:
    app: nginx                  #自身标签
spec:
  type: NodePort                # 类型ExternalName, ClusterIP, NodePort, and LoadBalancer
  ports:
  - port: 8080                 # service在k8s集群内服务端口
    targetPort: 8080           # 关联pod对外开放端口
    nodePort: 30088            # 集群外访问端口,端口范围【30000-32767】
  selector:
    app: nginx                 # pod标签
 

访问方式:集群内任意节点ip加nodePort所配端口号,如上:集群内任一节点ip:30088,即可访问nginx

三、Ingress

Ingress基本生产必备,可以简单理解为部署了一个nginx服务,该服务使用hostNetwork或hostPort方式提供集群外访问,再根据配置的路由规则,路由的集群内部各个service

  • Ingress安装

Ingress有各种实现版本,这里安装的为ingress-nginx,其yaml文件如下:ingress.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
 
---
 
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
 
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
 
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
 
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses/status
    verbs:
      - update
 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      # Defaults to "<election-id>-<ingress-class>"
      # Here: "<ingress-controller-leader>-<nginx>"
      # This has to be adapted if you change either parameter
      # when launching the nginx-ingress-controller.
      - "ingress-controller-leader-nginx"
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - get
 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx
 
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-nisa-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx
 
---
 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      nodeSelector:                  #注意修改自己nodeSelector
        role: master
      hostNetwork: true
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 101
            runAsUser: 101
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown
 
---
 
apiVersion: v1
kind: LimitRange
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  limits:
  - min:
      memory: 90Mi
      cpu: 100m
    type: Container
 
kubectl apply -f ingress.yaml

该yaml会创建ingress-nginx命名空间,待对应pod进入running状态,ingress服务就安装完成了

  • 配置ingress路由规则
 apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-pod-service
  labels:
    app: nginx                  #自身标签
spec:
  type: NodePort                # 类型ExternalName, ClusterIP, NodePort, and LoadBalancer
  ports:
  - port: 8080                 # service在k8s集群内服务端口
    targetPort: 8080           # 关联pod对外开放端口
  selector:
    app: nginx                 # pod标签
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  labels:
    app.kubernetes.io/version: v1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: nginx.test.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-pod-service     # 上面nginx Service配置的name
          servicePort: 8080                  #  Service配置的port

集群外配置好host

ingress服务部署节点的ip   nginx.test.com  

通过域名进行访问,且仅能通过域名

总结各方式利弊

hostPorthostNetwork直接使用节点网络,部署时节点需固定,访问ip也固定(也可以用host),端口为正常端口

nodeport方式部署时不要求固定节点,可通过集群内任一ip进行访问,就是端口为30000以上,很多时候由于公司安全策略导致不能访问

ingress需要额外安装ingress模块,配置路由规则,且仅能通过所配置域名访问,配置好域名后,可以直接对外提供服务,和传统的nginx作用类似

可根据各自情况灵活使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s集群外访问集群内部服务的几种方式 的相关文章

随机推荐

  • 类对象与初始化列表

    在类中定义的数据成员一般都是基本的数据类型 但是类中的成员也可以是对象 叫做对象成员 C 中对对象的初始化是非常重要的操作 当创建一个对象的时候 c 编译器必须确保调用了所有子对象的构造函数 如果所有的子对象有默认构造函数 编译器可以自动调
  • Linux systemd

    这里写目录标题 一 配置文件内容 二 配置文件位置 三 开机启动配置 四 systemctl使用 一 配置文件内容 systemd服务配置文件存放在 usr lib systemd目录下 有系统system和用户user之分 需要开机不登录
  • 自建XSS平台与BUUCTF[GWCTF 2019]mypassword

    自建XSS平台与BUUCTF GWCTF 2019 mypassword 1 需要用到的工具 BlueLotus XSSReceiver XSS数据接收平台firesunCN BlueLotus XSSReceiver github com
  • C++学习之模板特例化

    模板是C 中一个很重要的特性 写一份代码能用于多种数据类型 包括用户自定义类型 例如 STL的sort 函数可以用于多种数据类型的排序 类stack可以用作多种数据类型的栈 但是 如果我们想对特定的数据类型执行不同的代码 而不是通用模板 呢
  • 第二章 ZAB协议介绍

    第二章 ZAB协议介绍 ZAB ZooKeeper Atomic Broadcast ZooKeeper 原子消息广播协议 是zookeeper数据一致性的核心算法 ZAB 协议并不像 Paxos 算法那样 是一种通用的分布式一致性算法 它
  • https是如何保住信息安全的?

    https采用的是非对称加密以及对称加密混合的加密方式加密来保证用户安全的 他比http协议多了一层加密层 SSL TSL 要详细说明这个 我们要从不加密开始说起 如果不加密的话 浏览器和服务器的交流 很容易就会被第三方拦截 然后信息被偷看
  • iphone降级_iPhone完美降级已实现,checkm8实现降级iOS10.3.3

    前段时间苹果的A5 A11设备被爆出巨大硬件级漏洞 由一位信息安全人员axi0mX 在社交软件上分享了出来 原文翻译过来checkm8 漏洞是一个针对苹果历代产品不可修复的bootrom 嵌入处理器芯片内的一小块掩模ROM或写保护闪存 虽然
  • Yaoo Messenger For Vista发布了

    Yaoo Messenger For Vista发布了 下载地址 http messenger yahoo com download vista php 转载于 https www cnblogs com tangpepper archiv
  • 用 Go 语言实现视频处理服务:从 Java 到 Go 的完整指南

    本文将详细介绍如何使用 Go 语言开发视频处理服务 包括视频转码和拼接功能 我们将首先简要介绍 Go 语言的基本概念 然后通过对比 Java 和 Go 代码 详细介绍如何实现视频转码和拼接功能 并提供相应的代码示例 本教程旨在帮助 Java
  • springboot调用外部接口

    方式一 使用原始httpClient请求 description get方式获取入参 插入数据并发起流程 author lyx date 2022 8 24 16 05 params documentId return String Req
  • uos命令_研华IO卡之统信UOS+龙芯平台下的驱动丢失解决办法

    真是活久见了 在UOS 龙芯3A4000平台下安装好的驱动重启后居然不见了 经过两天的努力 总算把这个问题解决了 其实解决的思路很简单 就是在系统启动后自动执行安装脚本 但是问题总是层出不穷 常规标准的做法 比如在 etc profile
  • 【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附源码】

    Token令牌 生成工具 包括 头部 header 载荷 payload 签证 signature 先看效果 可以自定义加密盐 主要代码 TokenUtil java package com lgq common Util import c
  • 关于PermissionError: [WinError 5] 拒绝访问的解决方案

    在python使用pip命令安装各种package时 可能会发生下列现象 PermissionError WinError 5 拒绝访问 c program files python36 Lib site packages selenium
  • elasticsearch复合类型——数组类型新建,插入,查询

    多值字段 在一般开发情况下 我们想让某个字段包含多个字段 我们可以通过一个标签数组来代替单一字符串 tags boy monitor 对于数组不需要特殊的映射 任何一个字段可以包括零个 一个或者多个值 对于全文字段而言将被解析成多个词 数组
  • 前端单元测试、集成测试、UI测试

    一 单元测试 1 断言assert 业界流行的断言库 Chai Assertion Library 既有行为驱动开发 Behavior Driven Development 简写BDD 又有驱动测试开发 TDD
  • PHP中使用CURL实现请求

    PHP建立CURL请求的基本步骤 初始化 curl init 设置属性 curl setopt 有一长串cURL参数可供设置 它们能指定URL请求的各个细节 如果需要 可以设置 CURLOPT TIMEOUT 允许 CURL 函数执行的最长
  • winscp内网mysql_WinSCP和PuTTY在刷openwrt固件的使用教程

    WinSCP和PuTTY在刷openwrt固件的使用教程 openwrt必备工具 WinSCP和PuTTY的搭配与使用 PuTTY和WinSCP是管理OpenWRT固件的路由器必备工具 WinSCP的优势在于支持多语言 可在图形化界面下管理
  • ocGUI编写(1)--框架设计

    上面是我的微信和QQ群 欢迎新朋友的加入 最近入手一个开发板 上面有一个彩屏接口 考虑到方便自己平时的开发应用 准备做个简单的GUI库 要求不需要太高 基本的图形解码以及简单的GUI创建就行 程序接口定义三个文件 doc 包含一些文档介绍和
  • C:当strtok遇上连续分割符

    strtok在字符串处理上灵活高效 但分割字符的同时也更改了输入字符串 即在分割符处更改为 0 这样 对于连续分割符的字符串 就显得无能为力了 最近在做一个物联网项目时 正好碰到需要处理类似的字符串 如 PARAMS 0 2 domain
  • k8s集群外访问集群内部服务的几种方式

    前言 目前k8s docker算是运维必修了 docker能让我们的环境一键迁移 k8s能自动编排 还能保证服务高可用 两者结合自然是无敌 那我们要不要使用k8s呢 这要根据自身情况 任何技术的使用 都需要根据具体情况来定 就像你要杀鸡 却