k8s service与ingress

news2024/12/28 5:38:30

1.前言

service只能作用与网络模型中的四层,ingress可以作用于网络模型中的七层,Service是一种抽象,定义了一个逻辑上的一组Pod以及访问它们的策略。Service为Pod提供了一个稳定的IP地址和DNS名称,并通过标签选择器来定义需要暴露的Pod。Service可以通过Cluster IP、Node Port、Load Balancer和External Name等方式来提供服务,这取决于具体的部署需求

Ingress是在Kubernetes集群中暴露HTTP和HTTPS服务的API对象。它为集群中的服务提供外部访问,并提供负载均衡、SSL终止和基于名称的虚拟主机等功能。Ingress通过将流量路由到不同的后端Service来实现这些功能。Ingress需要一个Ingress Controller来实现其规则,这个控制器可以是Kubernetes自带的或者是第三方提供的

简单来说,Service用于在Kubernetes集群内部暴露服务,而Ingress则用于将服务暴露到集群外部,使得外部用户可以通过HTTP或HTTPS协议访问应用程序,相当于nginx的反向代理

2.更改kube-proxy代理

在开始之前,先把kube-proxy代理的模式改为ipvs模式

kubectl edit cm kube-proxy -n kube-system

 再把所有kube-proxy的pod重启一下

kubectl delete pod -l k8s-app=kube-proxy -n kube-system

kubectl get pod -l k8s-app=kube-proxy -n kube-system

 

3.service

接下来简单的使用一下service的几种方式,这里就展示ClusterIP、NodePort这两种常用的方式

3.1ClusterIP

编辑yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:         #配置标签选择,选择符合该标签的pod
    app: nginx       
  type: ClusterIP    #配置service模式为ClusterIP
  clusterIP:         #可以指定ClusterIP地址,留空就会自动生成ClusterIP地址
  ports:
    - port: 80      #service服务的端口
      targetPort: 80    #pod监听的端口
      protocol: TCP    #配置网络协议

执行yaml文件

kubectl create -f deployment-nginx.yaml

kubectl get service

kubectl describe service nginx

kubectl get pod -o wide -l app=nginx

可以看到service已经创建出来了,并且已经绑定了pod,通过service访问一下pod的端口服务看看效果

curl 10.98.144.122:80 

可以看到能成功访问到pod的端口服务,使用ClusterIP方式只能在集群内部访问,集群外访问不了

以下再补充一下ClusterIP方式的一些知识

ipvsadm -Ln

通过ipvsadm命令可以看到我们使用的ClusterIP访问pod的方式为轮询,rr代表轮询模式,即每次请求都会按顺序顺延访问每个pod的服务 ,有些场景下我们可能会希望每个访问的ip,都能固定访问一个pod服务,而不是轮询每个pod,我们就可以在配置文件中引入一个sessionAffinity参数,接下来配置一下看看

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx
  type: ClusterIP 
  clusterIP:
  sessionAffinity: ClientIP  #增加ClientIP参数值,使得访问的ip固定访问一个pod服务
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP

执行一下yaml

kubectl create -f deployment-nginx.yaml

kubectl get service 

kubectl get pod -o wide -l app=nginx

ipvsadm -Ln

从上图可以看到不在单单是显示rr轮询模式,可以更改nginx的页面内容去试一下,相同的ip访问的内容是固定的,因为我这边做过了试验,在这里就不展示了

 3.2NodePort

编辑yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx
  type: NodePort    #选择NodePort类型
  clusterIP:
  sessionAffinity: ClientIP
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001   #配置nodePort外部端口,不设置则随机分配
      protocol: TCP

执行yaml

kubectl create -f deployment-nginx.yam

kubectl get service

kubectl get pod -o wide -l app=nginx

可以看到已经按要求创建出了service,现在来访问一下看看效果,我们直接用集群外的网络来访问看看

 可以看到使用NodePort方式,可以在集群外部访问到pod端口服务

4.ingress

这里使用nginx作为Ingress Controller来实现ingress定义的规则,也可以使用haproxy等工具来实现,实际上工作流程就是,向ingress写入规则,ingress Controller将规则转化为nginx的规则,写入nginx配置中,以实现反向代理

4.1搭建ingress环境

这里我直接使用helm安装nginx ingress控制器

helm配置可以参考:k8s helm安装使用_Apex Predator的博客-CSDN博客

查找镜像源

helm search repo ingress

安装插件

helm install ingress bitnami/nginx-ingress-controller

helm list

 状态为deployed就表示正常部署

查看一下pod,svc,deployment中的ingress服务

kubectl get pod,svc,deployment

 可以看到都已经正常启动了,但是svc中的ingress-nginx-ingress-controller默认用的是LoadBalancer模式,需要修改为NodePort模式,上图中我已经修改过后的状态

修改一下svc的配置

kubectl edit svc service/ingress-nginx-ingress-controller

type: NodePort      #将type项的LoadBalancer改为NodePort即可保存退出

再次查看svc

 至此ingress环境已经部署好了

4.2使用ingress

编辑yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx
  type: ClusterIP 
  clusterIP:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  namespace: default
spec:
  rules:   #配置代理规则
  - host: nginx.apex.com     #配置反向代理的域名
    http:
      paths:
        - path: /          #匹配路径,相当于nginx location,以下的pathType用于配置匹配规则
          pathType: ImplementationSpecific    #pathType 字段用于指定 Ingress 路由规则中的路径类型,pathType 字段有三个可选值,Exact表示 Ingress 规则中的路径必须与请求的路径完全匹配,Prefix表示 Ingress 规则中的路径必须是请求路径的前缀,ImplementationSpecific表示 Ingress 控制器可以自行决定路径类型
          backend:      #配置需要代理服务的参数
            service: 
              name: nginx    #配置需要代理的sevice服务的名称
              port:
                number: 80   #配置需要代理的service监听端口
  ingressClassName: nginx   #指定实现规则的应用类型,controller会将以上的规则转变为适合该应用的配置写入应用的配置文件中

我这边把deployment、service、ingress的yaml配置都写在了一个yaml文件上,现在来执行yaml看看效果

kubectl create -f deployment-nginx.yaml

kubectl get pod -l app=nginx

kubectl get ingress

 可以看到pod、svc、ingress都已经正常运行,可以看到ingress监听的端口为80,因为代理的是http服务

编辑一下本机的hosts文件,使得域名能正常解析到服务主机上

vi /etc/hosts

10.1.60.119 nginx.apex.com   #在末尾新增此条内容

 查看ingress service服务端口,测试访问一下域名看是否能正常访问到pod中的服务

kubectl get svc

可以看到http服务使用31079端口,https服务使用31920端口 

curl nginx.apex.com:31079

 域名可以正常访问pod服务

接下来配置一下https服务

创建证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=apex.com"

创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

编辑yaml文件

vi deployment-tomcat.yaml 

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: tomcat
  name: tomcat
  namespace: default
spec:
  replicas: 2
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec: 
      containers:
      - name: tomcat
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: default
spec:
  selector:
    app: tomcat
  type: ClusterIP 
  clusterIP:
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-tomcat
  namespace: default
spec:
  tls:     #https服务配置项
    - hosts:
      - tomcat.apex.com     #配置需要使用https服务的域名
      secretName: tls-secret   #配置创建的证书名称
  rules:
  - host: tomcat.apex.com
    http:
      paths:
        - path: /
          pathType: ImplementationSpecific
          backend:
            service: 
              name: tomcat
              port:
                number: 8080
  ingressClassName: nginx

执行一下yaml

kubectl create -f deployment-tomcat.yaml

kubectl get pod -l app=tomcat

kubectl get ingress

 可以看到pod正常启动,ingress也正常创建好了,端口也显示监听80和443端口,即代理了http和https服务

也可以查看一下ingress的详细信息

 kubectl describe ingress ingress-tomcat

看一下svc服务

 可以看到创建的tomcat svc服务监听端口为配置的8080端口

现在来访问一下域名看看是否代理成功

curl --insecure https://tomcat.apex.com:31920

 可以看到使用域名能正常访问到pod的服务

至此https配置完成

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

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

相关文章

SpringBoot_Vue3 《Hello World》项目入门教程

1. 前言 前后端分离模式,可以让后端和前端开发人员致力于自己擅长的领域,且可以让前端和后端业务逻辑高度解耦合。本文从一个简单的案例入手,讲解使用 spring boot和vue3如何实现前后端的分离。 前后端分离有2 种模式: 逻辑分离…

华为OD机试真题 JavaScript 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

一、题目描述 输入一个字符串,返回其最长的数字子串,以及其长度。 若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置)。 本题含有多组样例输入。 数据范围: 字符串长度 1≤n≤200 &…

【LeetCode】240. 搜索二维矩阵 II

240. 搜索二维矩阵 II(中等) 这道题和 74. 搜索二维矩阵 基本一致,可以放在一起做。 方法一:变形的二叉搜索树 思路 这种做法和 74. 搜索二维矩阵完全一致。 我们可以将二维矩阵抽象成「以右上角为根的 BST」: 那…

基于python五子棋的设计与实现(论文+源码)_kaic

目 录 摘 要 绪 论 一、游戏的需求分析 (一)游戏设计目标 (二)游戏的功能需求 1.可视化模块 2.玩家操作模块 3.胜负判定模块 (三)游戏的性能需求 (四)游戏其它需求 二、五子棋游戏…

JDK1.8环境安装及配置

JDK1.8环境安装及配置 一、下载JDK1.8二、安装三、环境变量配置四、验证 一、下载JDK1.8 本教程使用的是8u202版本,若需要其他版本可点击下方链接跳转下载。 Oracle下载,点击跳转选择版本 如下图所示,选择自己需要的版本下载 点击8u202版本…

斯坦福《Transformers集结》;大语言模型“书生・浦语“发布

🦉 AI新闻 🚀 上海人工智能实验室发布1040亿参数大语言模型"书生・浦语",在多项考试中超越ChatGPT 摘要:上海人工智能实验室近日发布了一个千亿级参数大语言模型——“书生・浦语”。该模型在多领域测试中表现优秀&am…

linuxOPS基础_linux计划任务

什么是计划任务 作用:操作系统不可能24 小时都有人在操作,有些时候想在指定的时间点去执行任务(例如:每天凌晨 2 点去重新启动httpd>阿帕奇),此时不可能真有人每天夜里 2 点去执行命令,这就…

大手笔!微软一口气在 GitHub 开源了 5 个技术教程。。

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 此前,我曾介绍过微软在 GitHub 开源的一系列面向初学者的技术教程。 现如今,两年时间过去了,这些教程都更新了不少内容,另外还新增了人工智能…

百度离线资源治理

作者 | 百度MEG离线优化团队 导读 近些年移动互联网的高速发展驱动了数据爆发式的增长,各大公司之间都在通过竞争获得更大的增长空间,大数据计算的效果直接影响到公司的发展,而这背后其实依赖庞大的算力及数据作为支撑,因此在满足…

如何熟练的运用数学模型在水环境影响评价、防洪评价与排污口论证项目中的方法

数学模型在水环境评价、防洪评价和排污口论证等领域中的重要作用,随着人类活动的不断增加和环境问题的日益突出,对水资源和水环境的保护与管理变得至关重要。为了更好地理解和应对这些挑战,数学模型成为一种强大的工具,能够提供量…

使用HHDESK完成网站穿透

在工作和学习中,有很多内网网站,不能通过公网进行访问,需要特定的IP;而IP费用极高,比如按IP收费,费用根据流量带宽来,——这着实是一笔很大的开支。 而通过HHDESK,使用hhtp协议代理…

软考A计划-系统架构师-官方考试指定教程-(5/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Win10安装Java 配置环境变量

文章目录 概要下载jdk安装jdk配置环境变量测试环境变量是否配置成功总结 概要 学习java开发首先需要安装jdk,并设置环境变量。 接下来就来介绍一下如何在 windows 10 系统中配置java环境变量 下载jdk https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe…

【手撕Spring源码】一些值得注意的Spring底层细节

文章目录 FactoryBeanIndexed 原理Spring代理的特点Value 装配底层Autowired 装配底层事件监听器模拟事件发布器 FactoryBean FactoryBean是一个Factory对象,用于生成其他bean示例。当一个bean实现FactoryBean接口后,Spring容器调用其getObject方法返回该工厂所生成的bean,而不…

elasticsearch 8.2.3 安装及springboot简单使用

一、下载安装 官网下载地址https://www.elastic.co/cn/downloads/elasticsearch 解压 elasticsearch-8.2.3-windows-x86_64 修改配置 elasticsearch-8.2.3\config\elasticsearch.yml # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable…

自学大语言模型之GPT

GPT火爆的发展史 2017年6月OpenAI联合DeepMind首次正式提出的:Deep Reinforcement Learning from Human Preferences,即基于人类偏好的深度强化学习,简称RLHF 2017年7月的OpenAI团队提出的对TRPO算法的改进:PPO算法 GPT-1&#…

【笔记】算法简单题

题解&#xff1a; import java.util.HashMap; import java.util.Map;public class Test {//暴力解决法public static int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i]nums[j]target){int[] indexs{0,0};i…

澳大利亚道路安全的AiRAP自动化审核(英)(附下载)

项目概况 该项目由新南威尔士州交通局&#xff08;TfNSW&#xff09;领导&#xff0c;悉尼科技大学&#xff0c;国际道路评估计划&#xff08;iRAP&#xff09;和澳大利亚地理空间数据专家Anditi的研究和协助。 该项目开展的工作是全球首创&#xff0c;其活动和成果是澳大利亚和…

15、库函数开发小结

目录 0x01、初始化 0x02、数据输入输出 0x03、状态位、标志位 0x0001、事件 0x0002、标志位的检查与清除 0x04、外设函数分类 本节我们来总结一下ST库开发的步骤和共同点&#xff0c;在总结之前&#xff0c;我们来看一下基本所有外设都有的以下几类寄存器&#xff1a; 1…

chatgpt赋能python:Python就业指南:市场现状、薪资情况及就业前景

Python就业指南&#xff1a;市场现状、薪资情况及就业前景 Python作为一门既新颖又多用的编程语言&#xff0c;已经引起了越来越多的关注。据统计&#xff0c;在2019年&#xff0c;全球Python使用者数已经达到了960万人。而在中国&#xff0c;Python的应用也越来越普及&#x…