本节主要介绍sk8s中的service
Kubernetes 的 Service 是一个抽象层,它定义了一组 Pod 的逻辑集,并为这些 Pod 支持外部流量暴露、负载平衡和服务发现
简单说,service就是负责为pod提供网络访问入口,也算是k8s实现微服务的核心机制。没有service的时候,请求可以通过pod的ip+port直接访问pod运行的服务。但是如果有pod有多个副本呢?pod的ip不是固定的呢?pod的副本数量动态变化呢?
使用get services
命令查看
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5m26s
使用expose
命令为我们的deployment创建service以提供外部访问
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
现在再次查看services,发现已经创建好了service,除了使用expose命令暴露服务,也可以在创建deployment的时候添加–expose参数同时为该deployment创建一个service
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5m43s
kubernetes-bootcamp NodePort 10.106.154.235 <none> 8080:31270/TCP 5s
使用describe查看service信息
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: app=kubernetes-bootcamp
Annotations: <none>
Selector: app=kubernetes-bootcamp
Type: NodePort
IP Families: <none>
IP: 10.106.154.235
IPs: 10.106.154.235
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31270/TCP
Endpoints: 172.18.0.6:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
上面创建的service是NodePort类型,可以支持node外的客户端通过node的ip和端口访问服务
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-9zdgt | v=1
k8s中的单元的label标签属性可以支持我们使用-l进行label筛选,同时service配置也可以使用selector来选择service的要管理pod
$ kubectl describe svc/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: app=kubernetes-bootcamp
Annotations: <none>
Selector: app=kubernetes-bootcamp
Type: NodePort
IP Families: <none>
IP: 10.106.154.235
IPs: 10.106.154.235
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31270/TCP
Endpoints: 172.18.0.6:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
service的selector选择了app=kubernetes-bootcamp的pod
label命令可以修改对象的label,–overwrite可以覆盖之前的label
$ kubectl label pods $POD_NAME version=v2 --overwrite
pod/kubernetes-bootcamp-fb5c67579-9zdgt labeled
$ kubectl describe pod/$POD_NAME
Name: kubernetes-bootcamp-fb5c67579-9zdgt
Namespace: default
Priority: 0
Node: minikube/172.17.0.32
Start Time: Wed, 10 Nov 2021 14:32:28 +0000
Labels: app=kubernetes-bootcamp
pod-template-hash=fb5c67579
version=v2
delete命令用来删除service,此时也可以使用-l参数选择标签
$ kubectl delete service -l app=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted