Kubernetes--服务发布(Service、Ingress)

news2024/11/14 18:43:33

 前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 

出自B站博主教程笔记: 

完整版Kubernetes(K8S)全套入门+微服务实战项目,带你一站式深入掌握K8S核心能力_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1MT411x7GH/?spm_id_from=333.337.search-card.all.click

服务发布

service与ingress的关系图

一、Service

负责东西流量(同层级/内部服务网络通信)的通信 ,Service如何把我们的容器在网络内部打通如下:

所有的请求其实都在请求api-server,而api-server会根据我们的IP找到对应的service,service就会找到自己的Endpoint,然后通过endpoint的iptables的转发找到对应的目标服务器,然后通过目标服务器找到对应的容器。

1、Service的定义

 apiVersion: v1
 kind: Service       # 资源类型为 Service
 metadata:       
   name: nginx-svc   # Service 名称
   labels:
     app: nginx-svc  # Service 自己本身的标签
 spec:
   ports:            # 端口映射  
   - name: http      # service 端口配置的名称
     protocol: TCP   # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCP
     port: 80    # service 自己的端口,在使用内网时使用
     targetPort: 9527    # 目标 pod 的端口
   - name: https
     port: 443
     protocol: TCP
     targetPort: 443
   selector:     # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理
     app: nginx
   type: NodePort    # 随机启动一个端口(30000-32767),映射到ports中的端口,该端口是直接绑定在node上的,且集群中的每一个node都会绑定这个端口;也可用于将服务暴露给外部访问,不推荐,一般只在测试中使用 

1.1、命令操作

 # 创建service
 [root@k8s ~]# kubectl create -f nginx-svc.yaml
 ​
 # 查看service信息,通过service的cluster ip进行访问
 [root@k8s ~]# kubectl get svc 
 ​
 # 查看 pod 信息,通过pod的ip进行访问
 [root@k8s ~]# kubectl get po -o wide
 ​
 # 创建其他pod通过service name进行访问(推荐)
 [root@k8s ~]# kubectl exec -it busybox -- sh
 [root@k8s ~]# curl http://nginx-svc
 ​
 # 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
 [root@k8s ~]# curl http://nginx-svc.default

1.2、Endpoint

2、代理k8s外部服务

实现方式: (1)编写 service 配置文件时,不指定 selector 属性 (2)自己创建 endpoint

示例:第一步:编写nginx-svc-external.yaml文件和nginx-ep-external.yaml

 # nginx-svc-external.yaml:
 apiVersion: v1
 kind: Service
 metadata:
   name: nginx-svc-external
   labels:
     app: nginx
 spec:
   ports:
   - port: 80
     targetPort: 80
     name: web
   type: ClusterIP
   
 # nginx-ep-external.yaml:
 apiVersion: v1
 kind: Endpoints
 metadata:
   labels:
     app: nginx # 与service一致
   name: nginx-svc-external # 与service一致
   namespace: default # 与service一致
 subsets:
 - addresses:
   - ip: 202.108.22.5  # 目标ip地址,比如要请求到百度202.108.22.5
   ports: # 与service一致
   - name: web
     port: 80
     protocol: TCP

第二步创建Service和Endpoint:

 [root@k8s ~]# kubectl create -f nginx-svc-external.yaml
 [root@k8s ~]# kubectl create -f nginx-ep-external.yaml

第三步检查

 [root@k8s ~]# kubectl get svc
 NAME                TYPE        CLUSTER-IP      EXTERNAL-IP     PORT(S)         AGE
 nginx-svc-external  ClusterIP   10.102.101.161  <none>          80/TCP          8s
 ​
 [root@k8s ~]# kubectl get ep
 NAME                ENDPOINTS                   AGE
 nginx-svc-external  202.108.22.5:80         7s
 ​
 [root@k8s ~]# kubectl describe ep nginx-svc-external
 Name:                   nginx-svc-external
 Namespace:              default
 Labels:                 app=nginx
 Annotations:            <none>
 Subsets:
     Addresses:          202.108.22.5
     NotReadyAddress:    <none>
     Ports:  
       Name Port Protocol
       ---- ---- --------
       web  80   TCP
 Events: <none>

第四步测试

 # 进入一个容器中
 [root@k8s ~]# kubectl exec -it dns-test -- sh
 / # wegt http://nginx-svc-exterl
 Connecting to nginx-svc-external (10.102.101.161:80)
 Connecting to www.baidu.com (202.108.22.5:80)

总的来说:代理K8s外部服务:

  • 各环境访问名称统一
  • 访问k8s集群外的其他服务
  • 项目迁移

3、反向代理外部域名

编写nginx-svc-externalname.yaml文件:

 apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: baidu-external-domain
   name: baidu-external-domain
 spec:
   type: ExternalName
   externalName: www.baidu.cn

创建与测试:

 [root@k8s ~]# kubectl create -f nginx-svc-externalname.yaml
 [root@k8s ~]# kubectl get svc
 NAME                      TYPE          CLUSTER-IP  EXTERNAL-IP PORT(S)      AGE
 baidu-external-domain  ExternalName     www.baidu.cn    <none>  <none>       8s
 ​
 # 进入容器测试:
 [root@k8s ~]# kubectl exec -it dns-test -- sh
 / # wegt http://wolfcode-external-domain
 Connecting to nginx-svc-external (120.78.159.117:80)
 Connecting to www.baidu.com (202.108.22.5:80)

4、常用类型

4.1、ClusterIP

只能在集群内部使用,不配置类型的话默认就是 ClusterIP

4.2、ExternalName

返回定义的 CNAME 别名,可以配置为域名

4.3、NodePort

在所有安装了 kube-proxy 的节点都绑定一个端口,此端口可以代理至对应的 Pod,集群外部可以使用任意节点 ip + NodePort 的端口号访问到集群中对应 Pod 中的服务。

当类型设置为 NodePort 后,可以在 ports 配置中增加 nodePort 配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口

端口范围:30000~32767

端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中

4.4、LoadBalancer

使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务

二、Ingress

1、安装Ingress-nginx

(1)添加helm仓库

 # 添加仓库
 [root@master ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
 ​
 # 查看仓库列表
 [root@master ~]# helm repo list
 NAME            URL
 ingress-nginx   https://kubernetes.github.io/ingress-nginx
 ​
 # 搜索 ingress-nginx
 [root@master ~]# helm search repo ingress-nginx
 NAME                        CHART VERSION   APP VERSION     DESCRIPTION
 ingress-nginx/ingress-nginx     4.4.2           1.5.1       Ingress controller for.. 

(2)下载包

 # 下载安装包
 [root@master ~]# helm pull ingress-nginx/ingress-nginx --version=4.4.2
 [root@master ~]# mv ingress-nginx-4.4.2.tgz /opt/k8s/helm 
 [root@master ~]# cd /opt/k8s/helm

(3)配置参数

 # 将下载好的安装包解压
 [root@master helm]# tar xf ingress-nginx-4.4.2.tgz
 ​
 # 解压后,进入解压完成的目录
 [root@master helm]# cd ingress-nginx
 ​
 # 修改 values.yaml
 # 镜像地址:修改为国内镜像/科学上网
 [root@master ingress-nginx]# vim values.yaml 
 registry: registry.cn-hangzhou.aliyuncs.com
 image: google_containers/nginx-ingress-controller
 image: google_containers/kube-webhook-certgen
 tag: v1.3.0
 #digest: sha256:4ba73c697770664c1e00e9f968de14e08f606ff961c76e5d7033a4a9c593c629
 #digestChroot: sha256:c1c091b88a6c936a83bd7b098662760a87868d12452529bad0d178fb36147345
 hostNetwork: true
 dnsPolicy: ClusterFirstWithHostNet
 ​
 修改部署配置的 kind: DaemonSet
 nodeSelector:
   ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署
 将 admissionWebhooks.enabled 修改为 false
 将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer

(4)创建Namespace

 # 为 ingress 专门创建一个 namespace
 [root@master ingress-nginx]# kubectl create ns ingress-nginx

(5)安装Ingress

 # 为需要部署 ingress 的节点上加标签,由于目前k8s-master中存在污点,因此将ingress创建在node1中
 [root@master ingress-nginx]# kubectl label node k8s-node1 ingress=true
 ​
 # 安装 ingress-nginx
 [root@master ingress-nginx]# helm install ingress-nginx -n ingress-nginx .
 [root@master ingress-nginx]# helm delete ingress-nginx -n ingress-nginx # 失败重装执行
 ​
 # 检查
 [root@master ingress-nginx]# kubectl get po -n ingress-nginx -o wide
 NAME    READY   TATUS   RESTARTS    AGE IP  NODE    NOMINATED NODE  READINEDD GATES
 ingress..   1/1 Running 0           33s 192.168.1.11    k8s-node1   <none> <none>

2、基本使用

2.1、创建一个Ingress

 apiVersion: networking.k8s.io/v1
 kind: Ingress                           # 资源类型为 Ingress
 metadata:
   name: wolfcode-nginx-ingress
   annotations:
     kubernetes.io/ingress.class: "nginx"
     nginx.ingress.kubernetes.io/rewrite-target: /
 spec:
   rules:        # ingress 规则配置,可以配置多个
   - host: k8s.wolfcode.cn   # 域名配置,可以使用通配符 *
     http:
       paths:    # 相当于nginx的location配置,可以配置多个
       - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
         backend:
           service: 
             name: nginx-svc # 代理到哪个 service
             port: 
               number: 80 # service 的端口
         path: /api # 等价于 nginx 中的 location 的路径前缀匹配

2.2、多域名配置

 apiVersion: networking.k8s.io/v1
 kind: Ingress # 资源类型为 Ingress
 metadata:
   name: wolfcode-nginx-ingress
   annotations:
     kubernetes.io/ingress.class: "nginx"
     nginx.ingress.kubernetes.io/rewrite-target: /
 spec:
   rules: # ingress 规则配置,可以配置多个
   - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
     http:
       paths: # 相当于 nginx 的 location 配置,可以配置多个
       - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
         backend:
           service: 
             name: nginx-svc # 代理到哪个 service
             port: 
               number: 80 # service 的端口
         path: /api # 等价于 nginx 中的 location 的路径前缀匹配
         
       - pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
         backend:
           service:
             name: nginx-svc # 代理到哪个 service
             port:
               number: 80 # service 的端口
         path: /
         
   - host: api.wolfcode.cn # 域名配置,可以使用通配符 *
     http:
       paths: # 相当于 nginx 的 location 配置,可以配置多个
       - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
         backend:
           service:
             name: nginx-svc # 代理到哪个 service
             port:
               number: 80 # service 的端口
         path: /

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法_栈专题---持续更新

文章目录 前言删除字符中的所有相邻重复项题目要求题目解析代码如下 比较含退格的字符串题目要求题目解析代码如下 基本计算器II题目要求题目解析 字符串解码题目要求题目解析代码如下 验证栈序列题目要求题目解析代码如下 前言 本文将会向你介绍有关栈的相关题目&#xff1a;…

matter中的Fabric(网络结构)

什么是Fabric&#xff1f; Fabric可以被理解为一组相互信任的设备和控制器&#xff0c;它们共享一个共同的信任域。这意味着在同一个Fabric中的设备和控制器之间可以进行安全的通信&#xff0c;而无需额外的身份验证或安全检查。每个Fabric有一个唯一的标识&#xff0c;确保Fab…

迁移替换AD域时,有几个关键点需要注意

在当今的数字化时代&#xff0c;企业对于身份管理和访问控制的需求日益增长。然而&#xff0c;传统的AD域控方案在面对国产化替代和业务上云的趋势时&#xff0c;逐渐显露出一些局限性。宁盾国产化身份域管作为一种迁移替换AD域控的创新解决方案&#xff0c;正逐渐崭露头角&…

文心一言 VS 讯飞星火 VS chatgpt (341)-- 算法导论23.1 10题

十、给定图 G G G和 G G G的一棵最小生成树 T T T&#xff0c;假设减小了 T T T中一条边的权重。证明&#xff1a; T T T仍然是 G G G的一棵最小生成树。更形式化地&#xff0c;设 T T T为 G G G的一棵最小生成树&#xff0c; G G G的边权重由权重函数 w w w给出。选择一条边 (…

职称评审中,论文发表要求?

无论是医生、教师或其他等职业&#xff0c;职称评审无疑是一个非常重要的环节。而职称评审中的论文发表则是评定我们专业能力的重要一环&#xff0c;可如何才能让自己辛苦撰写的的论文被发表&#xff0c;达到论文发表都有哪些要求呢&#xff1f; 一、选题要新颖 编辑和审稿人…

VMware的三种网络模式及应用场景

在VMware中&#xff0c;虚拟机网络连接的方式主要有三种模式&#xff1a;桥接模式&#xff08;Bridged Mode&#xff09;、NAT模式&#xff08;Network Address Translation Mode&#xff09;、仅主机模式&#xff08;Host-Only Mode&#xff09;。每种模式都有其独特的用途和配…

SSM+Ajax实现广告系统

文章目录 1.案例需求2.编程思路3.案例源码(这里只给出新增部分的Handler和ajax部分&#xff0c;需要详情的可以私信我)4.小结 1.案例需求 使用SSMAjax实现广告系统&#xff0c;包括登录、查询所有、搜索、新增、删除、修改等功能&#xff0c;具体实现的效果图如下&#xff1a;…

『功能项目』状态模式转换场景【30】

本章项目成果展示 打开上一篇29Unity本地数据库读取进入游戏的项目&#xff0c; 本章要做的事情是通过状态者模式转换场景&#xff0c;在进入账号登陆界面前闪烁显示Logo 首先创建一个新的场景命名为StartUI 修改游戏场景名字 重命名为FightGame01 首先创建一个脚本文件夹&…

gazebo可能打不开的问题

如果经常遇到gazebo只能断网才能运行的时候&#xff0c;主要就是因为无法联网访问gazebo的在线模型库&#xff0c;此时我们一般无法在联网的情况下打开gazebo。 这个时候就直接将下载好的模型先放到~/.gazebo/models/文件夹下面即可&#xff1a; https://github.com/osrf/gazeb…

RTOS Sensor Framework对比

1.背景 传感器(Sensor)是物联网(IOT)的重要组成部分&#xff0c;用于感知和采集环境中的各种数据&#xff0c;大部分智能硬件都需要。 为使传感器能正常⼯作&#xff0c;驱动开发者需要开发不同的驱动程序&#xff0c;驱动程序要实现芯片寄存器\IO设置&#xff0c;又要响应使用…

搭建 canal 监控mysql数据到 elasticsearch 中(本机到远端sql)

搭建 canal 监控mysql数据到 elasticsearch 中&#xff08;本机到远端sql&#xff09; 需求: 要将 MySQL 数据库 info 中的 notice 和 result 表的增、删、改操作同步到 Elasticsearch 的 notice 和 result 索引&#xff0c;您需要正确配置 MySQL、Canal 、Canal Adapter 、 …

3--Web前端开发-前端工程化,vue项目

目录 端口配置 element 快速入门 table表格组件 分页组件 Dialog对话框组件 表单组件 端口配置 在vue.config.js中更改 源代码为 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true })更改为 const { def…

Linux——redis主从复制、哨兵模式

一、redis 的安全加固&#xff1a; 对redis数据库访问的角度 auth // 验证登录redis 数据库的用户acl // 设置redis用户的权限将配置完成的ACL策略写入配置文件 config rewrite //目前redis生效的配置全部写入到默认配置文件的尾部写入到acl文件中&#xff0c;在加载配置文件时…

《论软件设计模式及其应用》通关范文,软考高级系统架构设计师

论文真题 设计模式(Design Pattern)是一套被反复使用的代码设计经验总结,代表了软件开发人员在软件开发过程中面临的一般问题的解决方案和最佳实践。使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性。现有的设计模式已经在前人的系统中…

每日一练:和为K的子数组

一、题目要求 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;n…

python深度学习:从注意力机制到生成模型,全面解析现代AI技术

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型&#xff08;BERT、GPT-1/2/3/3.5/4、DETR、ViT、Swin…

OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中查找轮廓。 该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具&#xff0c;可用于形状分析和对象检测与识别。参见 OpenC…

SDN架构详解

目录 1&#xff09;经典的IP网络-分布式网络 2&#xff09;经典网络面临的问题 3&#xff09;SDN起源 4&#xff09;OpenFlow基本概念 5&#xff09;Flow Table简介 6&#xff09;SDN的网络架构 7&#xff09;华为SDN网络架构 8&#xff09;传统网络 vs SDN 9&#xf…

网络安全与恶意攻击:如何应对?

引言 随着技术的发展&#xff0c;我们的生活越来越依赖于网络。但是&#xff0c;这也暴露了我们的系统对各种网络威胁的脆弱性。无论是个人还是企业&#xff0c;网络安全都成为了我们不能忽视的话题。 网络威胁的类型 网络威胁主要有以下几种&#xff1a; 网络钓鱼攻击&#…

linux学习--第四天

--linux文件操作 文件IO操作包括&#xff1a; &#xff08;注&#xff1a;I&#xff1a;input&#xff08;输入&#xff09;O&#xff1a;output&#xff08;输出&#xff09;&#xff09; open&#xff1a;打开 close&#xff1a;关闭 read&#xff1a;读取 write&#xff1a;…