一、定义Service

  1-1、首先创建一个Deployment 类型nginx 

#定义Deployment类型nginx yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.16.1-alpine
name: nginx
ports:
- containerPort: 80 #创建nginx
kubectl create -f nginx_deploy.yaml 

  1-2、定义Service 的yaml文件

#service yaml 文件
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx #匹配pod标签
ports:
- protocol: TCP
port: 80 #service端口
targetPort: 80 #容器端口 #创建service
kubectl create -f service.yaml

  1-3、查看创建Service状态

#查看所有service状态
[root@k8s-master1 opt]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 20h
my-service ClusterIP 10.2.99.129 <none> 80/TCP 10m #只查看上面定义的my-service状态
[root@k8s-master1 opt]# kubectl get svc my-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service ClusterIP 10.2.99.129 <none> 80/TCP 10m

  注:

    该示例为my-server:80即可访问到具有app=myapp标签的Pod的80端口。

    需要注意的是,Service 能够将一个接收端口映射到任意的 targetPort,如果 targetPort 为空,

    targetPort 将被设置为与 Port 字段相同的值。targetPort 可以设置为一个字符串,引用 backend

    Pod 的一个端口的名称,这样的话即使更改了 Pod 的端口,也不会对 Service 的访问造成影响。

Kubernetes Service 能够支持 TCP、UDP、SCTP 等协议,默认为 TCP 协议。

二、Service类型

  2-1、Kubernetes Service Type(服务类型)主要包括以下几种:

      ➢ ClusterIP:在集群内部使用,默认值,只能从集群中访问。

    ➢ NodePort:在所有安装了 Kube-Proxy 的节点上打开一个端口,此端口可以代理至后端

      Pod,可以通过 NodePort 从集群外部访问集群内的服务,格式为 NodeIP:NodePort。

    ➢ LoadBalancer:使用云提供商的负载均衡器公开服务,成本较高。

    ➢ ExternalName:通过返回定义的 CNAME 别名,没有设置任何类型的代理,需要 1.7 或
      更高版本 kube-dns 支持。

  2-2、NodePort类型

    说明:

      如果将 Service 的 type 字段设置为 NodePort,则 Kubernetes 将从--service-node-port-range 参

      数指定的范围(默认为 30000-32767)中自动分配端口,也可以手动指定 NodePort,创建该 Service

      后,集群每个节点都将暴露一个端口,通过某个宿主机的 IP+端口即可访问到后端的应用。

    1)定义NodePort类型的Service  

#定义Service NodePort类型yaml

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort #定义NodePort类型
selector:
app: nginx #匹配pod标签
ports:
- protocol: TCP
port: 80 #service端口
targetPort: 80 #容器端口
nodePort: 30000 #映射nodePort类型自定义端口。如果该项不设置会自动分配NodePort端口 #新定义的NodePort类型刷新
kubectl replace -f service.yaml

  

    2)可以通过以下命令进行设置NodePort 类型端口映射命令如下

kubectl edit svc my-service

    3)查看NodePort端口映射状态

[root@k8s-master1 opt]# kubectl get svc my-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service NodePort 10.2.99.129 <none> 80:30000/TCP 36m

    注:

      80:30000/TCP 这里的30000端口是通过上面设置NodePort类型,端口自定义设置的端口。

      外网访问:可以通过宿主机:映射的端口访问。例如:192.168.3.123:30000端口即可访问nginx

    4)如果不自定义设置NodePort port端口会自动分配端口,分配端口范围是30000-32767。端口自动分配范围设置查看

[root@k8s-master1 opt]# cat /usr/lib/systemd/system/kube-apiserver.service | grep "service-node-port-range"
--service-node-port-range=30000-32767 \

  2-3、使用Service代理k8s 外部服务

    1)使用场景

      ➢ 希望在生产环境中使用某个固定的名称而非 IP 地址访问外部的中间件服务;

      ➢ 希望 Service 指向另一个 Namespace 中或其他集群中的服务;

      ➢ 正在将工作负载转移到 Kubernetes 集群,但是一部分服务仍运行在 Kubernetes 集群之外的 backend。

    2)编辑Service,Endpoints yaml文件

#编辑Endpoints yaml文件
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-svc-external
name: nginx-svc-external
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
sessionAffinity: None
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx-svc-external
name: nginx-svc-external subsets:
- addresses:
- ip: 140.205.94.189
ports:
- name: http
port: 80
protocol: TCP #创建
kubectl create -f nginx-svc-external.yaml

    注:

      Endpoint IP 地址不能是 loopback(127.0.0.0/8)、link-local(169.254.0.0/16)
      或者 link-local 多播地址(224.0.0.0/24)。
                     Service和Endpoints设置 metadata.name 两者名称要保持一致,如果不一致则不能访问

    3)查询创建的Endpoints service状态

[root@k8s-master1 opt]# kubectl get svc nginx-svc-external
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc-external ClusterIP 10.4.96.53 <none> 80/TCP 23s

    4)根据上面查看的状态获取的 CLUSTER-IP,测试是否可以通过IP地址访问外网140.205.94.189

#通过内部service IP地址访问
[root@k8s-master1 opt]# curl 10.4.96.53
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>501 Not Implemented</title></head>
<body bgcolor="white">
<h1>501 Not Implemented</h1>
<p>The requested method to the URL not supported. Sorry for the inconvenience.<br/>
Please report this message and include the following information to us.<br/>
Thank you very much!</p>
<table>
<tr>
<td>URL:</td>
<td>http://10.4.96.53/</td>
</tr>
<tr>
<td>Server:</td>
<td>l3src10.eu6</td>
</tr>
<tr>
<td>Date:</td>
<td>2022/09/21 20:36:57</td>
</tr>
</table>
<hr/>Powered by Tengine</body>
</html> #访问代理IP地址
[root@k8s-master1 opt]# curl 140.205.94.189
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>501 Not Implemented</title></head>
<body bgcolor="white">
<h1>501 Not Implemented</h1>
<p>The requested method to the URL not supported. Sorry for the inconvenience.<br/>
Please report this message and include the following information to us.<br/>
Thank you very much!</p>
<table>
<tr>
<td>URL:</td>
<td>http://140.205.94.189/</td>
</tr>
<tr>
<td>Server:</td>
<td>l3src9.eu6</td>
</tr>
<tr>
<td>Date:</td>
<td>2022/09/21 20:37:13</td>
</tr>
</table>
<hr/>Powered by Tengine</body>
</html>

    注:

      通过测试访问Service Endpoints 代理的外网IP地址和内部service地址访问正常

  示例2、访问外部MySQL数据库

apiVersion: v1
kind: Service
metadata:
name: endpoints-mysql-jdbc
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 3306
name: mysql-endpoints-port ---
apiVersion: v1
kind: Endpoints
metadata:
name: endpoints-mysql-jdbc subsets:
- addresses:
- ip: 192.168.3.10
ports:
- name: mysql-endpoints-port
protocol: TCP
port: 3306

  注:Service yaml文件里面的medata.name 和 Endpoints yaml metadata.name名称需要保持一致

  访问测试:

[root@k8s-master1 www]# kubectl get svc endpoints-mysql-jdbc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
endpoints-mysql-jdbc ClusterIP 10.2.168.42 <none> 3306/TCP 7m5s
[root@k8s-master1 www]# telnet 10.2.168.42 3306
Trying 10.2.168.42...
Connected to 10.2.168.42.
Escape character is '^]'.
J
5.7.27
j#Exl{I!xW,7Vd4vmysql_native_password

三、Igress Controller安装使用

  3-1、官网安装文档:https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

  3-2、可以通过访问把yaml文件创建到本地进行安装,安装的时候上面的yaml文件最好改成国内镜像连接地址

    1)镜像连接地址修改如下(注:如果国外的镜像连接地址可以访问下载修改可以忽略):

image: registry.cn-beijing.aliyuncs.com/dotbalo/controller:v1.2.0

    2)安装创建的ymal文件,创建的yaml文件名称为deploy-ingress.yaml

    deploy-ingress.yaml下载地址:

      链接:https://pan.baidu.com/s/1voXbd2vhbQNU5UmJSSHqJg?pwd=gvrn
      提取码:gvrn

[root@k8s-master1 opt]# kubectl create -f deploy-ingress.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

  3-3、使用域名发布服务

    1)创建一个web服务

kubectl create deploy nginx --image=registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12

    2)暴露服务

kubectl expose deploy nginx --port 80

    注: 如果根据开始(一)的示例进行安装可以忽略创建一个web服和暴露服的操作

    3)创建Ingress

#编辑ingress yaml文件
[root@k8s-master1 opt]# vim web-ingress.yaml apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /
pathType: ImplementationSpecific #创建
[root@k8s-master1 opt]# kubectl create -f web-ingress.yaml
ingress.networking.k8s.io/nginx-ingress created

    4)检查创建的Ingress状态

[root@k8s-master1 opt]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx nginx.test.com 80 10s

  注:在设置Ingress 名称(name)的时候最好是简单明了。例如设置的上面的nginx-ingress名称根据自己业务进行设置

    5)pathType:路径的匹配方式,目前有 ImplementationSpecific、Exact 和 Prefix 方式

      ◆ Exact:精确匹配,比如配置的 path 为/bar,那么/bar/将不能被路由;
      ◆ Prefix:前缀匹配,基于以 / 分隔的 URL 路径。比如 path 为/abc,可以匹配到/abc/bbb 等,比较常用的配置;
      ◆ ImplementationSpecific:这种类型的路由匹配根据 Ingress Controller 来实现,可以当做一个单独的类型,
       也可以当做 Prefix 和 Exact。ImplementationSpecific是 1.18 版本引入 Prefix 和 Exact 的默认配置;
    6)测试创建的Ingress
      1、本地机器解析域名。windows 系统需要找到C:\Windows\System32\drivers\etc下面的hosts文件,
        进行对 nginx.test.com 解析
         k8s集群宿主机IP地址    nginx.test.com(这里域名访问是根据Ingress -host设置的)。
        例如宿主机IP地址是192.168.3.123解析示例:
        192.168.3.123  nginx.test.com
        注:如果提供的域名是正式的域名可以不操作本地机器解析域名
      2、在游览器直接访问nginx.test.com:service端口,例如上面定义的service 端口是30000直接访问
      nginx.test.com:30000即可
    7)创建多域名Ingress 访问示例:
apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /
pathType: ImplementationSpecific
- host: web.test.com
http:
paths:
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /
pathType: ImplementationSpecific

    注:创建多域名访问的时候域名不要重复,创建多域名直接把 - host 行到pathType 行进行复制拷贝重新定义新的域名

    8)创建单个域名多路径

kind: Ingress
metadata:
name: nginx-ingress spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /
pathType: ImplementationSpecific
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /data
pathType: ImplementationSpecific

    注:创建单域名多路径的时候可以直接从- backend 行到pathType行进行复制拷贝,修改路径即可

    9)创建多域名和多路径可以直接通过命令编辑

kubectl edit ingress

    注:打开后根据自己的需求编辑即可

    10)Ingress不添加域名进行访问

apiVersion: networking.k8s.io/v1 # k8s >= 1.22 必须 v1
kind: Ingress
metadata:
name: nginx-ingress-IP spec:
ingressClassName: nginx
rules:
- http:
paths:
- backend:
service:
name: my-service #指的是service名称
port:
number: 80
path: /
pathType: ImplementationSpecific

  

  

  

Kubernetes Service发布的更多相关文章

  1. 通过 Traefik 使用 Kubernetes Service APIs 进行流量路由 (http,https,金丝雀发布)

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247490229&idx=1&sn=ca817054 ...

  2. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  3. 浅谈 kubernetes service 那些事(上篇)

    一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8 ...

  4. 浅谈 kubernetes service 那些事 (下篇)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 五.K8s 1.8 新特性--ipvs ipvs与iptables的性能差异 随着服务的数量增长,IPTables 规则则会成倍增长,这样带来的问题 ...

  5. 【解构云原生】初识Kubernetes Service

    编者按:云原生是网易杭州研究院(网易杭研)奉行的核心技术方向之一,开源容器平台Kubernetes作为云原生产业技术标准.云原生生态基石,在设计上不可避免有其复杂性,Kubernetes系列文章基于网 ...

  6. 第14 章 : Kubernetes Service讲解

    Kubernetes Service 本文将主要分享以下四方面的内容: 为什么需要 K8s service: K8s service 用例解读: K8s service 操作演示: K8s servi ...

  7. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  8. Docker Kubernetes Service 代理服务创建

    Docker Kubernetes  Service 代理服务创建 创建Service需要提前创建好pod容器.再创建Service时需要指定Pod标签,它会提供一个暴露端口默会分配容器内网访问的唯一 ...

  9. spring boot配置service发布服务

    在application.yml中配置 server: port: 8080 context-path: /crm spring: datasource: driver-class-name: com ...

  10. CoreDNS for kubernetes Service Discovery

    一.CoreDNS简介 Kubernetes包括用于服务发现的DNS服务器Kube-DNS. 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求.SkyDNS2的作 ...

随机推荐

  1. DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0

    DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0. 问题解决 ...

  2. 安装centos,ubuntu系统

    安装centos系统 1.首先进入VMware,新建虚拟机,选择典型,然后下一步 2.稍后安装系统,下一步 3.因为此次安装的是centos7.9系统,因此版本选择7 64位,下一步 4.选择虚拟机的 ...

  3. 安装 deepin linux 系统、linux 使用记录

    安装 deepin 深度linux系统 官网:https://www.deepin.org/zh/ 包含了下载ios镜像和安装教程: 最新版本:https://www.deepin.org/zh/do ...

  4. Fiddler自动响应

    自动响应 自带了几个自动响应的规则: regex:(?inx).+.jpg$ # 以jpg结尾 这里写的是正则表达式,所以如果要拦截其他格式只需要改请求文件的后缀名即可. regex:(?inx).+ ...

  5. 宝塔Linux定时shell

    定时清除缓存文件 rm -rfv /www/wwwroot/www.xxx.com/runtime 定时解压,常用于定时恢复站点 解压到当前 cd /www/wwwroot/www.xxx.com t ...

  6. Angular单页应用程式 (SPA)+Azure AD重新导向登入

    一.app.module.ts中设定应用程式 1.将MSAL Angular相关设置封装为auth.module.ts import { NgModule } from '@angular/core' ...

  7. 【SSO单点系列】(7):CAS4.0 二级域名

    CAS4.0 二级域名 一.描述 当cas成功登录后如果访问同一域名下的资源是 被当作同一应用下资源不需要再次请求登录,但是如果二级域名不同会 被当作不同应用在访问 需要请求CAS 在请求时会把TGC ...

  8. c# string.format 中使用$的坑

    string a = "hello}"; string s = string.Format($"{a}"); 上面这种情况,会报格式错误,会把hello}中的} ...

  9. MassTransit - .NET Core 的分布式应用程序框架

    简介 MassTransit 是一个免费的.开源的.NET 分布式应用程序框架.MassTransit 使创建应用程序和服务变得容易,这些应用程序和服务利用基于消息的松散耦合异步通信来实现更高的可用性 ...

  10. windows 系统进行升级之后,如何删除 Windows.old 文件夹。

    首先用鼠标右键点击 C 盘,在弹出的下拉列表里找到"属性"并点击它. 步骤阅读 2 在打开的 C 盘属性里的常规找到"磁盘清理",点击它打开. 步骤阅读 3 这 ...