K8S四层代理Service-02

Service的四种类型使用

  • ClusterIP
    • 使用示例
    • Pod里使用service的服务名访问应用
  • NodePort
    • 使用示例
  • ExternalName
    • 使用示例
  • LoadBalancer

K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer
以下是使用4种类型进行Service创建,应对不同场景

ClusterIP

默认类型,适用于仅在集群内部提供服务的应用。创建的Service仅可在集群内部访问,由K8S自动分配IP地址。

使用示例

1、创建pod

vim pod_test_1.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-1
spec:
  selector:
    matchLabels:
      test: cluster # 配置deployment的标签,必须与pod标签一致
  replicas: 2  # 配置deployment的pod数
  template:
    metadata:
      labels:
        test: cluster # 配置pod的标签
    spec:
      containers:
      - name: my-nginx
        image: docker.io/library/nginx:latest # 使用的镜像
        imagePullPolicy: IfNotPresent # 节点本地没找到镜像再去远程仓库拉取
        ports:
        - containerPort: 80  #pod中的容器需要暴露的端口
        startupProbe:  # 配置启动探测
           periodSeconds: 5
           initialDelaySeconds: 60
           timeoutSeconds: 10
           httpGet:   
             scheme: HTTP
             port: 80
             path: /
        livenessProbe: # 配置存活探测
           periodSeconds: 5
           initialDelaySeconds: 60
           timeoutSeconds: 10
           httpGet:
             scheme: HTTP
             port: 80
             path: /
        readinessProbe: # 配置就绪探测(只有探测就绪成功后才会记录到Service里的endpoint)
           periodSeconds: 5
           initialDelaySeconds: 60 # pod启动后首次检查就绪探测的时间,单位为秒。
           timeoutSeconds: 10
           httpGet:    # 探测方式是HTTP发起GET请求服务的80端口访问根路径
             scheme: HTTP
             port: 80
             path: /

更新启动资源

kubectl apply -f pod_test_1.yaml

在这里插入图片描述
查看刚才创建的Pod ip地址

kubectl get pods -owide -l test=cluster

在这里插入图片描述
查看 ReplicaSet信息

kubectl get replicaset -l test=cluster

在这里插入图片描述
请求pod的 IP地址,访问应用

curl 10.244.36.75:80

在这里插入图片描述

curl 10.244.169.133

在这里插入图片描述
在pod1中请求pod2的应用,可以访问

kubectl exec -it nginx-test-1-69ddb65d98-vq2r6 -- /bin/bash

在这里插入图片描述
“误”删除其中一个Pod,查看Pod集群变化

kubectl delete pods nginx-test-1-69ddb65d98-vq2r6
kubectl get pods -owide -l test=cluster

在这里插入图片描述

通过上面可以看到重新生成了一个pod:nginx-test-1-69ddb65d98-nkjnv,IP是110.244.36.76,在k8s中创建pod,如果pod被删除了,重新生成的pod的IP地址会发生变化,所以需要在pod前端加一个固定接入层。

2、创建service

vim service_test_1.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-test-1
  labels:
    test: cluster
spec:
  type: ClusterIP
  ports:
  - port: 80   #service的端口,暴露给k8s集群内部服务访问
    protocol: TCP
    targetPort: 80    #pod容器中定义的端口
  selector:
    test: cluster  #选择拥有test=cluster标签的pod

上述yaml文件将创建一个 Service,关联具有标签test=cluster的Pod,目标TCP端口80
(targetPort:容器接收流量的端口;port:抽象的 Service 端口,可以使任何其它 Pod访问该 Service的端口)。

更新启动Service

kubectl apply -f service_test_1.yaml

查看Service

kubectl get svc -l test=cluster

在这里插入图片描述
在k8s控制节点访问service的 IP:port 就可以把请求代理到后端pod

curl 10.111.10.207:80

在这里插入图片描述
通过上面可以看到请求Service IP:port 跟直接访问pod IP:port 看到的结果一样,这就说明Service可以把请求代理到它所关联的后端Pod
注意:上图的 “10.111.10.207:80” 地址只能是在k8s集群内部访问,在外部无法访问,想要通过浏览器是访问不通的

Pod里使用service的服务名访问应用

service只要创建完成,就可以直接解析它的服务名,每一个服务创建完成后都会在集群dns中动态添加一个资源记录,添加完成后就可以解析了,资源记录格式是:
SVC_NAME.NS_NAME.DOMAIN.LTD. 服务名.命名空间.域名后缀
集群默认的域名后缀是:svc.cluster.local
上面创建的nginx-test-1服务,完整名称解析是:nginx-test-1.default.svc.cluster.local

在Pod里通过Service的服务名访问应用

kubectl exec -it nginx-test-1-69ddb65d98-nkjnv -- /bin/bash
curl nginx-test-1.default.svc.cluster.local

在这里插入图片描述

NodePort

适用于需要从外部访问Service的应用。创建的Service在每个节点上公开一个静态端口,使得外部客户端可以通过公开的端口访问Service的应用。

使用示例

1、创建pod

vim pod_test_2.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-2
spec:
  selector:
    matchLabels:
      test: nodeport
  replicas: 2
  template:
    metadata:
      labels:
        test: nodeport
    spec:
      containers:
      - name: my-nginx
        image: docker.io/library/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80  #pod中的容器需要暴露的端口
        startupProbe:
           periodSeconds: 5
           initialDelaySeconds: 60
           timeoutSeconds: 10
           httpGet:
             scheme: HTTP
             port: 80
             path: /
        livenessProbe:
           periodSeconds: 5
           initialDelaySeconds: 60
           timeoutSeconds: 10
           httpGet:
             scheme: HTTP
             port: 80
             path: /
        readinessProbe:
           periodSeconds: 5
           initialDelaySeconds: 60
           timeoutSeconds: 10
           httpGet:
             scheme: HTTP
             port: 80
             path: /

更新启动资源

kubectl apply -f pod_test_2.yaml

在这里插入图片描述
查看pod是否创建成功

kubectl get pods -owide -l test=nodeport

在这里插入图片描述
2、创建service,代理pod

vim service_test_2.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-test-2
  labels:
    test: nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30380
  selector:
    test: nodeport

更新启动Service

kubectl apply -f service_test_2.yaml

查看Service

kubectl get svc -l test=nodeport

在这里插入图片描述

kubectl describe svc nginx-test-2

在这里插入图片描述

访问Service

curl 10.102.33.103

在这里插入图片描述

注意:10.102.33.103是k8s集群内部的Service的IP地址,只能在k8s集群内部访问,在集群外无法访问。

在集群外访问Service(K8S的node节点IP:nodePort)
PS. 我本地搭建是一个控制节点+2个工作节点

  • 192.168.40.182:30380(控制节点)
  • 192.168.40.183:30380(工作节点1)
  • 192.168.40.184:30380(工作节点2)

以上3个地址都能访问到应用
在这里插入图片描述
数据转发流程

ipvsadm -Ln

在这里插入图片描述

ip addr

在这里插入图片描述

客户端请求(任何一个节点IP+端口)http://192.168.40.182:30380->docker0
虚拟网卡:172.17.0.1:30380->10.244.36.80:80,10.244.169.137:80

ExternalName

适用于跨名称空间访问。例如:命名空间为“default”下的client 服务,想要访问命名空间为“nginx-ns”下的nginx-svc服务。可通过DNS解析直接访问该服务,不需要其他负载均衡器。

使用示例

1、新建一个命名空间

kubectl create ns nginx-ns

2、搭建nginx-svc服务
2.1 创建pod

vim nginx_deployment.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx-ns
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
   metadata:
    labels:
      app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx
       imagePullPolicy: IfNotPresent

更新启动资源

kubectl apply -f nginx_deployment.yaml

查看pod是否创建成功

kubectl get pods -n nginx-ns

在这里插入图片描述

2.2 创建service

vim nginx_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-ns
spec:
  selector:
    app: nginx
  ports:
   - name: http
     protocol: TCP
     port: 80
     targetPort: 80

更新启动Service

kubectl apply -f nginx_svc.yaml

查看Service信息

kubectl get svc -n nginx-ns

kubectl describe svc  nginx-svc -n nginx-ns

在这里插入图片描述

3、搭建client 服务
3.1 创建pod

vim client.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
   metadata:
    labels:
      app: busybox
   spec:
     containers:
     - name: busybox
       image: busybox
       imagePullPolicy: IfNotPresent
       command: ["/bin/sh","-c","sleep 36000"]

更新启动资源

kubectl apply -f client.yaml

该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样
查看pod是否正常运行

kubectl get pods -l app=busybox

在这里插入图片描述

3.2 创建service

vim client_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: client-svc
spec:
  type: ExternalName
  externalName: nginx-svc.nginx-ns.svc.cluster.local
  ports:
  - name: http
    port: 80
    targetPort: 80

更新启动Service

kubectl apply -f client_svc.yaml

登录到client pod

kubectl exec -it  client-568955849b-mt47t -- /bin/sh
wget -q -O - client-svc.default.svc.cluster.local
wget -q -O - nginx-svc.nginx-ns.svc.cluster.local

在这里插入图片描述
在这里插入图片描述

上面两个请求的结果一样

LoadBalancer

LoadBalancer类型适用于需要提供公共服务并且需要高可用性和高伸缩性的场景。与其他类型的Service相比实现更复杂,需要绑定到云平台的负载均衡器服务上,因此通常适用于云平台环境。
(ps. 设备有限,没有做这块的实验。
特放官网的链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本——变量

目录 一、变量基础 1、shell脚本的变量是什么 2、变量的作用 3、变量作用范围 3.1 临时设置 3.2 永久设置,需要在/etc/profile文件里添加 4、删除变量 二、变量的类型 1、自定义变量 1.1 命令要求 1.2 定义新的变量 1.3 查看定义的变量的值 1.4 赋值时使…

Confluence6+mysql5.7破j安装避坑详细记录

目录 一、前言 二、下载与安装 1、版本和安装环境 2、安装数据库 3、配置数据库 4、安装confluence 三、Pj confluence 1、选择语言和产品安装 2、Pj 3、上传mysql驱动 4、重启Confluence服务继续安装 四、Confluence重启卸载方法 重启方法 方法一 方法二 卸载…

【JSON显示】

1、效果 2、代码 <pre>{/* * networkObj&#xff1a; 要转换的对象* null: 转换结果的函数* 2&#xff1a;在返回值的JSON文本中添加缩进&#xff0c;空格和换行符&#xff0c;使其更容易阅读*/}{JSON.stringify(networkObj, null, 2)} </pre>

ubuntu1604安装及问题解决

虚拟机安装vmbox7 虚拟机操作&#xff1a; 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…

【Linux】Linux进程间通信

Linux进程间通信 一、进程间通信介绍1、概念2、进程间通信目的3、进程间通信的本质4、进程间通信分类 二、管道1、什么是管道2、匿名管道&#xff08;1&#xff09;匿名管道原理&#xff08;2&#xff09;pipe函数&#xff08;3&#xff09;匿名管道的使用步骤i、父进程调用pip…

Android Studio离线开发环境搭建

Android Studio离线开发环境搭建 1.下载离线和解压包2.创建工程3.创建虚拟机tips 1.下载离线和解压包 下载地址 百度网盘&#xff1a;https://pan.baidu.com/s/1XBPESFOB79EMBqOhFTX7eQ?pwdx2ek 天翼网盘&#xff1a;https://cloud.189.cn/web/share?code6BJZf2uUFJ3a&#…

JAVA 学习 面试(六)数据类型与方法

数据类型 基本数据类型 为什么float3.4报错 3.4 默认是浮点double类型的&#xff0c;如果赋值给float是向下转型&#xff0c;会出现精度缺失&#xff0c;&#xff0c;需要强制转换 Switch支持的数据类型&#xff1f; byte、short、int、char 、 enum 、 String 基本类型与包…

新年钜惠|泰迪智能科技免费协助企业完成3个行业AI案例建模

在新年到来之际&#xff0c;为了感谢各企业一直以来对泰迪智能科技的支持&#xff0c;日前我们推出了新年钜惠活动即&#xff1a;免费协助企业完成3个行业AI案例建模。我们希望通过这样的活动&#xff0c;可以帮助更多的企业迈出AI应用的第一步&#xff0c;同时我们也希望能够为…

Python使用pip命令安装外部库-项目内安装外部库-全局安装外部库

一、前言 在进行Python项目开发时需要安装一些外部库来扩展项目功能&#xff0c;因此需要了解pip命令的详细使用。 二、基本语法 1.安装库 pip install 包名 2.安装特定版本 pip install 包名版本号 3.升级库 pip install --upgrade 包名 4.卸载库 pip uninstall 包名 5.查看已…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转,与Android的对比)

在进行应用开发前&#xff0c;对程序的目录及包结构的理解是有必要的。如果之前有过android开发经验的&#xff0c;会发现OpenHarmony的应用开发也很简单&#xff0c;有很多概念是相似的。下面对比android分析总结下鸿蒙的应用程序包结构&#xff0c;以及鸿蒙对比android的诸多…

学会这个考勤技术,企业管理就很牛啦!

随着科技的迅速发展&#xff0c;人脸识别技术逐渐成为现代社会中一项重要的工具&#xff0c;为各行各业带来了革命性的变革。 在这个背景下&#xff0c;三维人脸考勤系统作为人脸识别技术的一项创新应用&#xff0c;正在改变传统的考勤管理方式&#xff0c;提供了更智能、高效、…

关于网络安全 的 ARP欺骗 实验操作

实验设备&#xff1a; Windows server 2008 kali 1. vmware--上面菜单栏--虚拟机--设置--网络--NAT 模式 确定靶机与攻击机的连通性&#xff08;互相能 ping 通&#xff09; 靶机查看 arp 表&#xff08;arp -a&#xff09; 查看攻击机(kali)物理地址&#xff08;ip addr&…

计算机基础之微处理器简介

微处理器 微处理器定义 微型计算机的CPU也被称为微处理器&#xff0c;是将运算器、控制器和高速缓存集成在一起的超大规模集成电路芯片&#xff0c;是计算机的核心部件。能完成取指令、执行指令&#xff0c;以及与外界存储器和逻辑部件交换信息等操作。 微处理器发展 CPU从…

Day24_77 组合

77 组合 组合无序&#xff0c;排列有序。1~n个数中选k个数组合&#xff0c;k不确定&#xff0c;组合的方式。 &#xff08;图片来自代码随想录&#xff09;确定回溯法的三部曲&#xff1a; 递归函数的返回值和参数&#xff1a;集合n中取k个数&#xff0c;&#xff0c;每次从…

《WebKit 技术内幕》学习之十一(4):多媒体

4 WebRTC 4.1 历史 相信读者都有过使用Tencent QQ或者FaceTime进行视频通话的经历&#xff0c;这样的应用场景相当典型和流行&#xff0c;但是基本上来说它们都是每个公司推出的私有产品&#xff0c;而且通信等协议也都是保密的&#xff0c;这使得一种产品的用户基本上不可能…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

Webpack5 基本使用 - 2

常用 loader loader 是辅助打包工具。webpack 默认只能打包 js 文件&#xff0c;打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。loader 可以将文件从不同的语言转换为 JavaScript。一类文件如果需要多个 loader 处理&#xff0c;loader 的执行顺序是从…

从零开始学Python第02课:第一个Python程序

在上一课中&#xff0c;我们对 Python 语言的过去现在有了一些了解&#xff0c;我们准备好了运行 Python 程序所需要的解释器环境。相信大家已经迫不及待的想开始自己的 Python 编程之旅了&#xff0c;但是新问题来了&#xff0c;我们应该在什么地方书写 Python 程序&#xff0…

caj在线转换成word怎么转?几种在线转换方法详解

caj在线转换成word怎么转&#xff1f;在日常的学习和工作中&#xff0c;我们常常会遇到各种各样的文件格式。其中&#xff0c;CAJ格式的文件因其专业性强&#xff0c;常常让许多用户感到困扰。如果你手头恰好有这种格式的文件&#xff0c;却苦于无法编辑&#xff0c;那么接下来…