一、前言

kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一个稳定的IP,给集群外访问。

本文所需要的 ingress-controller 的 mandatory.yaml 文件 : https://www.syjshare.com/res/6BFS49US

本文所有涉及的Service的两种部署方式(NodePort和ClusterIP) yaml 文件:https://www.syjshare.com/res/ZLYV4RE7

Service暴露服务的方式一共有四种,如下:

ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。

NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

其中,最常见的两种是 ClusterIP 和 NodePort ,本文实践这种两种方式。

二、NodePort

2.1 新建命名空间

当我们需要开始做一件事情的时候,最好重新建一个命名空间,这样不干扰之前的,如下:

2.2 切换命名空间

# 切换命名空间
kubectl config set-context $(kubectl config current-context) --namespace=myns

2.3 新建Pod和Service并测试

Service

apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
ports:
- port: 81 # 默认就是访问80端口 curl serviceIp 就好
protocol: TCP
targetPort: 8000 # 映射到targetPort为8000 就是上面pod那个
selector:
app: whoami # selector 匹配上模板上的 label

要搞清楚pod-service的关联关系
pod使用的是jwilder/whoami镜像,这个是公开的镜像,没问题
pod和service通过 label-selector 关联起来,pod中定义 app: whoami 这个标签 ,然后servie中通过 selector: app: whoami 这个选择器找到这个标签,selector-label 标签选择器绑定完成之后,就是端口绑定,然后 service 使用的是 80 端口映射到所绑定的pod的8000的端口,就是访问 service 的 80 端口,就是访问 pod 的 8000 端口。

要搞清楚pod的ip地址 service的ip地址 宿主机的ip地址的关联关系

  集群内端口 集群内ip 外网ip 外网port
pod ports: - containerPort: 8000 指定(只能集群内访问) 自动分配(只能集群内访问)
service ports:- port: 80 指定(只能集群内访问) 其中的 targetPort: 8000 映射到pod 自动分配(只能集群内访问) 宿主机静态IP 自动分配30000以上

三、Ingress

3.1 总述

ingress 和 ingress-controller 是两个不同东西,是两个不同的配置文件
ingress -> ingress-controller -> service -> pod

3.2 实践

3.2.1 新建ingressController

kubectl label node m name=ingress
kubectl apply -f mandatory.yaml
kubectl get all -n ingress-nginx

mandatory.yaml 这个yaml文件太大了,不好放在博客里面,读者可以从 https://www.syjshare.com/res/6BFS49US 下载获得。
另外,注意这个 ingress-controller 使用HostPort方式运行 ,所以 mandatory.yaml 文件中有 hostNetwork: true 这句。

3.2.2 创建tomcat的pod和service

创建tomcat的pod和service

vi tomcat.yaml
kubectl apply -f tomcat.yaml
kubectl get svc
kubectl get pods
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat

3.2.3 创建Ingress以及定义转发规则

创建Ingress以及定义转发规则

kubectl apply -f nginx-ingress.yaml
kubectl get ingress
kubectl describe ingress nginx-ingress
#ingress   这个就是extensions/v1beta1,不要修改
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: tomcat.jack.com
http:
paths:
- path: /
backend:
serviceName: tomcat-service
servicePort: 80

3.2.4 测试

chrome浏览器访问这个就好了

3.2.5 再搞一个测试

apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
ports:
- port: 81 # 默认就是访问80端口 curl serviceIp 就好
protocol: TCP
targetPort: 8000 # 映射到targetPort为8000 就是上面pod那个
selector:
app: whoami # selector 匹配上模板上的 label

成功

四、尾声

Service暴露的两种方式,完成了。

ClusterIP 直译就是集群内ip,所以就是 不暴露外部端口,是默认方式;
NodePort 直译就是节点端口,所以就是 虚拟机/宿主机的端口,就是暴露外部端口。
一般来说,Cluster IP是默认的服务类型,所以使用这种更好,但是比较复杂,需要配置 ingress 和 ingress-controlller ,将 ingress 作为入口。

天天打码,天天进步!!

Kubernetes基础_Service暴露的两种方式的更多相关文章

  1. pod(一):Kubernetes(k8s)创建pod的两种方式

    目录 一.系统环境 二.前言 三.pod 四.创建pod 4.1 环境介绍 4.2 使用命令行的方式创建pod 4.2.1 创建最简单的pod 4.2.2 创建pod,指定镜像下载策略 4.2.3 创 ...

  2. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用

    2018年3月19日 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5 ...

  3. kubernetes创建资源的两种方式

    一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令行的方式直接创建,比如: kubectl run httpd-app --image ...

  4. Go基础系列:Go实现工作池的两种方式

    worker pool简介 worker pool其实就是线程池thread pool.对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池. 在线程池模型中,有2个队 ...

  5. centos7下kubernetes(6。kubernetes创建资源的两种方式)

    两种方式:1.命令:2.配置文件 之前我们在部署K8S的时候分别用到了命令和配置文件创建K8s资源: 1.命令方式:kubectl run nginx-deployment --image=nginx ...

  6. [算法基础]斐波那契(recursion+loop)两种方式执行时间对比

    一.斐波那契数列求第n项两种方式 1.递归(自上而下)def recur_fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...

  7. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  8. WebService的两种方式Soap和Rest比较

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  9. WebService的两种方式SOAP和REST比较 (转)

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  10. Docker镜像构建的两种方式(六)--技术流ken

    镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...

随机推荐

  1. Oracle 与 PostgreSQL 函数行为的差异引发性能差异

    对于Oracle,对于数据修改的操作通过存储过程处理,而对于函数一般不进行数据修改操作.同时,函数可以通过 Select 进行调用,而存储过程则不行. 一.对于volatile 函数的行为 1.Ora ...

  2. ELK接收paloalto防火墙威胁日志并定位城市展示

    ELK接收paloalto防火墙威胁日志并定位城市展示 一.准备环境: 搭建好的ELK环境 palo alto防火墙(企业用的) 二.安装logstash并做好过滤 将palo alto日志打到一台c ...

  3. 聊聊单点登录(SSO)中的CAS认证

    SSO介绍 背景 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录. web 系 ...

  4. VMware Component Manager服务无法启动

    近日,给一台Windows 2016上的vCenter打补丁,系统重启后,发现vmware的很多服务无法启动了.这是一台老版本的vcenter,虽然已经2021年了,但是它还管理着一些很老的ESX,比 ...

  5. Exchange如何将邮件转发给外部邮件地址

    Exchange如何将邮件转发给外部邮件地址 最近遇到一个需求.一位已经离职的员工需要将后续的邮件转发给他自己的私人邮箱.安全,行政的审核通过后,这个问题就到了技术部门了. Exchange可以很方便 ...

  6. 【学习笔记】Vin-Mono论文阅读笔记(一)

    VINS-Mono 概述 VINS-Mono VINS-Mono是由一个单目相机和一个低成本IMU组成的鲁棒通用的单目视觉惯性系统.通过融合预积分的IMU测量值和特征观测值来获得高精度的视觉惯性里程计 ...

  7. k8s中节点级别的日志

    容器化应用程序写入到 stdout 和 stderr 中的任何信息,都将被容器引擎重定向到某个地方.例如,Docker 容器引擎将 stdout 和 stderr 这两个输出流重定向到 logging ...

  8. 「国产系统」Tubian 0.3,兼容Windows和Android的GNU/Linux系统!

    0.4版已发布:https://www.cnblogs.com/tubentubentu/p/16741197.html Sourceforge.net主页(提供下载):https://sourcef ...

  9. Do not use “@ts-ignore” because it alters compilation errors的解决办法

    在@ts-ignore上面添加一行代码: // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore

  10. 移动端300ms延迟问题和点击穿透问题

    一.移动端300ms延迟问题: 一般情况下,如果没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟.也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应,而是会 ...