文档章节

Kubernetes(五) - Service

喵了_个咪
 喵了_个咪
发布于 06/19 10:15
字数 1502
阅读 213
收藏 1
点赞 0
评论 0

Kubernetes解决的另外一个痛点就是服务发现,服务发现机制和容器开放访问都是通过Service来实现的,把Deployment和Service关联起来只需要Label标签相同就可以关联起来形成负载均衡,基于kuberneres的DNS服务我们只需要访问Service的名字就能以负载的方式访问到各个容器

Kubernetes官方文档:https://kubernetes.io/docs/reference/

Kubernetes官方Git地址:https://github.com/kubernetes/kubernetes

PS:本系列中使用 KubernetesV1.8 RancherV1.6.14

1. Service的三种类型

Service有三种类型:

  • ClusterIP:默认类型,自动分配一个仅cluster内部可以访问的虚拟IP 常用于内部程序互相的访问,比如Gitlab需要访问Redis的postgresql,但是是内部使用的不需要外部访问,这个时候用ClusterIP就比较合适

  • NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过<NodeIP>:NodePort来访问改服务 当我们的Gitlab需要提供访问,可以使用NodePort指定一个端口释放服务,然后外层负载均衡映射就可以在外部访问,或者直接访问对应的端口

PS:NodePort方式暴露服务的端口的默认范围(30000-32767)如果需要修改则在apiserver的启动命令里面添加如下参数 –service-node-port-range=1-65535

  • LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到<NodeIP>:NodePort LoadBalancer是NodePort的升级版本,相当于和cloud provider结合不需要手动指定

我们经常使用的还是上面前两种方式,我们先创建一个nginx-deployment镜像2个Pod以便于接下来的使用

> vim nginx-deployment.yaml

apiVersion: extensions/v1beta1                  # K8S对应的API版本
kind: Deployment                                # 对应的类型
metadata:
  name: nginx-deployment
  labels:
    name: nginx-deployment
spec:
  replicas: 2                                   # 镜像副本数量
  template:
    metadata:
      labels:                                   # 容器的标签 可和service关联
        app: nginx
    spec:
      containers:
        - name: nginx                          # 容器名和镜像
          image: nginx
          imagePullPolicy: Always

> kubectl create -f nginx-deployment.yaml

我们分别修改一下对应的输出

> echo nginx1 > /usr/share/nginx/html/index.html
> echo nginx2 > /usr/share/nginx/html/index.html

安装好ping 和 curl

> apt-get update
> apt-get install curl iputils-ping

2. ClusterIP

> vim test-clusterip-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: test-clusterip-service             # 名称
  labels:
    name: test-clusterip-service
spec:
  type: ClusterIP                               # 开发端口的类型
  selector:                                     # service负载的容器需要有同样的labels
    app: nginx
  ports:
  - port: 80                                    # 通过service来访问的端口
    targetPort: 80                              # 对应容器的端口
> kubectl create -f test-clusterip-service.yaml
service "test-clusterip-service" created
> kubectl get service
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes               ClusterIP   10.43.0.1      <none>        443/TCP   12d
test-clusterip-service   ClusterIP   10.43.202.97   <none>        80/TCP    18s

应为selector关联上了Deployment的Label所以直接访问是可以访问到的具体nginx镜像内,而且应为是两个Pod所以是负载均衡之前我们修改了输出多次访问可以看到不一样的结果,基于Kube-DNS也可以使用Service名称进行访问

root@nginx-deployment-68fcbc9696-wbgxr:/usr/share/nginx/html# curl 10.43.202.97
nginx2
root@nginx-deployment-68fcbc9696-wbgxr:/usr/share/nginx/html# curl test-clusterip-service
nginx1

3. NodePort

NodePort设计出来的主要目的就是对外部放出服务,也就是被外部能够访问到,

> vim test-nodeport-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: test-nodeport-service             # 名称
  labels:
    name: test-nodeport-service
spec:
  type: NodePort                               # 开发端口的类型
  selector:                                     # service负载的容器需要有同样的labels
    app: nginx
  ports:
  - port: 80                                    # 通过service来访问的端口
    targetPort: 80                              # 对应容器的端口
    nodePort: 30080                             # 对应需要放到宿主机IP上的端口

> kubectl create -f test-nodeport-service.yaml
service "test-nodeport-service" created
> kubectl get service
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP   10.43.0.1      <none>        443/TCP        12d
test-clusterip-service   ClusterIP   10.43.202.97   <none>        80/TCP         14m
test-nodeport-service    NodePort    10.43.101.60   <none>        80:30080/TCP   5s

此时在宿主机上的30080端口就可以访问到我们的两个Nginx容器了,如果机器绑定的有IP的话就可以直接访问或者在使用负载均衡对外放出服务

只有在KUbernetes中才会受到Kube-DNS的影响,在宿主机上无法使用test-nodeport-service访问Service只能通过NodePort进行访问

[root@k8s-m ~]# curl 127.0.0.1:30080
nginx2
[root@k8s-m ~]# curl 127.0.0.1:30080
nginx1

4. Ingress

Service主要是处理4层TCP负载,但是往往对外需要放出HTTP七层协议的服务,一般我们在一套集群下如果有多个HTTP服务会使用Nginx来统一接受80端口的数据然后通过域名或者是访问路径来选择不同的服务,Ingress就是解决这个问题诞生的,Ingress可以和Service结合对80端口的访问更具域名的过滤和访问路径的过滤路由到对应的service,我们一起看几个例子:

foo.bar.com -> 172.168.0.128 -> / foo    nginx:80
                                / bar    nginx:80
> vim ing.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: nginx
          servicePort: 80
      - path: /bar
        backend:
          serviceName: nginx
          servicePort: 80

> kubectl create -f ing.yaml
> kubectl get ing
NAME      RULE          BACKEND   ADDRESS
test      -
          foo.bar.com
          /foo          nginx:80
          /bar          nginx:80
foo.bar.com --|                 |-> foo.bar.com nginx:80
              | 172.168.0.128   |
bar.foo.com --|                 |-> bar.foo.com nginx:80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
  - host: bar.foo.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80

支持TLS需要使用Secret预先配置好对应的证书

apiVersion: v1
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
kind: Secret
metadata:
  name: testsecret
  namespace: default
type: Opaque
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: no-rules-map
spec:
  tls:
  - secretName: testsecret
  backend:
    serviceName: nginx
    servicePort: 80

使用Ingress能实现部分功能,但是笔者推荐使用网关服务(比如kong)来进行处理会更具灵活功能更下强大可控

小技巧

  • 跨namespace访问Service 到这里我们还没有展开说NameSpace,NameSpace隔离了资源,比如你在A中不能创建两个名字一样的Service(Kubernetes其他资源同理),但是创建出一个NameSpace的是可以创建名字为Nginx的Service的 这个时候你在A空间中访问nginx-service的是A空间的容器,在B空间访问是B空间的nginx-service 但是如果需要在B空间访问A空间的Nginx-service要怎么办呢?

Kube提供在访问Service的时候末尾增加NameSpace名字进行访问,在B空间访问A的nginx-service可以使用nginx-service.A 进行访问

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 240
博文 136
码字总数 178071
作品 4
杨浦
技术主管
服务网与Kubernetes上的Istio分5步

在本文中,我将向您展示一些基本和更高级的示例,说明如何使用Istio平台来提供部署在Kubernetes上的微服务之间的通信。按照Istio网站上的描述,它是: 一个开放的平台,用于连接,管理和保护...

xiaomin0322
前天
0
0
K8S 1.9.0二进制包部署(五)

6、dashboard v1.8.0 在kubernetes目录下有src的压缩包,解压后在cluster/addons/dashboard 下有5个文件 dashboard-controller.yaml dashboard-service.yaml dashboard-secret.yaml dashboa......

sai_2008
02/05
0
0
基于Centos7构建Kubernetes平台

防伪码:我已经过了餐桌上有只鸡就一定能吃到鸡腿的年纪了。 Kubernetes作为Docker生态圈中重要一员,是Google多年大规模容器管理技术的开源版本,是产线实践经验的最佳表现[G1]。如Urs Hlz...

一盏烛光
2017/08/17
0
0
二、简单的示例

一、关闭CentOS防火墙服务 [root@k8s ~]# systemctl disable firewalld [root@k8s ~]# systemctl stop firewalld 二、安装etcd和Kubernetes软件 [root@k8s ~]# yum -y install etcd kubernet......

dgy9151252551
01/09
0
0
必看系列:Kubernetes网络模型原理详解

  导语:Kubernetes目前看来已经成为了docker的应用最多的编排工具,所以学习使用docker容器的话,就免不了使用Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解析关于K...

云栖社区
05/31
0
0
Kubernetes网络模型原理

导语: Kubernetes目前看来已经成为了docker的应用最多的编排工具,所以学习使用docker容器的话,就免不了使用Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解析关于Kub...

先生我不会
05/14
0
0
K8S 1.9.0二进制包部署(三)

4、k8s node #############kubelet cp kubelet /usr/bin/ chmod 755 /usr/bin/kubelet mkdir -p /app/kubernetes/data mkdir -p /app/kubernetes/conf mkdir -p /app/kubernetes/log vi /us......

sai_2008
02/05
0
0
kubernetes 容器介绍与安装(一)

kubernetes 容器介绍与安装(一) 标签(空格分隔): kubernetes系列 一:Kubernetes介绍与功能 1.1: kubernetes介绍 1.2 Kubernetes 主要功能 二:kubernetes基本对象概念 2.1:基于基本对象...

flyfish225
07/12
0
0
手把手教你构建 Kubernetes 1.8 + Flannel 网络(二)

紧接上篇手把手教你构建 Kubernetes 1.8 + Flannel 网络(一) 四.Heapster+InfluxDB+Grafana 注意: 时间不同步 Grafana 查看里面不会有数据 项目地址:https://github.com/kubernetes/hea...

xjtuhit
01/08
0
0
K8S 1.9.0二进制包部署(二)

3、k8s master #############kube-apiserver cp kube-apiserver /usr/bin chmod 755 /usr/bin/kube-apiserver mkdir -p /app/kubernetes/conf mkdir -p /app/kubernetes/log vi /usr/lib/sy......

sai_2008
02/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot项目decorators报错

公司的老项目,用Eclipse开发的,导入IDEA启动之后访问报错如下: Cannot load excludes configuration file "/WEB-INF/decorators.xml" as specified in "sitemesh.xml" or "sitemesh-defa......

酸奶瓶盖儿
刚刚
0
0
Python之父Guido宣布退出核心决策层

昨天,Python 之父 Guido van Rossum 在 Python 邮件组里发邮称,他将退出 Python 核心决策层,而转居幕后。 他在邮件中写道,“我不想再为 PEP(Python 改进提案)[ PEP 572 ] 如此劳心劳力...

全部原谅
刚刚
0
0
saltstack配置文件管理:

1.服务端配置 编辑 top.sls 文件 # vim /srv/salt/top.sls //修改为如下 base: '192.168.192.*': - filetest 新建 filetest.sls 文件 # vim /srv/salt/filetest.sls file-test: file.managed......

硅谷课堂
3分钟前
0
0
Nginx深度优化

隐藏版本号 修改用户与组 网页缓存时间 日志切割 连接超时 更改进程数 网页压缩 防盗链 FPM参数优化 一、隐藏版本号 1.在centos7系统中通过curl命令查看 curl -I http://192.168.100.26 2.修...

Java填坑之路
5分钟前
0
0
Wampserver64位官网下载以及安装配置

WampServer就是Windows Apache Mysql PHP集成安装环境,即在window下的apache、php和mysql的服务器软件。 1、进入Wampserver 官网 网址:https://sourceforge.net/projects/wampserver/ 2、点...

梦梦阁
6分钟前
0
0
垃圾回收算法

一 如何判断对象可以回收 1 引用计数法 思路大概为:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计算器为0的对象就是不可能再被使用...

sen_ye
11分钟前
0
0
Activiti简介(学习总结一)

一、介绍 activiti是使用命令模式设计基于bpmn2.0的一款开源工作流引擎。 工作流简单举例:提交请假申请->经理审批->结束。这就是一个简单流程。activiti支持用户自定义流程。配置各个流程对...

沙shasha
11分钟前
0
0
VCL界面控件DevExpress VCL Controls发布v18.1.3|附下载

DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速开发出完美、...

Miss_Hello_World
13分钟前
0
0
加米谷大数据培训:云计算、大数据和人工智能之间的关系

一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成又不可分割。 一、云计算最初的目标 云计算最初的目标是对资源的管理,管...

加米谷大数据
18分钟前
1
0
java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部