k8s service对象(三)
概述
service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解Pod,RC等资源对象其实都是为讲解Kubernetes Service做铺垫的,下图为Pod,RC与Service的逻辑关系

可以看到上面的架构图,service服务通过标签选择器定位后端pod,前提是service的selector必须和后端Pod标签对应上才能找到相对应的Pod,而前段frontend通过service就可以访问到后端提供服务的pod了,而service默认IP类型为主要分为:
- ClusterIP:主要是为集群内部提供访问服务的
- NodePort:可以被集群外部所访问,访问方式为 宿主机:端口号
kube-proxy一直监控api service所管理的service规则,一旦监视到有变动,kube-proxy会将变动反映至规则当中,而请求的规则有3中:
- userspace

- iptables

- ipvs

下面我创建了一个nginx服务和一个对外提供服务的service,如下:
[root@master ~]# cat nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: serivce-mynginx
namespace: default
spec:
type: NodePort
selector:
app: mynginx
ports:
- name: nginx
port:
targetPort:
nodePort: ---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy
namespace: default
spec:
replicas:
selector:
matchLabels:
app: mynginx
template:
metadata:
labels:
app: mynginx
spec:
containers:
- name: nginx
image: lizhaoqwe/nginx:v1
ports:
- name: nginx
containerPort:
执行yaml文件
[root@master ~]# kubectl create -f test.yaml
service/serivce-mynginx created
deployment.apps/deploy created
查看pod和service状态
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-696bccb9fd-9zk2f / Running 138m
deploy-696bccb9fd-vcgs5 / Running 138m [root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> /TCP 5d23h
serivce-mynginx NodePort 10.103.92.182 <none> :/TCP 138m
验证

headless service
headless service就是无头service(也就是没有ip的service),这种无头服务对于有状态应用来说很重要,我们可以利用service的labels关联后端pod,我们访问的流量就可以直接到达pod而不再需要service负载均衡至后端pod
定义无头服务如下:
-rw-r--r-- root root 3月 : redis.yaml
[root@master redis]# cat redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-service
labels:
app: redis
spec:
ports:
- name: redis-port
port:
clusterIP: None
selector:
app: redis
appCluster: redis-cluster
查看service对应pod的ip地址
[root@master redis]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-app- / Running 13m 10.244.2.28 node2 <none> <none>
redis-app- / Running 16h 10.244.1.24 node1 <none> <none>
redis-app- / Running 16h 10.244.2.25 node2 <none> <none>
redis-app- / Running 16h 10.244.1.25 node1 <none> <none>
redis-app- / Running 16h 10.244.2.27 node2 <none> <none>
redis-app- / Running 16h 10.244.1.23 node1 <none> <none>
查看无头服务
[root@master redis]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> /TCP 17h
redis-service ClusterIP None <none> /TCP 16h
解析service服务,可以看到解析的ip都是后端关联的pod A记录
[root@master redis]# dig redis-service.default.svc.cluster.local @10.96.0.10 ; <<>> DiG 9.11.-P2-RedHat-9.11.-.P2.el7 <<>> redis-service.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:
;; flags: qr aa rd; QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL:
;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION:
; EDNS: version: , flags:; udp:
;; QUESTION SECTION:
;redis-service.default.svc.cluster.local. IN A ;; ANSWER SECTION:
redis-service.default.svc.cluster.local. 30 IN A 10.244.2.27
redis-service.default.svc.cluster.local. 30 IN A 10.244.1.23
redis-service.default.svc.cluster.local. 30 IN A 10.244.1.25
redis-service.default.svc.cluster.local. 30 IN A 10.244.2.28
redis-service.default.svc.cluster.local. 30 IN A 10.244.1.24
redis-service.default.svc.cluster.local. 30 IN A 10.244.2.25 ;; Query time: msec
;; SERVER: 10.96.0.10#(10.96.0.10)
;; WHEN: 六 3月 :: CST
;; MSG SIZE rcvd:
外部访问service的问题
为了更加深刻理解kubernetes,我们需要弄明白kubernetes里的3中IP
- NodeIP:NodeIP是kubernetes中每个节点的物理网卡IP地址,是一个真实存在的物理网络,所有属于这个网络的服务器都能通过这个网络直接通讯,包括集群外的主机访问集群内的主机也需要NodeIP
- PodIP:PodIP是每个Pod地址,它是docker engine根据docker0网桥的IP地址进行分配的,通常是一个虚拟的二层网络,所以kubernetes里的一个Pod里的容器访问另外一个Pod里的容器时,就是通过PodIP所在的虚拟二层网络进行通讯的,而真实的TCP/IP流量是通过NodeIP所在的物理网卡流出的
- ClusterIP:他是一个虚拟的IP,但更像是一个“伪造”的IP网络,原因有以下几点:
- ClusterIP仅仅作用于kubernetes service这个对象,并由kubernetes管理和分配ip地址
- ClusterIP无法被Ping,因为没有一个实体网络对象来响应
- ClusterIP只能结合service Port组成一个具体的通讯端口,如果集群外想访问需要做一些额外的操作
- 在kubernets集群内,NodeIP、PodIP和ClusterIP网之间通讯,采用的是kubernets自己设计的一种编程方式的特殊路由规则
k8s service对象(三)的更多相关文章
- k8s service对象
k8s service对象 概述 service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解 ...
- [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)
首先要明白需要的情景,然后对三种方式进行选择: (一)可以接收Service的信息(获取Service中的方法),但不可以给Service发送信息 (二) 使用Messenger既可以接受Servic ...
- android Service Activity三种交互方式(付源码)(转)
android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread android Service Binder交互通信实例 最下边有源代码: ...
- kubernetes命令式容器应用编排/部署应用/探查应用详情/部署service对象/扩缩容/修改删除对象
部署Pod应用 创建delpoyment控制器对象 [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 ...
- [置顶]
使用kube-proxy让外部网络访问K8S service的ClusterIP
配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是: 修改master的/etc/kubernetes/proxy,把KUBE_ ...
- K8S API对象
POD Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的.Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合 ...
- k8s记录-使用kube-proxy让外部网络访问K8S service的ClusterIP (转载)
配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:修改master的/etc/kubernetes/proxy,把KUBE_P ...
- k8s Service学习
service的概念 kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务.这组pod能够被service访问到,通常通过label se ...
- service对象
Service 对象 提供用于创建服务程序的一组工具 语法 Shell.Service[.property|method] 属性 Description 服务描述,仅限于 Windows 2000 及 ...
随机推荐
- 配置docker服务器支持远程连接
操作系统:linux-ubuntu 参考文档:https://cloud.tencent.com/developer/article/1047265 采用上述文档:非安全的连接方式/服务端配置/通常的 ...
- eclipse C++ 配置自动提示
转:http://www.cnblogs.com/myitm/archive/2010/12/17/1909194.html 定位到:Windows→Preferences→Java→Editor→C ...
- 初学JavaScript正则表达式(十一)
JavaScript的对象属性 整理自慕课网教学 点此进入
- 初学JavaScript正则表达式(四)
字符类 [] 一般情况下正则表达式中一个字符对应字符串一个字符 可以使用元字符 [ ] 来构建一个简单的类 类泛指符合某些特征的对象 例: 'a1b1c1d1'.replace(/[ab ...
- 剑指Offer-26.二叉搜索树与双向链表(C++/Java)
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...
- CF-579 D. "Or" Game
题意: 给一列数,任选一个数,乘x,最多操作k次,问最后a[1]|a[2]|...|a[n]的最大值是多少; 思路: 或运算是0|0=0,1|0=1,0|1=1,1|1=1,那么每次乘一个大于等于2的 ...
- Codeforces Round #552 (Div. 3) EFG(链表+set,dp,枚举公因数)
E https://codeforces.com/contest/1154/problem/E 题意 一个大小为n(1e6)的数组\(a[i]\)(n),两个人轮流选数,先找到当前数组中最大的数然后选 ...
- ES2019 的新特性
JavaScript 不断演变,每次迭代都会得到一些新的内部更新.让我们来看看 ES2019 有哪些新的特性,并加入到我们日常开发中 Array.prototype.flat() Array.prot ...
- Oracle中如何创建数据库
Oracle数据库的物理结构与MySQL以及SQLServer有着很大的不同.在使用MySQL或SQLServer时,我们不需要去关心它们的逻辑结构和物理结构. 但是在使用Oracle的时候,我们必须 ...
- Jenkins自动发送邮件配置及定时构建
前言 在配置之前,我们需要安装好Jenkins,对于如何安装不在赘述,看我之前一篇安装教程(或者找度娘,教程很多).接下来我们开始详细讲解build运行完成后自动发送邮件和定时自动构建build 系统 ...