Kubenetes:服务
1)创建服务
编辑gwp-svc.yaml
apiVersion: v1kind: Service
metadata:
name: gwp
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: gwp
创建服务
kubectl create -f gwp-svc.yaml
查看服务
kubectl get svc
在运行的容器中远程执行命令,其中两个双斜杠(--)代表着kubectl命令项的结束,之后时pod内部需要执行的命令
kubectl exec gwp-fgjg6 -- curl -s http://10.98.20.174
同一个服务可以暴露多个端口,此时需要指定端口名称
编辑gwp-svc.yaml
apiVersion: v1kind: Service
metadata:
name: gwp
spec:
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
selector:
app: gwp
此外,targetPort还可以使用命名端口(就是pod中配置的containerPort对应的名称),最大的好处是即使更换端口号也无须更改服务spec。
2)服务发现
- 通过环境变量发现服务
首先列出环境变量
kubectl exec gwp-kc6pb env
- 通过DNS发现服务
运行在pod上的进程DNS查询都会被Kubenetes自生的DNS服务器响应,该服务器知道系统中运行的所有服务。(Kubenetes通过修改每个容器的/etc/resolv.conf文件实现)
- 通过全限定名连接服务
示例:backend-database.default.svc.cluster.local,其中backend-database对应服务名称,default表示服务在其中定义的命名空间,svc.cluster.local是在所有集群本地服务名称中使用的可配置集群域后缀。
如果两个pod在同一个命名空间,可以省略svc.cluster.local后缀,甚至命名空间,因此可以使用backend-database来指代服务。
进入pod容器
kubectl exec -it gwp-kc6pb bash
执行如下命令,都可以得到正确结果
curl http://gwp.default.svc.cluster.local
curl http://gwp.default
curl http://gwp
- 连接集群外部的服务
服务和pod不是直接相连的,有一种资源介于两者之间,就是Endpoint资源,服务和endpoint解耦后,可以分别手动配置和更新。如果创建了不包含pod选择器的服务,Kubenetes将不会创建Endpoint资源。
查看endpoints
kubectl get endpoints gwp
创建一个没有pod选择器的服务,编辑external-service.yaml并创建,然后kubectl describe svc external-service,发现并没有Endpoints
手动创建Endpoint资源,并创建,Endpoints对象需要和服务具有相同的名称,并包含该服务的目标IP和端口列表。
apiVersion: v1kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 11.11.11.11
- ip: 22.22.22.22
ports:
- port: 80
再次kubectl describe svc external-service,此时该服务有Endpoints
- 为外部服务创建别名
除了手动配置服务的Endpoint来代替公开外部服务方法,有一种更简单的方法,就是通过其完全限定域名访问外部服务。
创建ExternalName类型的服务,编辑external-service-externalname.yaml
apiVersion: v1kind: Service
metadata:
name: external-service-name
spec:
type: ExternalName
externalName: someapi.somecompany.com
ports:
- port: 80
服务创建完成后,pod可以通过external-service.default.svc.cluster.local域名连接到外部服务,而不是使用服务的实际的全限定名。
ExternalName服务仅在DNS级别实施——为服务创建了简单的CNAME DNS记录,因此连接到服务的客户端将直接连接到外部服务,完全绕过服务代理。出于这个原因,这些类型的服务甚至不会获得集群IP。
- 将服务暴露给外部客户端
三种方式:将服务设置成NodePort服务,将服务设置成LoadBalancer,创建一个Ingress资源。
a.创建NodePort类型的服务,并查看服务
apiVersion: v1kind: Service
metadata:
name: gwp-nodeport
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30123
selector:
app: gwp
然后通过以下地址可以访问该服务:
10.108.33.251:80 <1stnode"sIP>:30123 <2stnode"sIP>:30123 等等。
提示:minikube可以运行minikube service <service-name>[-n <namespace>]命令,通过浏览器访问。
b.创建LoadBalancer:minikube没有。
c.创建Ingress资源:每个LoadBalancer服务都需要有自己的负载均衡器,以及独有的公有IP,而Ingress只需要一个公网IP就能为许多服务提供访问,只有Ingress控制器在集群中运行,Ingress资源才能正常工作。
在minikube上查看Ingress是否启动
minikube addons list
当前是disabled,然后执行下面的命令启动,然后会在另一个pod中运行Ingress控制器,查看pod名称,以nginx开头,说明是使用nginx提供Ingress功能。
minikube addons enable ingress
编辑gwp-ingress.yaml文件并创建
apiVersion: extensions/v1beta1kind: Ingress
metadata:
name: gwp
spec:
rules:
- host: gwp.example.com
http:
paths:
- path: /
backend:
serviceName: gwp-nodeport
servicePort: 80
查看ingress
kubectl get ingress
以上是 Kubenetes:服务 的全部内容, 来源链接: utcz.com/z/511443.html