debian怎么配置静态ip地址
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
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
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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~