一、前言

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. 排序算法整理C++(初赛)

    排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序. 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1 ...

  2. KingbaseES 与 Oracle 用户口令管理与资源管理

    一.概述 KingbaseES可以对用户口令与用户占用资源进行必要的管理.其管理方式,在这里与Oracle数据库进行参考比较. KingbaseES 使用扩展插件建立的系统参数,这组参数可以对数据库资 ...

  3. JTS TopologyException 问题

    计算2个几何相交结果时候,报错了: val geometry = polygon.intersection(lineString) 日志如下 org.locationtech.jts.geom.Top ...

  4. ElasticSearch介绍和基本用法(一)

    ElasticSearch 引言 1.在海量数据中执行搜索功能时,如果使用MySQL, 效率太低. 2.如果关键字输入的不准确,一样可以搜索到想要的数据. 3.将搜索关键字,以红色的字体展示. 介绍: ...

  5. ProxySQL 配置MySQL节点

    转载自:https://www.jianshu.com/p/ca1b78b5d615 可以在mysql_servers表和mysql_replication_hostgroups表(可选)中配置后端的 ...

  6. Logstash:使用Logstash将电子邮件导入到Elasticsearch

  7. 第六章:Django 综合篇 - 6:会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  8. Maven快速配置和入门

    概念 Maven其实就是一个管理项目.构建项目的工具.它有标准化的项目结构.构建流程.依赖管理. 功能 Maven提供了一套标准的项目结构 Maven提供了一套标准的构建流程 Maven提供了更便捷的 ...

  9. PAT (Advanced Level) Practice 1001 A+B Format 分数 20

    Calculate a+b and output the sum in standard format -- that is, the digits must be separated into gr ...

  10. Skywalking Swck Agent注入实现分析

    项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project ...