Kubernetes Service发布
一、定义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:使用云提供商的负载均衡器公开服务,成本较高。
2-2、NodePort类型
说明:
如果将 Service 的 type 字段设置为 NodePort,则 Kubernetes 将从--service-node-port-range 参
数指定的范围(默认为 30000-32767)中自动分配端口,也可以手动指定 NodePort,创建该 Service
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
注:
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 方式
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发布的更多相关文章
- 通过 Traefik 使用 Kubernetes Service APIs 进行流量路由 (http,https,金丝雀发布)
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247490229&idx=1&sn=ca817054 ...
- ASP.NET Core在Azure Kubernetes Service中的部署和管理
目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...
- 浅谈 kubernetes service 那些事(上篇)
一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8 ...
- 浅谈 kubernetes service 那些事 (下篇)
欢迎访问网易云社区,了解更多网易技术产品运营经验. 五.K8s 1.8 新特性--ipvs ipvs与iptables的性能差异 随着服务的数量增长,IPTables 规则则会成倍增长,这样带来的问题 ...
- 【解构云原生】初识Kubernetes Service
编者按:云原生是网易杭州研究院(网易杭研)奉行的核心技术方向之一,开源容器平台Kubernetes作为云原生产业技术标准.云原生生态基石,在设计上不可避免有其复杂性,Kubernetes系列文章基于网 ...
- 第14 章 : Kubernetes Service讲解
Kubernetes Service 本文将主要分享以下四方面的内容: 为什么需要 K8s service: K8s service 用例解读: K8s service 操作演示: K8s servi ...
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
- Docker Kubernetes Service 代理服务创建
Docker Kubernetes Service 代理服务创建 创建Service需要提前创建好pod容器.再创建Service时需要指定Pod标签,它会提供一个暴露端口默会分配容器内网访问的唯一 ...
- spring boot配置service发布服务
在application.yml中配置 server: port: 8080 context-path: /crm spring: datasource: driver-class-name: com ...
- CoreDNS for kubernetes Service Discovery
一.CoreDNS简介 Kubernetes包括用于服务发现的DNS服务器Kube-DNS. 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求.SkyDNS2的作 ...
随机推荐
- ESModule导入
//导入某方法 import pick from "lodash/pick"; //默认导入方式 import { pick } from "lodash"; ...
- Mongo 常用命令
1.登入 docker exec -it mongo mongo 数据库 db.auth("账号","密码") docker exec -it mongo ...
- SpringBoot的使用
1. Spring Boot概述 目标:了解Spring Boot是什么,有什么作用 小结: Spring Boot是一个便捷搭建 基于spring工程的脚手架:作用是帮助开发人员快速搭建大型的spr ...
- vux方法
vuex 的备注 // vuex的公用数据放置处 state: { count: 0, }, // (方法) 在里面可以去修改state里面的数据(在这里面不能写异步操作) mutations: { ...
- excel快速生成相同内容
先选中你所需要的单元格,如图所示: 输入自己想要的字符,然后按ctrl+enter,如图所示:
- 遍历dom节点
function selectOnchang(obj) { var selectedValue = obj.selectedIndex if (selectedValue == 0) { obj.pa ...
- 如何修改驱动使得NVIDIA Geforce GTX 970, 980, 980 TI and Titan X等显卡可以在Win XP/Win 2003 server x64下驱动?
感谢Matt,一个老外,非常好的修改方法. 本人亲测成功. I recently built a new computer to better accommodate the forthcoming ...
- clearfix解决高度塌陷和外边距重合问题
- Pytorch实战学习(六):基础CNN
<PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili Basic Convolution Neural Network 1.全连接网络 线性层串行-全连接网络 每一个输入和输 ...
- 2022-03-02 关于 react-native 如何使用 react-native-image-crop-picker
前言:react-native项目(下称rn)中需要用到图片裁剪.从相册取照片以及调用手机相机,主要用到这个插件react-native-image-crop-picker. 安装: yarn add ...