一、前言

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. NFS生产环境部署调优

    1.NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源.在NFS的应用中,本地NFS的客户端应用可以透 ...

  2. aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译

    简介 aardio 可以非常方便地调用 .NET( 不需要任何复杂的步骤 ). .NET 在 aardio 中很好用,系统自带 .NET 组件以及各种开源 .NET 组件在 aardio 用户中也很受 ...

  3. Java 多线程:锁(三)

    Java 多线程:锁(三) 作者:Grey 原文地址: 博客园:Java 多线程:锁(三) CSDN:Java 多线程:锁(三) StampedLock StampedLock其实是对读写锁的一种改进 ...

  4. 大根堆的pop&remove&initialize

    1. 定义 [max(min) tree] 一棵树, 其中每个节点的值都大于 (小于) 或等于其 children (如果有) 的值. [max(min) heap] max(min) tree + ...

  5. Kubernetes(K8S)特性有哪些?

    Kubernetes简介 Kubernetes是一个开源的,用于管理云平台中做个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单且高效,Kubernetes提供了应用部署,规划 ...

  6. 不给字段创建索引,字段不存放在source中,字段无法聚合查询等

    某个字段不被搜索,也就是说不想为这个字段建立inverted index(反向索引),可以这么做: PUT twitter { "mappings": { "uid&qu ...

  7. nginx实现vue的web页面项目集群负载

    问题描述 项目是使用前后端分离,前端使用的是vue技术. 想实现的功能是:在前端项目部署的过程中(直接删除项目目录的文件,然后上传新的项目文件),在这个短时间内不能影响用户的使用.所以想到的就是使用n ...

  8. 1-VSCode搭建GD32开发环境

    一.使用VSCode开发GD32的原因 1-单片机开发用的最多的IDE为Keil,而Keil为商用软件,并非开源,而且只支持windows环境,介于当前关系,有断供的风险在. 2-其他IDE类似第1条 ...

  9. iOS Social和Accounts简单使用

    ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *type = [account accountTypeW ...

  10. python的基本运用

    python基础 Python语言是一种解释型.面向对象.动态数据类型的高级程序设计语言 开发者:Guido van Rossum(人称龟叔) 基本概念 1.变量 变量名必须是大小写英文字母.数字或下 ...