kubernetes中的服务类型
· 阅读需 3 分钟
当我们使用deployment或者RS创建了一些pod时,比如创建了一个nginx的pod,该pod中有三个replicas,此时,如果我们查看pod状态大概是这个样子的
nginx-deploy.yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-app
name: nginxapp
spec:
selector:
matchLabels:
app: nginx-app
replicas: 3
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- image: nginx
name: nginxapp
ports:
- containerPort: 80
我们创建并查看pod情况
#kubectl apply -f nginx-deploy.yaml
deployment.apps/nginxapp created
#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginxapp-59946895d9-gt4xw 1/1 Running 0 20s
nginxapp-59946895d9-ld2dt 1/1 Running 0 49s
nginxapp-59946895d9-v2cd7 1/1 Running 0 20s
使用 -o wide 参数查看看加详细的内容
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginxapp-59946895d9-gt4xw 1/1 Running 0 2m18s 10.1.0.58 docker-desktop <none> <none>
nginxapp-59946895d9-ld2dt 1/1 Running 0 2m47s 10.1.0.56 docker-desktop <none> <none>
nginxapp-59946895d9-v2cd7 1/1 Running 0 2m18s 10.1.0.57 docker-desktop <none> <none>
可以看到它们分别被创建在了 10.1.0.56,10.1.0.57,10.1.0.58上,但是使用浏览器访问这三个地址,并不会得到响应,如果想要访问到创建的nginx pod,还需要再创建与之对应的service.
apiVersion: v1
kind: Service
metadata:
labels:
app: nginxlabelser
name: nginxlabelser
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: nginx-app
type: NodePort
它使用的type是NodePort,
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d8h
nginxlabelser NodePort 10.105.36.53 <none> 80:31844/TCP 90s
Service 目前有 4 种类型:
ClusterIP: 是 K8S 当前默认的Service类型。将 service 暴露于一个仅集群内可访问的虚拟 IP 上。NodePort: 是通过在集群内所有Node上都绑定固定端口的方式将服务暴露出来,这样便可以通过:访问服务了。LoadBalancer: 是通过Cloud Provider创建一个外部的负载均衡器,将服务暴露出来,并且会自动创建外部负载均衡器路由请求所需的Nodeport或ClusterIP。ExternalName: 是通过将服务由 DNS CNAME 的方式转发到指定的域名上将服务暴露出来,这需要kube-dns1.7 或更高版本支持。
如果使用了NodePort的话,则可以通过node:port 的方式访问到,此时我们通过http://127.0.0.1:31844 则可以正常的访问。
