如何在服务中的Pod之间进行通信?

时间:2018-06-24 16:10:14

标签: kubernetes

假设我有一个包含两个吊舱的服务。其中一个容器是HTTP服务器,另一个容器需要命中该容器上的REST端点。第二个Pod可以用来寻址第一个Pod的主机名吗?

4 个答案:

答案 0 :(得分:5)

我假设当您说“服务”时,您不是在指Service对象的Kubernetes词典,否则您在Service中的两个Pod是相同的,因此让我们开始在Kubernetes土地上戏弄“服务”的含义。

您将必须创建一个额外的Kubernetes object called a Service来获取HTTP服务器的Pod的主机名。创建Service时,您将定义一个.spec.selector指向HTTP服务的Pod上的一组标签。为了举例,假设标签为app: nginx。该Service对象的名称将成为内部DNS记录,第二个Pod可以查询该内部记录。

一个简化的示例:

apiVersion: v1
kind: Pod
metadata:
  name: http-service
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
  name: my-http-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

现在您的第二个Pod可以使用Service名称my-http-service向HTTP服务发出请求。

值得一提的是,Kubernetes的最佳实践表明,出于各种原因,这些PodDeploymentReplicaSet之类的控制器进行管理,包括您的高可用性应用程序。

答案 1 :(得分:1)

请注意,服务在Docker和K8s中是不同的概念。获得所需内容的最简单方法是创建两个吊舱。说出pod-1pod-2,并带有一个与此类似的Yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: NAME
  labels:
    app: LABEL
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

说“ NAME”和“ LABEL”分别为nginxnginx-1,因此您现在有两个分别称为nginxnginx-1的豆荚,分别带有标签app: nginx和{{1 }}。实际上,由于只有其中一个会被暴露,所以另一个标签是无关紧要的。

现在,您可以使用Yaml文件或从命令行中显示Pod。

Yaml文件:

app: nginx-1

命令行:

apiVersion: v1 kind: Service metadata: name: server spec: ports: - port: 80 targetPort: 80 protocol: TCP name: http selector: app: nginx

如果您现在直接访问第二个容器(nginx-1)并kubectl expose pod nginx --port 80 --name server直接访问该服务,则最终会碰到其后面的容器(nginx):

curl

答案 2 :(得分:0)

您可以公开您的Pod kubectl公开部署--type = pod的名称,然后您可以使用 kubectl描述,它将向您显示端口数。然后,您在上一个命令的 http://localhost:portnumber中访问您的广告连播 .... ** .....希望它会有所帮助。

答案 3 :(得分:0)

具有讽刺意味的是,您回答了自己的问题:Service是一个稳定的名称和IP,它对将流量路由到的Pod的各个来往进行抽象,如所述the fine manual很好。

如果the-http-pod需要达到the-rest-pod,则创建一个Service,使其与创建PodSpec的{​​{1}}上的标签匹配,然后从此开始the-rest-pod可以始终对每个具有匹配标签的Pod使用the-http-pod