【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(下)

news2024/11/25 4:48:35

目录

一、创建 Service:type 类型是 NodePort

1.1 创建一个 pod 资源

1.2 创建 service,代理 pod

在集群外访问 service:

数据转发流程: 

二、创建 Service:type 类型是 ExternalName

2.1 创建 pod  

2.2 创建 service 

2.3 创建默认空间下的 service

2.4 访问名称解析

三、k8s 最佳实践:映射外部服务案例分享

3.1 k8s 集群引用外部的 mysql 数据库

在 node2 上安装 mysql 数据库:

创建 endpoint 资源

四、Service 服务发现:coredns 组件详解 

DNS 是什么?

CoreDNS 是什么?

验证 coredns


 

一、创建 Service:type 类型是 NodePort

1.1 创建一个 pod 资源

[root@k8s-master01 ~]# vim pod_nodeport.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-nodeport
spec:
  selector:
    matchLabels:
      run: my-nginx-nodeport
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx-nodeport
    spec:
      containers:
      - name: my-nginx-nodeport-container
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

[root@k8s-master01 ~]# kubectl apply -f pod_nodeport.yaml
deployment.apps/my-nginx-nodeport created

# 删除上一篇文章创建的 pod
[root@k8s-master01 ~]# kubectl delete -f pod_test.yaml 
deployment.apps "my-nginx" deleted

[root@k8s-master01 ~]# kubectl get pods -o wide 
NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
my-nginx-nodeport-7486c46445-4jldx   1/1     Running   0          56s   10.244.169.148   k8s-node2   <none>           <none>
my-nginx-nodeport-7486c46445-cbrjk   1/1     Running   0          56s   10.244.36.126    k8s-node1   <none>           <none>

1.2 创建 service,代理 pod

[root@k8s-master01 ~]# vim service_nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-nodeport
  labels:
    run: my-nginx-nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    nodePort: 30380   # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767) 
  selector:
    run: my-nginx-nodeport

# 更新资源清单文件
[root@k8s-master01 ~]# kubectl apply -f service_nodeport.yaml 
service/my-nginx-nodeport created

# 查看刚才创建的 service
[root@k8s-master01 ~]# kubectl get svc -l run=my-nginx-nodeport
NAME                TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
my-nginx-nodeport   NodePort   10.102.2.76   <none>        80:30380/TCP   81s

# 访问 service
[root@k8s-master01 ~]# curl 10.102.2.76
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

注意:10.102.2.76 是 k8s 集群内部的 service ip 地址,只能在 k8s 集群内部访问,在集群外无法访问。

在集群外访问 service:

k8s 集群任意节点物理机 ip:端口

数据转发流程: 

[root@k8s-master01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.0.1:30380 rr
  -> 10.244.36.126:80             Masq    1      0          0         
  -> 10.244.169.148:80            Masq    1      0          0         

客户端请求 http://192.168.78.133:30380 -> docker0 虚拟网卡上:172.17.0.1:30380 -> 代理到两个pod ip:10.244.36.126:80,10.244.169.148:80

二、创建 Service:type 类型是 ExternalName

  • 应用场景:跨名称空间访问
  • 需求:如default 名称空间下的 client 服务想要访问 nginx-ns 名称空间下的 nginx-svc 服务 

2.1 创建 pod  

# 创建名称空间 nginx-ns
[root@k8s-master01 ~]# kubectl create ns nginx-ns
namespace/nginx-ns created

# 创建 nginx-ns 名称空间下的 pod
[root@k8s-master01 ~]# vim server_nginx.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:latest
       imagePullPolicy: IfNotPresent

[root@k8s-master01 ~]# kubectl apply -f server_nginx.yaml
deployment.apps/nginx created

# 查看 pod 信息
[root@k8s-master01 ~]# kubectl get pods -n nginx-ns -o wide 
NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-d5f959df4-8hprw   1/1     Running   0          18s   10.244.169.149   k8s-node2   <none>           <none>

2.2 创建 service 

# 创建 nginx-ns 名称空间下的 service 资源
[root@k8s-master01 ~]# vim nginx_svc.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

[root@k8s-master01 ~]# kubectl apply -f nginx_svc.yaml
service/nginx-svc created

[root@k8s-master01 ~]# kubectl get svc -n nginx-ns 
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-svc   ClusterIP   10.109.17.105   <none>        80/TCP    59s

2.3 创建默认空间下的 service

# 在默认空间下创建 pod
[root@k8s-master01 ~]# vim client.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:latest
       imagePullPolicy: IfNotPresent
       command: ["/bin/sh","-c","sleep 36000"]

[root@k8s-master01 ~]# kubectl apply -f client.yaml
deployment.apps/client created

# 在默认空间下创建 service
[root@k8s-master01 ~]# vim client_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: client-svc
spec:
  type: ExternalName    # 将 默认名称空间中的 client-svc 服务映射到 nginx-svc.nginx-ns.svc.cluster.local
  externalName: nginx-svc.nginx-ns.svc.cluster.local
  ports:
  - name: http
    port: 80
    targetPort: 80

# 把前面创建的 pod 删除
[root@k8s-master01 ~]# kubectl delete -f pod_nodeport.yaml 
deployment.apps "my-nginx-nodeport" deleted

[root@k8s-master01 ~]# kubectl apply -f client_svc.yaml
service/client-svc created

[root@k8s-master01 ~]# kubectl get pods 
NAME                      READY   STATUS    RESTARTS   AGE
client-5d44754c5c-vh5kd   1/1     Running   0          49s

# 删除前面创建的 service
[root@k8s-master01 ~]# kubectl delete -f service_nodeport.yaml 
service "my-nginx-nodeport" deleted
[root@k8s-master01 ~]# kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP                            PORT(S)   AGE
client-svc   ExternalName   <none>         nginx-svc.nginx-ns.svc.cluster.local   80/TCP    3m15s
kubernetes   ClusterIP      10.96.0.1      <none>                                 443/TCP   52d
my-nginx     ClusterIP      10.110.2.134   <none>                                 80/TCP    23h

2.4 访问名称解析

# 登录到 client pod
[root@k8s-master01 ~]# kubectl exec -it client-5d44754c5c-vh5kd -- sh
/ # wget -q -O - client-svc.default.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

/ # wget -q -O - nginx-svc.nginx-ns.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

上面两个请求的结果一样。

三、k8s 最佳实践:映射外部服务案例分享

3.1 k8s 集群引用外部的 mysql 数据库

在 node2 上安装 mysql 数据库:

[root@k8s-node2 ~]# yum install mariadb-server.x86_64 -y
[root@k8s-node2 ~]# systemctl start mariadb

[root@k8s-master01 ~]# vim mysql_service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306

[root@k8s-master01 ~]# kubectl apply -f mysql_service.yaml
service/mysql created

# 删除前面创建的 service
[root@k8s-master01 ~]# kubectl delete -f server_nginx.yaml 
deployment.apps "nginx" deleted     
[root@k8s-master01 ~]# kubectl delete -f service_test.yaml 
service "my-nginx" deleted

[root@k8s-master01 ~]# kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP                            PORT(S)    AGE
client-svc   ExternalName   <none>          nginx-svc.nginx-ns.svc.cluster.local   80/TCP     21m
kubernetes   ClusterIP      10.96.0.1       <none>                                 443/TCP    52d
mysql        ClusterIP      10.101.57.164   <none>                                 3306/TCP   94s

# 关联不到任何 pod
[root@k8s-master01 ~]# kubectl describe svc mysql
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.101.57.164
IPs:               10.101.57.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         <none>        # 还没有 endpoint
Session Affinity:  None
Events:            <none>    

创建 endpoint 资源

# 查看帮助命令
[root@k8s-master01 ~]# kubectl explain endpoints
[root@k8s-master01 ~]# kubectl explain endpoints.subsets
[root@k8s-master01 ~]# kubectl explain endpoints.subsets.addresses
[root@k8s-master01 ~]# kubectl explain endpoints.subsets.ports

[root@k8s-master01 ~]# vim mysql_endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: mysql             # 必须与前面创建的 service 名称一样
subsets:
- addresses:
  - ip: 192.168.78.132    # node 节点的物理 ip
  ports:
  - port: 3306

[root@k8s-master01 ~]# kubectl apply -f mysql_endpoint.yaml
endpoints/mysql created

[root@k8s-master01 ~]# kubectl describe svc mysql
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.101.57.164
IPs:               10.101.57.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.78.132:3306    # 这个就是定义的外部数据库
Session Affinity:  None
Events:            <none>

        上面配置就是将外部 IP 地址和服务引入到 k8s 集群内部,由 service 作为一个代理来达到能够访问外部服务的目的。

参考官方文档:服务(Service) | Kubernetes

四、Service 服务发现:coredns 组件详解 

DNS 是什么?

        DNS 全称是 Domain Name System:域名系统,是整个互联网的电话簿,它能够将可被人理解的域名翻译成可被机器理解的 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的 IP 地址。域名系统在现在的互联网中非常重要,因为服务器的 IP 地址可能会经常变动,如果没有了 DNS,那么可能 IP 地址一旦发生了更改,当前服务器的客户端就没有办法连接到目标的服务器了,如果我们为 IP 地址提供一个『别名』并在其发生变动时修改别名和 IP 地址的关系,那么我们就可以保证集群对外提供的服务能够相对稳定地被其他客户端访问。DNS 其实就是一个分布式的树状命名系统,它就像一个去中心化的分布式数据库,存储着从域名到 IP 地址的映射。

CoreDNS 是什么?

        CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能,Kubernetes 就在集群中使用 CoreDNS 解决服务发现的问题。 作为一个加入 CNCF(Cloud Native Computing Foundation)的服务, CoreDNS 的实现非常简单。

验证 coredns

# 把 dig.tar.gz 上传到 node2 和 node1 机器上,手动解压:
[root@k8s-node1 ~]# ctr -n=k8s.io images import dig.tar.gz
[root@k8s-node2 ~]# ctr -n=k8s.io images import dig.tar.gz

[root@k8s-master01 ~]# vim coredns.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dig
  namespace: default
spec:
  containers:
  - name: dig
    image: busybox:1.28
    imagePullPolicy: IfnotPresent
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

# 更新资源清单文件
[root@k8s-master01 ~]# kubectl apply -f coredns.yaml 
pod/dig created

[root@k8s-master01 ~]# kubectl get pods 
NAME                      READY   STATUS    RESTARTS   AGE
client-5d44754c5c-vh5kd   1/1     Running   0          46m
dig                       1/1     Running   0          112s

# 查看默认名称空间的 kubernetes 服务
[root@k8s-master01 ~]# kubectl get svc | grep kubernetes
kubernetes   ClusterIP      10.96.0.1       <none>                                 443/TCP    53d

# 解析 dns,如有以下返回说明 dns 安装成功
[root@k8s-master01 ~]# kubectl exec -it dig -- nslookup kubernetes
Server:		10.96.0.10
Address:	10.96.0.10#53

Name:	kubernetes.default.svc.cluster.local
Address: 10.96.0.1

        在 k8s 中创建 service 之后,service 默认的 FQDN 是 <servicename>.<namespace>.svc.cluster.local,那么 k8s 集群内部的服务就可以通过 FQDN 访问。

参考官方文档:

服务(Service) | Kubernetes

Service 与 Pod 的 DNS | Kubernetes

上一篇文章: 【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(上)_Stars.Sky的博客-CSDN博客

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

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

相关文章

相关数据库

h2 需要用以下 初始化一下 第一次启动需要加入下面代码 h2 创建表 可以直接用jdbc 然后进行测试 不需要链接mysql redis 想要启动redis 现在 该目录下 输入俩个cmd 一个cmd 输入redis-cli 到启动太 输入 shutdown 然后再另一个cmd 输入 redis-server.exe redis.windows.con…

如何利用电商模式,灵活结合当地产品生态全力助农,实现乡村振兴

随着互联网时代的发展&#xff0c;人们的消费观念和消费习惯逐渐被改变&#xff0c;绿色环保观念深入人心&#xff0c;人们加大了对农产品的高要求和高需求&#xff0c;同时&#xff0c;近年来国家对农业的重视和政策支持&#xff0c;促进了农产品电商的蓬勃发展&#xff0c;已…

YOLOV7学习记录之原理+代码介绍

博主计划做一个目标检测跟踪项目&#xff0c;考虑使用YOLO系列模型来作为目标检测器&#xff0c;如今YOLO项目已经更新到了YOLOV7版本&#xff0c;因此便来学习一下相关原理&#xff0c;完成相关实验工作。 论文链接&#xff1a;https://arxiv.org/abs/2207.02696 网络结构 YO…

【字节码】Java Instrumentation 简介 以及 ASM 组合案例

1.概述 本文来自:深入理解JVM字节码 并且对其进行补充。 2.Java Instrumentation简介 JDK从1.5版本开始引人了java.lang.instrument 包,开发者可以更方便的实现字节码增强。其核心功能由java.lang.instrument.Instrumentation 提供,这个接口的方法提供了注册类文件转换器…

python列表添加元素append(),extend(),insert(),+list的区别及说明

这篇文章主要介绍了python列表添加元素append(),extend(), insert(),list的区别及说明&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。 列表添加元素append(),extend(),insert(),list区别 回忆初学python的时候&#xff0c;对列表list添加元素时&#xff0c…

[附源码]Nodejs计算机毕业设计基于web技术的米其林轮胎管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

C# 程序的组织

一 程序的组织 ① 名字控件 程序的逻辑组织&#xff1b; ② 嵌套类型 类中嵌套类型&#xff1b; ③ 程序集 程序的物理组织&#xff1b; 二 名字空间 1 名字控件的概念 逻辑划分&#xff1b;避免名字冲突&#xff1b; 2 名字空间的声明 namespace xxx.xxxxx{} 可嵌套 3 …

Jmeter 性能测试之阶梯式场景、波浪式场景

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 1 阶梯式场景&#xff08;负载测试&#xff09; 该场景主要应用在负载测试里面&#xff0c;通过设定一定的并发线程数…

云游戏拉开产业化大幕

配图来自Canva可画 在过去十多年间&#xff0c;音乐和视频已经完成了线下存储到线上串流的变迁&#xff0c;VCD、CD、MP3也早已成为有历史记忆的收藏品&#xff0c;然而游戏业的“革命”——云游戏行业才刚刚开始。 尤其是随着5G和边缘计算的发展&#xff0c;更高的带宽、更低…

cubeIDE开发, 定时器TIM与外部中断NVIC实践案例

一、定时器功能 1.1 定时器分类 STM32 的定时器分为高级定时器、 通用定时器 、基本定时器三种。 这三个定时器成上下级的关系&#xff0c;即基本定时器有的功能通用定时器都有&#xff0c;而且还增加了向下、向上/向下计数器、PWM生成、输出比较、输入捕获等功能&#xff1b;而…

高并发编程之多线程锁和CallableFuture 接口

5 多线程锁 5.1 锁的八个问题演示 package com.xingchen.sync;import java.util.concurrent.TimeUnit;class Phone {public static synchronized void sendSMS() throws Exception {//停留4秒TimeUnit.SECONDS.sleep(4);System.out.println("------sendSMS");}publ…

AXI协议规范超详细中文总结版

link AXI协议规范中文翻译版 来源&#xff1a;https://github.com/lizhirui/AXI_spec_chinese 综述 本文参考分析整理总结了AMBA AXI and ACE Protocol Specification文档的AXI总线协议规范部分&#xff0c;错误之处欢迎指出。 AMBA AXI协议支持高性能高频的系统设计&#xff0…

【视觉高级篇】25 # 如何用法线贴图模拟真实物体表面

说明 【跟月影学可视化】学习笔记。 什么是法线贴图&#xff1f; 法线贴图就是在原物体的凹凸表面的每个点上均作法线&#xff0c;通过RGB颜色通道来标记法线的方向&#xff0c;你可以把它理解成与原凹凸表面平行的另一个不同的表面&#xff0c;但实际上它又只是一个光滑的平…

巧用 Chrome:网络知多少

开发者如数家珍的工具中&#xff0c;Chrome 想必是众多人心目中的白月光&#xff0c;倒也不是它有多么优秀&#xff0c;而是多亏同行浏览器们的衬托。其开源的内核 Chromium 也成就众多养家糊口的岗位&#xff0c;比如 Edge、Opera、QQ 浏览器、360 浏览器等等国内外一票浏览器…

物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步&#xff1a;环境搭建。 关键字&#xff1a;3.2寸SPI串口TFT液晶显示屏模块 ILI9341驱动 LCD触摸屏 240*320 LVGL图形化编程 XPT2046触摸屏芯片IC 二、环境 ESP…

实机安装CentOS7.9操作系统图文(保姆级)教程

一、制作启动U盘 1、下载Ventoy软件 去Ventoy官网下载Ventoy软件&#xff08;Download . Ventoy&#xff09;如下图界面 ​ 2、制作启动盘 选择合适的版本以及平台下载好之后&#xff0c;进行解压&#xff0c;解压出来之后进入文件夹&#xff0c;如下图左边所示&#xff0c…

Hive 之数据透视表

文章目录什么是数据透视表&#xff1f;创建数据源基于各产品在各个平台半年内的月销售额与汇总&#xff0c;制作数据透视表什么是数据透视表&#xff1f; 数据透视表是一种工具&#xff0c;用于帮助用户理解和分析大量数据。它通常是一个二维表格&#xff0c;可以让用户以不同…

java计算机毕业设计springboot+vue航空公司电子售票系统-机票预订系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以远程教育系统的实际应用需要出发,架构系统来改善现远程教育系统工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的架构能够对多媒体课程进…

手把手教你使用SpringBoot做一个员工管理系统【代码篇·下】

手把手教你使用SpringBoot做一个员工管理系统【代码篇下】1.增加员工实现2.修改员工信息3.删除员工4.404页面配置5.注销1.增加员工实现 新增添加员工的按钮&#xff1a; <h2><a class"btn btn-sm btn-success" th:href"{/addemp}">添加员工&…

0- LVGL移植基于野火STM32F429挑战者(LVGL8.2)

1-移植准备 LVGL8.2 野火STM32F429_v2开发板 因为ST在STM32F4之后所有的芯片都不在有标准库,因此本篇是基于HAL库的。同时现在有许多厂商都不在有标准库了,都是根据自己的开发环境进行一些基本芯片接口的配置。像NXP,ST等。 这里不过多介绍LVGL,既然看到这个文章,大多数是…