在 kubernetes 中通过 DNS 将 IP 获取到 env 变量中
Getting IP into env variable via DNS in kubernetes
我正在努力了解来自 docker compose
的 K8s。我想用我推送到注册表的两个容器设置我的第一个 pod。以下问题:
如何通过 DNS 将 IP 获取到环境变量中,以便注册器可以连接到 consul?请参阅 args consul://consul:8500
中的容器注册器。 consul需要跟env一起改。
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "service-discovery",
"labels": {
"name": "service-discovery"
}
},
"spec": {
"containers": [
{
"name": "consul",
"image": "eu.gcr.io/{myproject}/consul",
"args": [
"-server",
"-bootstrap",
"-advertise=$(MY_POD_IP)"
],
"env": [{
"name": "MY_POD_IP",
"valueFrom": {
"fieldRef": {
"fieldPath": "status.podIP"
}
}
}],
"imagePullPolicy": "IfNotPresent",
"ports": [
{
"containerPort": 8300,
"name": "server"
},
{
"containerPort": 8400,
"name": "alt-port"
},
{
"containerPort": 8500,
"name": "ui-port"
},
{
"containerPort": 53,
"name": "udp-port"
},
{
"containerPort": 8443,
"name": "https-port"
}
]
},
{
"name": "registrator",
"image": "eu.gcr.io/{myproject}/registrator",
"args": [
"-internal",
"-ip=$(MY_POD_IP)",
"consul://consul:8500"
],
"env": [{
"name": "MY_POD_IP",
"valueFrom": {
"fieldRef": {
"fieldPath": "status.podIP"
}
}
}],
"imagePullPolicy": "Always"
}
]
}
}
在 Kubernetes 中使用 Service 将 pods 暴露给其他应用程序。定义服务后,您可以在 pods 中使用与该服务相关的环境变量。直接公开 Pod 不是一个好主意,因为 Pods 可能会被重新安排。
当例如使用这样的服务:
apiVersion: v1
kind: Service
metadata:
name: consul
namespace: kube-system
labels:
name: consul
spec:
ports:
- name: http
port: 8500
- name: rpc
port: 8400
- name: serflan
port: 8301
- name: serfwan
port: 8302
- name: server
port: 8300
- name: consuldns
port: 8600
selector:
app: consul
相关的环境变量将是CONSUL_SERVICE_IP
无论如何,似乎其他人实际上出于某些原因停止使用该环境变量,如所述here
我正在努力了解来自 docker compose
的 K8s。我想用我推送到注册表的两个容器设置我的第一个 pod。以下问题:
如何通过 DNS 将 IP 获取到环境变量中,以便注册器可以连接到 consul?请参阅 args consul://consul:8500
中的容器注册器。 consul需要跟env一起改。
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "service-discovery",
"labels": {
"name": "service-discovery"
}
},
"spec": {
"containers": [
{
"name": "consul",
"image": "eu.gcr.io/{myproject}/consul",
"args": [
"-server",
"-bootstrap",
"-advertise=$(MY_POD_IP)"
],
"env": [{
"name": "MY_POD_IP",
"valueFrom": {
"fieldRef": {
"fieldPath": "status.podIP"
}
}
}],
"imagePullPolicy": "IfNotPresent",
"ports": [
{
"containerPort": 8300,
"name": "server"
},
{
"containerPort": 8400,
"name": "alt-port"
},
{
"containerPort": 8500,
"name": "ui-port"
},
{
"containerPort": 53,
"name": "udp-port"
},
{
"containerPort": 8443,
"name": "https-port"
}
]
},
{
"name": "registrator",
"image": "eu.gcr.io/{myproject}/registrator",
"args": [
"-internal",
"-ip=$(MY_POD_IP)",
"consul://consul:8500"
],
"env": [{
"name": "MY_POD_IP",
"valueFrom": {
"fieldRef": {
"fieldPath": "status.podIP"
}
}
}],
"imagePullPolicy": "Always"
}
]
}
}
在 Kubernetes 中使用 Service 将 pods 暴露给其他应用程序。定义服务后,您可以在 pods 中使用与该服务相关的环境变量。直接公开 Pod 不是一个好主意,因为 Pods 可能会被重新安排。
当例如使用这样的服务:
apiVersion: v1
kind: Service
metadata:
name: consul
namespace: kube-system
labels:
name: consul
spec:
ports:
- name: http
port: 8500
- name: rpc
port: 8400
- name: serflan
port: 8301
- name: serfwan
port: 8302
- name: server
port: 8300
- name: consuldns
port: 8600
selector:
app: consul
相关的环境变量将是CONSUL_SERVICE_IP
无论如何,似乎其他人实际上出于某些原因停止使用该环境变量,如所述here