Kubernetes-提供服务的方式

通过实例快速掌握k8s(Kubernetes)核心概念 容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流。Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词。但它在开始的时候并没有很好地解决容器的集群问题。Kubernetes抓住了这个机遇,以容器编排者(Container Orchestration)的身份出现,对容器集群进行管理和调度,现在已经打败了Docker成为了容器技术事实上的标准。当然K8... 阅读详情

目录

一. 直接访问Pod的IP地址

二. 通过Service访问

1. ClusterIP类型

2. NodePort类型

3. Ingress类型


一. 直接访问Pod的IP地址

Kubernetes中的最小单位是Pod,所有的应用也是运行在Pod中的

每个Pod都会被分配一个唯一的IP地址

创建一个Pod

cat nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx-pod
  name: nginx-pod
spec:
  containers:
  - image: 172.16.2.100:30050/library/nginx:latest
    imagePullPolicy: Always
    name: nginx
    ports:
    - containerPort: 80
      name: nginx
      protocol: TCP

kubectl create -f nginx-pod.yaml

查看Pod的详细信息

[root@k8s-node1 example]# kubectl get pod -owide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          26s   172.17.76.14   k8s-node2   <none>           <none>

可以看到该Pod分配一个IP地址,在另一个容器中可以正常访问该地址

[root@k8s-node1 ~]# kubectl --namespace=admin exec -it lnbkobka-session-jzqnd bash
[root@lnbkobka-session-jzqnd ~]# curl 172.17.76.14
<p>Hello Nginx</p>

(这种方式基本上不使用)

Pod的IP地址是一个随机分配的内网地址,只能在容器内部访问

并且正常场景下为了保证服务的可用性会通过deployment(statefulset)等来创建Pod,保证Pod的数量,而不会单独创建Pod

二. 通过Service访问

应为Pod是最小的单元如果在Pod中容器出现异常终止了是不会重启,在实际使用场景下基本不会直接使用Pod而是使用Deployment部署自己的应用

Deployment是对一组Pod集群的管理,可以保证环境中一直存在指定数量的Pod(比如当pod所在的node节点关机,则deployment会在其他节点重新启动Pod)

创建deployment

[root@k8s-node1 example]# cat nginx-dp.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    k8s-app: nginx-dp
  name: nginx-dp
spec:
  replicas: 2  // 表示当前deployment有2个副本
  selector:
    matchLabels:
      k8s-app: nginx-dp
  template:
    metadata:
      labels:
        k8s-app: nginx-dp
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80
          name: nginx
          protocol: TCP

查看deployment

[root@k8s-node1 example]# kubectl get deployments
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-dp   2/2     2            2           8s

// 查看Pod信息
[root@k8s-node1 example]# kubectl get pod -owide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-dp-78c4f884c8-qwh8m   1/1     Running   0          20s   172.17.86.12   k8s-node1   <none>           <none>
nginx-dp-78c4f884c8-sbvzz   1/1     Running   0          20s   172.17.76.14   k8s-node2   <none>           <none>

可以看到该Deployment下有2个Pod分别运行在两个Node节点上

手动删除一个Pod

[root@k8s-node1 example]# kubectl delete pod nginx-dp-78c4f884c8-qwh8m
pod "nginx-dp-78c4f884c8-qwh8m" deleted

[root@k8s-node1 example]# kubectl get pod -owide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-dp-78c4f884c8-n4czv   1/1     Running   0          14s   172.17.86.12   k8s-node1   <none>           <none>
nginx-dp-78c4f884c8-sbvzz   1/1     Running   0          96s   172.17.76.14   k8s-node2   <none>           <none>

可以看到删除Pod后又自动创建了一个Pod(对于Deployment管理还可以进行Pod扩容,升级等操作)

从上面可以看到deployment只负责Pod的管理,本身并没有IP地址,但是deployment下会存在多个Pod,每个Pod的地址都不一样,如果存在扩容等操作后,扩容的Pod的地址也是随机生成的,不可能记住所有的Pod的地址

Kubernete Service 是一个定义了一组Pod的策略的抽象,我们也有时候叫做宏观服务。这些被服务标记的Pod都是(一般)通过label Selector决定的,举个例子,我们假设有一个tomcat的应用,通过deployment部署,有三个副本。对于需要调用tomcat服务的应用(比如nginx)来说,不需要关注这个tomcat有几个pod,而是通过一个固定的地址访问,当tomcat的pod发生变化时,nginx不需要关注,使用固定的地址仍然可用继续访问

Service根据使用方式有几种类型

1. ClusterIP类型

创建一个service

[root@k8s-node1 example]# cat nginx-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
  - name: nginx
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    k8s-app: nginx-dp
  type: ClusterIP


[root@k8s-node1 example]# kubectl create -f nginx-svc.yaml 
service/nginx-svc created

查看Service信息,可用看到service分配了一个cluster-ip

[root@k8s-node1 example]# kubectl get service nginx-svc 
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx-svc   ClusterIP   10.10.207.26   <none>        80/TCP    10s

在其他容器中访问clusterIP

[root@k8s-node1 ~]# kubectl --namespace=admin exec -it lnbkobka-session-jzqnd bash
[root@lnbkobka-session-jzqnd ~]# curl 10.10.207.26
<p>Hello Nginx</p>

可用看到通过clusterip访问也可以正常访问,但是clusterip仍然是内网IP,只能通过容器内部访问(也可以直接通过service-name访问,k8s内部会自动进行域名解析)

这种方式一般适用于不需要对外的服务,比如mysql,redis等

 

2. NodePort类型

nodeport类型的service和clusterip相比多了一个nodeport属性,会在所有的node节点开放nodeport端口,通过访问物理机的端口达到访问容器的效果

创建nodeport类型的service(service yaml中可以手动定义nodeport,范围在30000-32767,不过这种方式容易冲突,不定义的话kubernetes会自动生成一个)

[root@k8s-node1 example]# cat nginx-svc-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-nodeport
spec:
  ports:
  - name: nginx
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    k8s-app: nginx-dp
  type: NodePort

[root@k8s-node1 example]# kubectl create -f nginx-svc-nodeport.yaml 
service/nginx-svc-nodeport created

[root@k8s-node1 example]# kubectl get service nginx-svc-nodeport 
NAME                 TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-svc-nodeport   NodePort   10.10.133.76   <none>        80:32117/TCP   14s

查看service可以看到多了一个32117的端口,在物理机上查看该端口的状态,可以看到在监听中

[root@k8s-node1 example]# lsof -i:32117
COMMAND     PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
kube-prox 27278 root   33u  IPv6 120151742      0t0  TCP *:32117 (LISTEN)

在物理机上访问物理机IP:NodePort,可以看到在物理机上通过nodeport已经可以访问到容器的服务

[root@k8s-node1 example]# curl 127.0.0.1:32117
<p>Hello Nginx</p>

由于nodeport会在每个节点上进行监听,所以任意一个nodeip+nodeport都可以访问

在实际环境中,我们一般会使用keepalived对node节点做vip,通过vip访问,或者单独搭建一个nginx,通过nginx进行负载均衡

3. Ingress类型

Kubernetes(k8s)之Service服务类型 本文介绍了Kubernetes中四种Service类型及其特点:1) ClusterIP(默认类型),通过集群内部IP暴露服务;2) NodePort,通过节点IP和端口(30000-32767)暴露服务;3) LoadBalancer,利用云服务商负载均衡器暴露服务;4) ExternalName。重点演示了ClusterIP和NodePort的配置方法,包括YAML文件编写和kubectl命令操作,并展示了如何通过iptables查看服务路由规则以及测试负载均衡算法。文章还对比了不同服务类型的适用场景, 阅读详情

相关推荐

k8s部署的4方案

k8s部署方案

m0_55877125的博客 3652

k8s-4:暴露服务的三种方式

前面说的k8s的网络分为三种:cluster、node和pod ip,那k8s是怎样使用这三种网络对外提供服务的?有些图片是人家的借来用用,省的自己画。 k8s对外暴露服务的方式有三种: NodePort 将服务的类型设置成NodePort-每个集群节点都会在节点上打 开 一个端口, 对于NodePort服务, 每个集群节点在节点本身(因此得名叫NodePort)上打开一个端口,并将在该端口上接收到的流量重定向到基础服务。该服务仅在内部集群 IP 和端口上才可访间...

软件界的鼬神 5654

【云原生之kubernetes实战】在k8s下部署Gitblit服务器

【云原生之kubernetes实战】在k8s下部署Gitblit服务器

jks212454的博客 2126

k8s对外提供服务的方式

Ingress 是一种 API 对象,定义了如何将外部流量引导到集群中的 Service。Ingress 可以通过不同的规则和路径将请求路由到不同的 Service。字段指定外部 IP 地址,该地址将映射到 Service 的 ClusterIP。这种方式仅适用于某些特殊场景,因为它涉及到手动配置和管理外部 IP。允许将服务映射到集群外的某个外部 DNS 名称。它不提供负载均衡和服务发现,而是充当 DNS 别名。Kubernetes (K8s) 提供了多种方式来向外部提供服务。来实现高级的路由和负载均衡。

完颜振江 1131

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 315

基于ESP32-P4的低成本旋转式激光雷达系统设计

激光雷达(LiDAR)作为机器人环境感知的核心传感器,其本质是融合光学测距、机电控制与实时数据处理的嵌入式系统。理解时间飞行(ToF)原理与机械旋转耦合机制,是实现高精度点云采集的基础;而系统级误差源——如计时抖动、电机惯性、信号串扰和温漂——直接决定实际建图鲁棒性。在资源受限场景下,选用RISC-V双核MCU(如ESP32-P4)可兼顾实时控制与网络服务能力,通过硬件时间戳捕获、S型加减速轨迹规划、旋转变压器供电及双Bank OTA等工程手段,有效平衡分辨率、帧率与稳定性。本文围绕360°旋转式激光雷达的

weixin_36231030的博客 431

k8s中对外暴露服务的三种方式

先说总结后面内容慢慢补 1,通过Nodeport方式 2,通过LoadBalance方式 3,通过ingress方式 ingress只不过是k8s实现7层代理的工具,拿ingress-nginx举例子,他将svc产生的资源的cluster-ip,通过7层代理的方式(例如nginx反向代理),统一用ingress-control与集群外部进行对接, 本质上ingress想与集群外部访问,仍然需要k8s集群的特性对外提供服务, 而且想要通过ingress方式直接让集群外部进行访问,仍然需要集群外部单独的dns服

weixin_45629044的博客 2364

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1687

k8s的“前端”——ingress

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

小柏ぁ的博客 2926

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1904

再有谁说不会 k8s 四种 Service 类型!就把这个给他扔过去

在 Kubernetes 中,四种 Service 类型(ClusterIP、NodePort、LoadBalancer、ExternalName)没有绝对的“好用类型”,而是根据具体o业务场景需求来选择最合适的类型。Kubernetes 提供了四种主要的 Service 类型,每种类型适用于不同的使用场景。Kubernetes Service 的 ExternalName 类型是一种特殊的 Service 类型,用于将集群内部的服务映射到集群外部的 DNS 名称,而不是将流量路由到集群内的 Pod。

民工哥的博客 1948

GEE:使用 CCDC 算法进行连续变化检测和分类

连续变化检测和分类(CCDC)算法是一种广泛应用于遥感数据分析的方法,可以用于检测土地覆盖变化、农作物生长状态的变化以及水资源的变化等。Google Earth Engine是一个强大的云端平台,提供了丰富的遥感数据和工具,可以用于执行各种类型的遥感数据分析。本文将介绍如何使用Google Earth Engine的CCDC算法进行连续变化检测和分类。

养乐多的博客 5677

K8S通过Ingress用域名的方式对外网提供服务

1、环境准备: KBS已经部署了DNS插件,私有仓库等 2、编辑好如下配置文件,注意标红的部份 [root@k8s1 deploy]# cat namespace.yaml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx [root@k8s1 deploy]# cat default-backend.yaml ...

lsysafe的博客 9352

认知建模:模拟人类决策过程的AI方法

认知建模的目的在于构建能够模拟人类认知和决策过程的模型,通过AI技术将人类的思维、判断和选择等过程以数字化的形式呈现出来。其范围涵盖了多个领域,包括心理学、人工智能、经济学、管理学等。在心理学领域,认知建模可以帮助研究人员更好地理解人类的认知机制;在人工智能领域,可用于开发具有更智能决策能力的系统;在经济学和管理学中,能辅助进行市场预测、战略规划等决策制定。本文首先介绍认知建模的背景知识,让读者对该领域有初步的了解。接着阐述核心概念和它们之间的联系,通过示意图和流程图直观展示。

AI 算法实战派 1165

bash: huggingface-cli: command not found... 解决方案

本文主要介绍了bash: huggingface-cli: command not found… 解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

k8s为外界暴露服务

http://www.ctoutiao.com/98480.html   k8s服务访问的3种方式;  

xiaofang2015的博客 1595

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Kubernetes(K8S)基础知识

本文介绍了Kubernetes(K8S)的基本概念、主要功能、架构以及网络通信相关的基础知识,在K8S中Pod是最小的管理单元,Pod内的容器间处于同一个网络空间内可以相互通过localhost+端口直接访问,同一个Node的Pod通过虚拟以太网桥接进行相互访问,跨Node的Pod间通过虚拟以太网对桥接到节点的以太网卡实现跨节点访问。K8S中Service是对外提供服务的虚拟IP加端口映射到集群节点的静态端囗,集群外部可以通过:访问Service。

老猿Python 1593

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

k8s 查看ip地址属于哪个pod_Kubernetes 服务中Pod的三种访问方式介绍

在Kubernetes 服务中创建的 Pod 对外提供网络访问的方式:直接使用Pod的IP地址和端口访问。使用与Pod绑定的ClusterIP和端口访问。使用K8S集群中的主机IP地址和端口访问。这三种情况,分别对应着K8S 服务中不同的网络设置。一、Deploy 中设置ContainerPort如果只在 Demployment 的 yaml 文件中配置ports:containerPort;不另...

weixin_39716417的博客 1569

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群

搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群

风水道人 479

本地IDE服务调用部署在k8s中的其他服务方案

本地IDE服务调用部署在k8s中的其他服务方案

Devin's Blog 633

Containerd方式部署K8s集群

Kubernetes (k8s) 是一个强大的开源平台,用于自动化部署、扩展和管理容器化应用程序。它支持多种容器运行时,其中 Containerd 是一个高效、开源的容器运行时,专为生产环境设计,提供健壮的容器生命周期管理。Containerd 作为 Kubernetes 集群中的容器运行时,负责创建、运行和监控容器,同时与 Kubernetes 的其他组件无缝协作,确保容器化应用程序的高效运行和资源优化。

weixin_72583321的博客 2368

dubbo k8s 服务发现_Dubbo 在 K8s 下的思考

序言Dubbo在2011开源之后,一直是国内最受欢迎的RPC框架,之后spring boot和Spring Cloud的面世,助推了微服务的火热程度。计算机的世界变化很快,自从容器和K8s登上舞台之后,给原有的RPC领域带来了很大的挑战。这个文章主要讲述RPC领域遇到的问题,以及RPC怎么去拥抱K8s怀抱的一些思考。K8S介绍kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应...

weixin_39714763的博客 615

关于 K8s 的一些基础概念整理【k8s系列之一】

本文简单介绍了几个关于 K8s 的基础概念,后续再有其他的会持续补充。

欢迎来到橙子家的博客。 1352

【中间件】K8S-kubernetes

一、概念 1、为什么使用k8s 生产型应用会涉及多个容器。这些容器必须跨多个服务器主机进行部署 可以构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。 是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展 2、K...

USTSD的博客 572

kubernetes-2-搭建k8s集群

二、搭建k8s集群 2.1 平台规划 1.单master集群 2.多master集群(高可用集群) 2.2 服务器硬件要求 2.3 部署方式 2.3.1. Kubeadm工具安装 官方的部署k8s工具, 用于快速部署 第一、创建一个 Master 节点 kubeadm init 第二、将 Node 节点加入到当前集群中 $ kubeadm join <Master 节点的 IP 和端口 > 1. 前置条件 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:

文杰的博客 970
上一篇: Kubernetes-ResourceQuota配额限制
下一篇: Kubernetes-通过nvidia-docker2使用GPU资源
Aaron.com
博客等级 码龄17年 25粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值