如何在Kubernetes中的其他端口而不是端口80上配置回显Pod

时间:2020-06-29 11:24:31

标签: kubernetes

apiVersion: v1
    kind: Pod
    metadata:
       name: echo-pod
       namespace: echo
    spec:
       containers:
       - name: nginx
         image: nginx
         ports:
            -  containerPort: 81

试图通过在yaml文件上运行来在端口81上进行连接,但仍在端口80上进行连接。 使用telnet检查连接

echo -pod的ip是192.168.211.1

能够在端口80而不是端口81上连接来自busybox容器(已经存在)的回显容器。您可以观察以下内容

root@ip-172-31-16-143:~# kubectl exec busybox -- telnet 192.168.211.1 80
Connected to 192.168.211.1

root@ip-172-31-16-143:~# kubectl exec busybox -- telnet 192.168.211.1 81
telnet: can't connect to remote host (192.168.211.1): Connection refused
command terminated with exit code 1

2 个答案:

答案 0 :(得分:3)

通过在Pod模板上定义containerPort: 81,您只需更改exposed container port,但Nginx服务器仍将在端口80上监听(默认配置)。

您需要更改Nginx listen配置以匹配新的公开端口

与大多数Docker实现不同,Nginx不使用环境变量来支持此类配置(请参见其Docker Hub页面上的Using environment variables in Nginx configuration)。

如果您希望采用Nginx默认配置,则需要使用nginx.conf配置创建新的listen 81;,然后在Dockerfile中使用COPY替换原始配置以创建自定义图片FROM nginx。

如果您仍希望仍使用原始Nginx映像的“单行解决方法”,则可以在每次启动时更改命令/参数以替换监听配置:

  containers:
  - name: nginx
    image: nginx
    command: ["/bin/sh","-c"]
    args: ["sed -i 's/listen  .*/listen 81;/g' /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]
    ports:
    - containerPort: 81

答案 1 :(得分:1)

使用Kubernetes服务(集群IP类型)将一个Pod连接到另一个Pod。

创建如下服务。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: echo
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 81
      targetPort: 80 

在nginx容器中添加标签app: nginx,以便服务将容器选择为后端。

apiVersion: v1
kind: Pod
metadata:
  name: echo-pod
  namespace: echo
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

然后,您可以使用服务的群集IP或更好的服务的DNS和端口81从另一个Pod连接到Nginx Pod。

要检查群集IP,请运行kubectl get svc my-service -n echo

DNS将为my-service.echo.svc.cluster.local

然后,您可以使用clusterip:81my-service.echo.svc.cluster.local:81从另一个Pod连接到Nginx Pod。

相关问题