k8s创建service

  • 一、创建service示例
    • 1.1、已有的deployment
    • 1.2、使用expose创建
    • 1.3、使用yaml创建
    • 1.4、从集群外部访问service
    • 1.5、创建无头服务Headless Service
  • 二、Service的yaml文件定义详解

一、创建service示例

1.1、已有的deployment

在之前已经创建了一个有两个nginx副本数的deployment,如下所示:

[root@k8s-node1 mytestyaml]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           45m
[root@k8s-node1 mytestyaml]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-85ff79dd56-42mh9   1/1     Running   0          38m   10.244.2.62   k8s-node3   <none>           <none>
nginx-deployment-85ff79dd56-gx2dl   1/1     Running   0          44m   10.244.1.68   k8s-node2   <none>           <none>

并且直接访问其IP地址也能够正常的访问到nginx,但是这些Pod的IP地址并不是固定的,如果这个Pod被重新部署的话,他的IP地址是跟着一起变的。如果只是为了对外提供服务,外界不应去关注这个IP地址的变化,最好是能够访问一个固定的IP。

而在k8s中,service就是专门来做这个事情的。

1.2、使用expose创建

我们可以直接expose这个deployment来实现,如下所示:

[root@k8s-node1 mytestyaml]# kubectl expose deployment nginx-deployment
service/nginx-deployment exposed
[root@k8s-node1 mytestyaml]# kubectl get svc
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP   28d
nginx-deployment   ClusterIP   10.96.112.83   <none>        80/TCP    26s

这里已经分配给了nginx-deployment 一个 CLUSTER-IP 为 10.96.112.83 ,端口号依旧是80。
那么我们直接访问这个CLUSTER-IP和端口号就能够访问到nginx了,因为service会自动的帮我们把访问到10.96.112.83:80的请求进行负载均衡,转发到10.244.2.62:80和10.244.1.68:80上去。

无论pod被重新部署或者所扩容与否,即使是IP地址变了,我们依然是可以访问CLUSTER-IP:PORT进行访问的。
如下所示,访问10.96.112.83:80:

[root@k8s-node1 mytestyaml]# curl 10.96.112.83:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

1.3、使用yaml创建

还有一种使用yaml文件的方式来声明service。
如下nginx-service.yaml:

apiVersion: v1
kind: Service
metadata:name: nginx-service       # service的名称,全局唯一
spec:ports:- port: 80             # service暴露的端口号targetPort: 80       # 目标端口号selector:app: nginx
[root@k8s-node1 mytestyaml]# kubectl apply -f nginx-service.yaml
service/nginx-service created
[root@k8s-node1 mytestyaml]# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP   28d
nginx-service   ClusterIP   10.96.164.32   <none>        80/TCP    10s

1.4、从集群外部访问service

上面的yaml文件部署是ClusterIP类型的service,由于这些IP或者端口号都是k8s集群内部的虚拟出来的,因此他只能够用来在k8s集群内部访问,如果需要从集群的外部访问这些service或者Pod,就需要将service部署成为NodePort类型,将集群内部的端口号映射到这台物理机的端口上去,这样就能够直接通过物理机的IP地址+映射的端口号来访问了。

使用NodePort方式的yaml文件如下:
nginx-service2.yaml:

apiVersion: v1
kind: Service
metadata:name: nginx-service       # service的名称,全局唯一
spec:type: NodePort            ports:- port: 80targetPort: 80nodePort: 30080       # 映射到物理机的端口号selector:app: nginx

创建该service

[root@k8s-node1 mytestyaml]# kubectl apply -f nginx-service2.yaml
service/nginx-service created
[root@k8s-node1 mytestyaml]# kubectl get svc -o wide
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        40d   <none>
nginx-service   NodePort    10.96.162.144   <none>        80:30080/TCP   28s   app=nginx

从web页面上访问,因为我开的这个 虚拟机的ip是192.168.56.100,而映射的端口号为30080,所以就访问这地址,如下所示:

显示Welcome to nginx! 访问成功

1.5、创建无头服务Headless Service

Headless Service即无头服务,就是没有ClusterIP的Service,他的作用也不同于普通的Service,不能直接通过ClusterIP访问路由到后端的Pod上去。
而他的作用就是,当客户端通过k8s api访问这个无头服务的时候,会将其通过Label Selector匹配上的Pod列表信息返回给客户端,客户端就能够通过获得的信息,自义定去作出某些操作。

如下为无头服务的yaml文件:

apiVersion: v1
kind: Service
metadata:name: nginx-service       # service的名称,全局唯一
spec:clusterIP: None           # 设置clusterIP为None,就表示它是一个无头服务ports:- port: 80             # service暴露的端口号targetPort: 80selector:app: nginx

创建无头服务

[root@k8s-node1 mytestyaml]# kubectl apply -f nginx-headless-service.yaml
service/nginx-service created
[root@k8s-node1 mytestyaml]# kubectl get svc -o wide
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     SELECTOR
kubernetes      ClusterIP   10.96.0.1    <none>        443/TCP   41d     <none>
nginx-service   ClusterIP   None         <none>        80/TCP    2m24s   app=nginx

查看这个nginx-service的详细信息,可以看到Endpoints已经匹配到了两个后端的Pod地址

[root@k8s-node1 mytestyaml]# kubectl describe svc nginx-service
Name:              nginx-service
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx-service","namespace":"default"},"spec":{"clusterIP":"None",...
Selector:          app=nginx
Type:              ClusterIP
IP:                None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.82:80,10.244.2.77:80
Session Affinity:  None
Events:            <none>

再通过postman对 k8s 的restful api进行访问:
https://192.168.56.100:6443/api/v1/namespaces/default/endpoints/nginx-service
可以看到,访问无头服务,返回的出现了这两个Pod的详细信息

我们也可以通过java程序去使用restful api来访问k8s获取这些信息,这样就能够在应用程序中去定义自己想要的功能了。

二、Service的yaml文件定义详解

apiVersion: v1
kind: Service
metadata:            # 元数据name: string       # service的名称,全局唯一namespace: string  #命名空间,不指定时,默认为defaultlabels:            #自定义标签属性列表- name: stringannotations:       #自定义注解属性列表- name: string
spec:                #详细信息selector: []       #Label Selector配置,将选择具有指定label 标签的Pod作为管理范围type: string       #类型,指定Service的访问方式,默认为Cluster IP,还有NodePort、LoadBalancerclusterIP: string  #当type为clusterIP时,可以手动指定,不指定则自动分配sessionAffinity: string  # 支持session则同一个客户端访问则会转发到同一个Podports:                    #Service需要暴露的端口列表- name: string          # 端口名称protocol: string      # 端口协议,默认TCP,还可选UDPport: int             # 服务监听的的端口号targetPort: int       # 需要转发到后端的Pod端口号nodePort: int         # 当type为NodePort时,这里指定映射到物理机的端口号status:                   # 当spec.type=LoadBalancer时,设置外部负载均衡器的地区loadBalancer:ingress:ip: string          # 外部负载均衡器的ip地址hostname: string    # 外部负载均衡器的主机名

k8s创建service相关推荐

  1. k8s的service端口暴露与代理

    文章目录 1 Service 2 service暴露端口的方式 2.1 clusterIP 2.2 NodePort 2.3 loadbalancer 2.4 lngress 3 kubernetes ...

  2. 7. 丈母娘嫌我不懂K8s的Service概念,让我去面壁

    文章目录 一.Service 简介 1.1 Service 概念 1.2 Service 类型 1.3 Service 基础导论 二.代理 2.1 VIP 和 Service 代理 2.2 代理模式分 ...

  3. Kubernetes(k8s)之Service(服务)

    Service k8s中的Service Service中涉及到的名词 Service的实现 演示环境 IPVS 以ClusterIP模式创建svc 外部访问service的方式 1.通过Node P ...

  4. 万字长文:K8s 创建 pod 时,背后到底发生了什么?

    本文基于 2019 年的一篇文章What happens when ... Kubernetes edition![1]梳理了 K8s 创建 pod(及其 deployment/replicaset) ...

  5. k8s的service网络模型

    概述 在 k8s 中我们暴露服务通常需要借助Service来实现,当我们创建了service后,可以看到会分配一个ClusterIP ,本文主要是一个示例介绍ClusterIP 的网络原理 . 这个示 ...

  6. k8s创建pod - 启动pod的流程

    目录 知识点一:启动一个pod 1.使用命令启动一个nginx pod 1.1.访问刚才创建的pod的nginx服务 1.2.删除deployment 2.将pod里的服务发布出去 首先创建根据yam ...

  7. 企业运维 kubernetes(k8s) 之 service

    目录 1. service 介绍 2. 开启 kube-proxy 的 ipvs 模式 3. 创建 service:(NodePort方式) 4. DNS 插件 Service 5. pod 滚动更新 ...

  8. Kubernetes(k8s)集群部署七、k8s网络通信+service扩展ingress(TLS,认证,地址重写)calico网络插件(允许指定pod访问服务,禁止其他namespace访问服务)

    k8s网络通信 k8s网络通信 1.容器间通信 2.pod之间的通信 2.1同一节点的pod 2.2不同节点的pod之间的通信 flannel网络原理 flannel支持多种后端: 3.pod和ser ...

  9. WCF后续之旅(10): 通过WCF Extension实现以对象池的方式创建Service Instance

    我们知道WCF有3种典型的对service instance进行实例化的方式,他们分别与WCF的三种InstanceContextMode相匹配,他们分别是PerCall,PerSession和Sin ...

最新文章

  1. excel正在等待某个应用程序以完成对象链接与嵌入操作_看完这篇操作系统,和面试官扯皮就没问题了
  2. cmake ubuntu安装卸载升级
  3. 关系到了冰点_疫情下半场,如何修复跌至冰点的亲子关系,让自己和家人活出幸福感?...
  4. ACE_Proactor UDP V2.0
  5. vc2008使用技巧
  6. scp传服务器文件,使用tar、scp和screen在服务器之间传输文件
  7. 非结构化数据上下文中的GraphQL
  8. oracle的merge into
  9. 【CVPR 2019】Strong-Weak Distribution Alignment for Adaptive Object Detection
  10. Java进阶:微服务SpringCloud
  11. 拓端tecdat|R语言互联网金融下的中国保险业数据分析
  12. 给大学生的劝告,你们为何应该开始接触 Unix/Linux
  13. 奶茶店、粥店、火锅店卫生问题频出,如何通过视频监管系统保证群众饮食安全?
  14. 台式计算机的cpu,台式电脑处理器(CPU)性能排行榜
  15. 运营必备九大互联网思维
  16. 计算机窗口关闭不了怎么办,电脑上一直出现这个窗口关都关不掉怎么处理
  17. 新手指南:到国外域名注册商注册域名
  18. python十进制转八进制_Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...
  19. 升级 QPython OH 内核至 Python 3.9
  20. eos 区块链 java 开发_EOS区块链用什么语言开发?

热门文章

  1. 2020年中考英语计算机考试,2020年中考英语听说测试考生问答
  2. error C2533: “XXX::{ctor}”: 构造函数不能有返回类型
  3. PLSQL下无法选择数据库(附PLSQL64位安装包和汉化包)
  4. 加密和杂凑(Hashing)有什么不一样?
  5. 跟着团子学SAP DMS—在SAP中通过DMS上传文档基本操作(CV01N/CV02N/CV03N/CV04N)
  6. 基于模板替换的word文档自动生成
  7. 万洲金业:投资现货黄金的收益与风险如何平衡?
  8. 用友U9 SOA引领企业IT架构全面升级
  9. Magento数据库结构:EAV (转)
  10. 百战RHCE(第一战:Linux基础命令1)