Kubenetes:服务

编程

1)创建服务

编辑gwp-svc.yaml

apiVersion: v1

kind: 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: v1

kind: 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: v1

kind: 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: v1

kind: 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: v1

kind: 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/v1beta1

kind: 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

回到顶部