假设我有一个包含两个吊舱的服务。其中一个容器是HTTP服务器,另一个容器需要命中该容器上的REST端点。第二个Pod可以用来寻址第一个Pod的主机名吗?
答案 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的最佳实践表明,出于各种原因,这些Pod
由Deployment或ReplicaSet之类的控制器进行管理,包括您的高可用性应用程序。
答案 1 :(得分:1)
请注意,服务在Docker和K8s中是不同的概念。获得所需内容的最简单方法是创建两个吊舱。说出pod-1
和pod-2
,并带有一个与此类似的Yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: NAME
labels:
app: LABEL
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
说“ NAME”和“ LABEL”分别为nginx
和nginx-1
,因此您现在有两个分别称为nginx
和nginx-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