Kubernetes-Service介绍(二)-服务发现
前言
本篇是Kubernetes第九篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战。
Kubernetes系列文章:
Kubernetes介绍 Kubernetes环境搭建 Kubernetes-kubectl介绍 Kubernetes-Pod介绍(-) Kubernetes-Pod介绍(二)-生命周期 Kubernetes-Pod介绍(三)-Pod调度 Kubernetes-Pod介绍(四)-Deployment Kubernetes-Service介绍(一)-基本概念
服务发现
Kubernetes提供两种客户端以固定方式获取后端访问地址的方式:环境变量和DNS方式。
环境变量
该实验以上文中的nginx-deployment.yaml和nginx-service.yaml为基础;
新建一个Pod资源,文件名为nginx-pod.yaml;
apiVersion: v1
kind: Pod
metadata:
name: nginx-deployment
spec:
containers:
- name: nginx
image: nginx:latest
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
启动该资源;
kubectl apply -f nginx-pod.yaml
进入容器内部,查看系统的环境变量;
#进入容器内部
kubectl exec -it nginx-deployment -- /bin/bash
#查看环境变量
env | grep NGINX

通过环境变量访问服务信息;
curl http://${NGINX_SERVICE_SERVICE_HOST}

DNS方式
通过DNS解析方式在容器内部访问;
curl http://nginx-service.default.svc.cluster.local

相比于环境变量来说,DNS域名格式的Service名称提供的稳定、不变的访问地址,可以简化客户端的应用配置,是Kubernetes推荐的方式。当Service以DNS形式进行访问的时候,需要在集群中存在一个DNS服务器来完成域名到ClusterIP的地址解析工作,kubeadm在初始化的时候已经完kube-dns的安装,这个里要注意一个问题,就是使用busybox解析Service时候,最新版本是有问题的,我采用了1.28.3版本,对于服务中心中是否安装kube-dns可以通过以下方式检查:
#检查deployment
kubectl get deployment --namespace=kube-system
#检查service
kubectl get services --namespace=kube-system
Service在Kubernetes中遵守DNS命名规范,Service的DNS域名表示方法为servicename.namespace.svc.clusterdomain,其中servicename为服务名称,namespace为所在的名空间,clusterdomain为Kubernetes中集群设置的域名后缀,此外如果Service定义中设置了名称,该端口会拥有一个DNS域名,在DNS服务器中保存格式为:_portname._protocol.servicename.namespace.svc.clusterdomain,其值为端口号的数值。

Pod的DNS相关特征
Pod作为集群中提供服务的实体,也可以设置DNS域名,Kubernetes为Pod使用的DNS策略提供很多种方式。
Pod的DNS
对于Pod来说,Kubernetes会为其设置一个pod-ip.namespace.pod.cluster-domain格式的DNS域名,其中Pod的IP需要使用-替换.,我们通过nslookup来证明一下;
查看Pod的IP信息,我们使用niginx-deployment的Pod为案例;
kubectl get pod -o wide

使用nslookup进行验证;
kubectl exec busybox -- nslookup 10-100-1-103.default.pod.cluster.local

对于Deployment和Daement类型的创建的Pod来说,Kubernetes会为每个Pod设置一个DNS域名,格式为pod-ip.deployment-name/daement-name.namespace.svc.cluster-domain,Pod的IP也需要使用-替换.
为Pod设置hostname和subdomain
当前,创建Pod时其主机名取自Pod的metadata.name,在定义Pod的yaml文件中包含一个可选的 hostname 字段,可以用来指定Pod的主机名。 当这个字段被设置时,它将优先于Pod的名字成为该 Pod 的主机名。此外还有一个字段subdomain 字段,可以用来指定 Pod的子域名。
删除所有Pod;
kubectl delete -f nginx-pod.yaml
创建busybox-headless-service.yaml文件,这里Headless Service与Pod子域名保持一致,这样子DNS服务器才会自动创建响应的DNS记录;
apiVersion: v1
kind: Service
metadata:
name: default-subdomain
spec:
selector:
name: busybox
clusterIP: None
ports:
- name: foo # 实际上不需要指定端口号
port: 1234
targetPort: 1234
创建nginx-pod.yaml文件;
apiVersion: v1
kind: Pod
metadata:
name: busybox1
labels:
name: busybox
spec:
hostname: busybox-1
subdomain: default-subdomain
containers:
- image: busybox:1.28.3
command:
- sleep
- "3600"
name: busybox
创建资源;
kubectl apply -f busybox-headless-service.yaml
kubectl apply -f busybox-pod1.yaml
进入Pod检查DNS是否写入,其他Pod就可以通过busybox-1.default-subdomain.default.svc.cluster.local来访问该Pod;
kubectl exec -it busybox1 -- /bin/sh
cat /etc/hosts

Pod的DNS策略
Kubernetes可以通过Pod中dnsPolicy属性指定DNS相关策略,目前支持以下四种策略:
Default: 继承Pod所在的节点的域名解析设置;
ClusterFirst: 优先使用Kubernetes提供的DNS服务(CoreDNS),将无法解析域名转发到系统配置的DNS服务器;
ClusterFirstWithHostNet:适用于以hostNetWork方式运行的Pod;
None:忽略Kubernetes提供的DNS配置,采用自定义的配置方式;
Pod自定义DNS配置
Kubernetes可以通过Pod的dnsConfig属性来自定义DNS相关配置,同时必须指定dnsPolicy为None。
自定义DNS可以在dnsConfig指定以下属性:
nameservers: 用于域名解析DNS服务列表,最多可以设置3个,当 Pod的dnsPolicy设置为none时, 列表必须至少包含一个 IP 地址。配置的nameserver列表与系统自动设置的nameserver自动合并去重;
searches: 用于域名搜索的DNS域名后缀,最多设置6个,也会与系统自动设置的search列表合并去重;
options:配置其他可选的DNS参数,以name或者name/value的形式表示,系统也会自动设置option列表合并去重;
结束
欢迎大家点点关注,点点赞!

Kubernetes-Service介绍(二)-服务发现的更多相关文章
- spring-cloud 学习二 服务发现
注册中心服务发现的例子 添加module pom文件如下 <?xml version="1.0" encoding="UTF-8"?> <pr ...
- Kubernetes - 配置Nginx-Ingress 作为服务发现
添加 Kubernetes ConfigMap配置来自定义端口与服务的映射关系 配置文件, 有二个在默认空间下web服务和api服务分别映射到自定义端口 9001, 9002 apiVersion: ...
- Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现
前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...
- Kubernetes 服务发现
目录 什么是服务发现? 环境变量 DNS 服务 Linux 中 DNS 查询原理 Kubernetes 中 DNS 查询原理 调试 DNS 服务 存根域及上游 DNS 什么是服务发现? 服务发现就是一 ...
- asp.net core系列 61 Ocelot 构建服务发现简单示例
一.概述 Ocelot允许指定服务发现提供程序,如Consul或Eureka. 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口.目前Ocelo ...
- Ocelot(三)- 服务发现
Ocelot(三)- 服务发现 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10907856.html 源码地址:https ...
- 开源服务发现项目Zookeeper,Doozer,Etcd
这篇文章是Jason Wilder对于常见的服务项目发现Zookeeper.Doozer,Etcd所写的一篇博客,其原文地址例如以下:Open-Source Service Discovery. 服务 ...
- SpringCloud接入EDAS——服务发现篇
旁白 很久没有写技术文章了,最近不是写水文就是写小说.说到底,还是最近很少研究技术的缘故,已经到了江郎才尽的地步了. 不过,LZ无意间看到自己团队的小伙伴写的一些文章,觉得还是不错的,于是便动了心思, ...
- k8s服务发现和负载均衡(转)
原文 http://m635674608.iteye.com/blog/2360095 kubernetes中如何发现服务 如何发现pod提供的服务 如何使用kube-dns发现服务 servic ...
随机推荐
- 1day漏洞反推技巧实战(2)
学习存货(2) CVE-2018-11784简单分析之反推的魅力 看着挺有趣的,简单分析下: 通过搜索tomcat漏洞找到: http://tomcat.apache.org/security-7.h ...
- vue 嵌入倒计时组件( 亲测可用 )
由于花费了我不少时间才找到的组件,所以记录一下,后面方便自己好找一些,也算是分享出来给各位前端一起用. npm 下载npm install vue2-flip-countdown --save tem ...
- (4)ElasticSearch在linux环境中搭建集群
1.概述 一个运行中的Elasticsearch实例称为一个节点(node),而集群是由一个或者多个拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力.当有节点加入集群中或者 ...
- 再谈java线程
线程状态 描述 当线程被创建并启动之后,它既不是已启动就进入到了执行状态,也不是一直处于执行状态.在线程的声明周期中有六中状态. java api中java.lang.Thread.State这个枚举 ...
- 基于django2.2的网页构建
安装django pip install django==2.2 建一个在线商城的项目 django-admin startproject pyshop 启动项目 python manage.py r ...
- 深度探索-Redis复制
1.前言 本文介绍了Redis复制的主要流程和设计思想.通过本文的阅读,您大致能理解复制在软件架构方面的通用思想.在阅读本文之前,希望读者首先对Redis有一定的认识,对Redis的事件类型.和事件处 ...
- POJ——3278 Catch That Cow(BFS队列)
相比于POJ2251的三维BFS,这道题做法思路完全相同且过程更加简单,也不需要用结构体,check只要判断vis和左右边界的越界情况就OK. 记得清空队列,其他没什么好说的. #include< ...
- 数据结构逆向分析-Vector
数据结构逆向分析-Vector 这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员. Vector就是一个STL封装的动态数组,数组大家都知道是通过 ...
- windows 中cmd一些特殊命令
chcp 65001 就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp 437 是美国英语 shutdown -s -t 60 60秒后关机 shutdown /a ...
- LINUX服务器 安装定时任务 设置定任务 Liux定时关机
1.先查看是否安装crond yum list installed | grep cron 若没有安装: yum -y install vixie-cron yum -y install cronta ...