注明:当前文档内容来源于51cto课堂‘宽哥’杜宽学习课程。
前景学习:
一、什么是label 和 selector
Label: Label(标签)可以对k8s的一些对象,如Pod和节点进行"分组"。通过添加key=value格式的标签,用于区分同样的资源不同的分组。
Selector: Selector(标签选择器)可以通过根据资源的标签查询出精确的对象信息。
二、基础使用命令
假设一个应用场景 应用案例:
公司与 xx 银行有一条专属的高速光纤通道,此通道只能与 192.168.7.0 网段进行通信,因此只能将与 xx 银行通信的应用部署到 192.168.7.0 网段所在的节点上,此时可以对节点添加 Label:
设置一个node节点标签 registroy=subnet7
kubectl label node NodeName registroy=subnet7
查询node标签
kubectl get node -l registroy=subnet7
删除标签: 删除即减号'-'
kubectl label node NodeName redistroy-
三、什么是Service
每个Pod都会获取到它自己的IP地址,但是这些IP地址不总是稳定和可依赖的,这样就会导致一个问题在kubernetes集群中,如果一组pod(比如后端的Pod) 为其他Pod(比如前端的Pod)提供服务,那么如果他们之间使用Pod的IP地址进行通信,在Pod重建后,将无法再进行连接。于是Kubernetes引用了Service这样一种抽象概念:逻辑上的一组Pod,即一种可以访问Pod的策略。这一组Pod能够被Service通过标签选择器访问到,之后就可以使用Service进行通信
四、定义一个基础Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service的端口号
targetPort: 80 #容器的端口号
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # deployment 名称
labels: # deployment 标签
app: nginx
spec:
replicas: 3 #设置副本个数
selector:
matchLabels:
app: nginx # 管理的是那些pod
template: # 此处是关于pod的定义
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.12
ports:
- containerPort: 80
上述示例为my-service:80 即可访问到具有app=nginx标签的pod的80端口上需要注意的是,Service能够将一个接收端口映射到任意的targetPort,如果targetPort为空,targetPort将被设置为与Port字段相同的值。targetPort 可以设置为一个字符串,引用backend pod的一个端口名称,这样的话即使更改了Pod的端口,也不会对Service的访问造成影响。Service能够支持TCP、UDP、SCTP等协议,默认为TCP协议。
五、Service 类型
Cluster IP:在集群内部使用,默认值,只能从急群众访问。
NodePort:在所有安装了kube-proxy的节点上打开一个端口,此端口可以代理至后端Pod,可以通过Nodeport从几圈外部访问集群内的服务,格式为NodeIp:NodePort
LoadBalancer:使用云提供商的负载均衡公开服务,成本较高。
ExternalName: 通过返回定义的CNAME别名,没有设置任何类型的代理,需要1.7或更高版本kube-dns支持。
六、NodePort类型
如果将Service的type字段设置为Nodeport,则Kubernetes将从--service-node-port-range参数指定的范围(默认为30000-32767)中自动分配端口,也可以手动指定Nodeport,创建该Service后,集群每个节点都将暴露一个端口,通过某个宿主机的IP+端口即可访问到后端的应用。
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
NodePort: 30000
selector:
k8s-app: kubernetes-dashboard
七、使用Service代理k8s外部服务
使用场景:
- 希望在生产中使用某个固定对的名称而非IP地址访问外部的中间件服务;
- 希望service只想另一个Namespace中或其他集群中的服务;
- 正在将工作负载转移到Kubernetes集群,但是一部分服务仍运行在Kubernetes集群之外的backend。
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-svc-external
name: nginx-svc-external
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
sessionAffinity: None
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: nginx-svc-external
name: nginx-svc-external
subsets:
- addresses:
- ip: 140.205.94.189
ports:
- name: http
port: 80
注意:endpoint IP地址不能是 loopback(127.0.0.0/8)、link-local(169.254.0.0/16)或者link-local多播地址(224.0.0.0/24)
八、ExternalName Service
ExternalName Service 是Service的特例,它没有selector,也没有定义任何端口和Endpoint,他通过返回该外部服务的别名来提供服务。
比如可以定义一个Service,后端设置为一个外部域名,这样通过Service的名称即可访问到该域名。使用nslookup解析以下文件定义的Service,集群的DNS服务将返回一个值为my.database.example.com 的CNAME记录
kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
九、多端口Service
kind: Service
apiversion: v1
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9736
- name: https
protocol: TCP
port: 443
targetPort: 9377