kubernetes快速入门7-service资源

网友投稿 262 2022-10-27

kubernetes快速入门7-service资源

kubernetes快速入门7-service资源

因pod有生命周期,客户端的请求不应该指向pod,service就为客户端访问Pod提供一个较固定的端点。service工作依赖于一个附件叫Core-DNS,较老版本中叫Kube-DNS,此附件为service中的名称与集群ip地址提供解析服务。

kubectl向apiserver提交service相关的资源对象信息,并把资源信息保存在etcd中,各工作节点上的 kube-proxy时刻监视(watch)着etcd上相应的资源变更情况,一旦有service相应的资源创建,删除,变化等就把相应资源的变化转换为当前节点上的iptables规划或ipvs规则,使service能够到达相应的Pod资源的目标状态。

service的代理模型

userspace

k8s 1.1之前的版本使用此种模型,工作流程为:

用户空间的客户端pod向内核空间的service发起请求,service会把请求转交给该节点的kube-proxy来调度 kube-proxy调度后又回到service,再向目标pod所在节点的kube-proxy发送请求,依赖iptables规则再调度到相应的pod

iptables

k8s 1.10之前的版本默认使用此种模型,工作流程为:

用户空间的客户端pod向内核空间的service发起请求,直接由service进行调度,并依赖相应节点上的iptables把流量调度到目标pod

ipvs

k8s 1.11版本开始,默认使用此种模型,工作流程为:

用户空间的客户端pod向内核空间的service发起请求,直接由service进行调度,并依赖相应节点上的ipvs把流量调度到目标pod

service资源配置

使用kubectl explain service查看各个字段的帮助说明

KIND: Service VERSION: v1 属于核心组的v1版本 FIELDS: spec ports <[]Object> service端口与后端的pod的端口对应 name 名称 nodePort 当 type设置为NodePort才生效,指定映射到工作节点的端口,默认范围:30000-32767 port 必选项,发布的端口 protocol 协议 targetPort 目标pod使用的端口 selector 关联到哪些标签的Pod sessionAffinity 会话粘性,Supports "ClientIP" and "None" type service的类型,ExternalName, ClusterIP, NodePort, and LoadBalancer. Defaults to ClusterIP

service资源记录格式:

SVC_NAME.NS_NAME.DOMAIN.LTD k8s默认的域名后缀为 svc.cluster.local 如 DaemonSet 章节定义的 svc-redis 服务一样,连接redis的服务域名为 redis.default.svc.cluster.local

service类型

ClusterIP

最为常见的类型,默认使用该类型,该集群IP地址不是配置在某个设备上的地址,而只是出现在Iptables或ipvs中的地址,无法Ping通

NodePort

把pod的端口发布到每一个工作节点上的某个端口(默认范围:30000-32767),使用工作节点的该端口可以向k8s集群外的环境提供相应的服务

LoadBalancer

在aliyun, AWS等这种云环境下部署k8s后可以借助厂商的LBAAS底层接口调用相应的LB服务实现负载

ExternalName

ExternalName类型是service的特例,它没有selector,它将服务映射到一个合法的DNS名称,而不是选择器,集群中查找该服务名称时,coredns返回指向合法DNS的CNAME记录。

适用场景:

希望在生产环境中使用外部的数据库集群,但测试环境使用自己的数据库 希望服务指向另一个 命名空间

如生产环境中使用了第三方提供的云数据库(如RDS),此时就可以定义一个ExternalName类型的service,让集群内部使用的service名称映射到云数据库的地址。

如果k8s集群定义了多个名称空间,跨名称空间的service名称访问就需要带上各自的名称空间的名称,如果都想用一个名称空间的名称(如default)来访问其他名称空间的service,那也需要使用ExternalName类型的service,以下举个这样的事例。

创建命名空间

k8s@node01:~$ kubectl create namespace nginx-test k8s@node01:~$ kubectl get namespace NAME STATUS AGE default Active 4d18h kube-node-lease Active 4d18h kube-public Active 4d18h kube-system Active 4d18h nginx-test Active 76m

配置清单

k8s@node01:~/my_manifests$ cat test/deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: nginx-test spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx01 namespace: nginx-test spec: selector: app: nginx ports: - name: http port: 80 targetPort: http --- apiVersion: v1 kind: Service metadata: name: nginx01-svc namespace: default spec: type: ExternalName externalName: nginx01.nginx-test.svc.cluster.local ports: - name: http8080 port: 8080 targetPort: 80 --- apiVersion: v1 kind: Pod metadata: name: bbox namespace: default spec: containers: - name: busybox image: busybox:latest command: ["/bin/sh", "-c", "sleep 3600"] k8s@node01:~/my_manifests$ kubectl apply -f test/deploy-nginx.yaml deployment.apps/nginx created service/nginx01 created service/nginx01-svc created pod/bbox created

测试服务的名称的解析地址

# 确定集群内coredns的地址 k8s@node01:~$ kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 4d17h k8s@node01:~/my_manifests$ kubectl get svc -n nginx-test NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx01 ClusterIP 10.103.254.90 80/TCP 4m41s k8s@node01:~/my_manifests$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 4d18h nginx01-svc ExternalName nginx01.nginx-test.svc.cluster.local 8080/TCP 4m57s # nginx-test 名称空间中的service名称解析,能正常解析出对应的IP地址 k8s@node01:~$ dig -t A nginx01.nginx-test.svc.cluster.local @10.96.0.10 ... nginx01.nginx-test.svc.cluster.local. 30 IN A 10.103.254.90 # 使用默认名称空间的地址进行解析,指向了externalName中定义的地址 k8s@node01:~$ dig -t A nginx01-svc.default.svc.cluster.local @10.96.0.10 ... nginx01-svc.default.svc.cluster.local. 30 IN CNAME nginx01.nginx-test.svc.cluster.local. nginx01.nginx-test.svc.cluster.local. 30 IN A 10.103.254.90

Headless Services

无头服务,此种service没有ClusterIP地址,spec.clusterIP值设置为"None"即创建无头服务。此service后端有哪些pod依赖selector的定义。

k8s@node01:~/my_manifests$ cat headless-service.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-cluster namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent --- apiVersion: v1 kind: Service metadata: name: headless-svc-nginx namespace: default spec: clusterIP: "None" selector: app: nginx k8s@node01:~/my_manifests$ kubectl apply -f headless-service.yaml deployment.apps/nginx-cluster created service/headless-svc-nginx created k8s@node01:~/my_manifests$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bbox 1/1 Running 0 42m 10.244.2.78 node03 nginx-cluster-7469b9bbf5-b9jdr 1/1 Running 0 8s 10.244.2.79 node03 nginx-cluster-7469b9bbf5-bqf94 1/1 Running 0 8s 10.244.1.62 node02 nginx-cluster-7469b9bbf5-pg7zs 1/1 Running 0 8s 10.244.1.61 node02 k8s@node01:~/my_manifests$ kubectl get svc # cluster-ip为 None NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE headless-svc-nginx ClusterIP None 16s kubernetes ClusterIP 10.96.0.1 443/TCP 4d19h nginx01-svc ExternalName nginx01.nginx-test.svc.cluster.local 8080/TCP 42m # service名称解析出seletor关联到的Pod的IP地址 k8s@node01:~$ dig -t A headless-svc-nginx.default.svc.cluster.local @10.96.0.10 ... ;; ANSWER SECTION: headless-svc-nginx.default.svc.cluster.local. 30 IN A 10.244.1.61 headless-svc-nginx.default.svc.cluster.local. 30 IN A 10.244.1.62 headless-svc-nginx.default.svc.cluster.local. 30 IN A 10.244.2.79

Endpoints资源

到目前为止我们一直认为service为pod提供了个对外固定的访问端点,service的后端就应该是pod,而实际上service的后端是Endpoints资源,其后才是pod资源。如果k8s集群外有个服务需要在集群内部进行访问,也可以通过自定义Endpoints资源并配合无selector的service来进行访问,详细信息请参考这里:https://kubernetes.io/zh/docs/concepts/services-networking/service/#%E6%B2%A1%E6%9C%89-selector-%E7%9A%84-service

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:异常排查记录amqp协议链接陷阱
下一篇:玩转SQLite6:使用C语言来读写数据库
相关文章

 发表评论

暂时没有评论,来抢沙发吧~