本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:

https://k8s.whuanle.cn【适合国内访问】

https://ek8s.whuanle.cn 【gitbook】

在 3.1,3.2 中,我们部署过了 Nginx 容器,使用了 --port=8080 或 containerPort: 8080 为 Pod 暴露一个端口,本章只是简单地为 Pod 创建 Service,并且介绍 Pod 的一些网络知识,在第四章中会详细讲解网络方面的知识。

containerPort

这个字段用于规范化声明容器对外暴露的端口,但这个端口并不是容器映射到主机的端口,它是一个声明式的字段,属于容器端口规范。

在很多情况下,我们不需要设置此 containerPort 也可以直接访问 Pod。

读者可以把上一章中创建的 deployment 删除,然后重新创建。

kubectl create deployment nginx --image=nginx:latest

然后获取 Pod 的 IP:

root@master:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-55649fd747-zndzx 1/1 Running 0 7m57s 10.32.0.2 slave1 <none> <none>

然后访问 10.32.0.2 ,会发现正常打开。

加不加端口映射都可以访问 80 ,它是一个容器端口规范,跟 Dockerfile 的 port 一样,不具有强制开放的功能,在创建 Service 时有用处。

[Error] 提示

如果你没有配置过 CNI 网络插件,则创建的 Pod IP,只能在所在的节点中访问,要跨节点访问,请按照 2.2 的初始化网络,或 2.3 中的 Calico 一节,安装好网络插件。

另外,如果 Calico 配置错误,会导致一直无法创建 Pod。

我们在创建 Pod 时,如果指定了 --port ,那么这个端口便会生成 containerPort ,可以使用下面的命令查看创建的 Deployment YAML 的定义:

kubectl create deployment nginx  --image=nginx:latest --port=80 --dry-run=client -o yaml
      containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
resources: {}

网络端口映射

对于 docker,我们要映射端口时,可以使用 docker ... -p 6666:80,那么对于 直接创建或使用 Deployment 等方式部署的 Pod,都有一个 Pod IP 可以在集群中的所有节点中访问,但是这个 IP 是虚拟 IP,不能在集群外中访问,即使都是内网机器,没有加入 Kubernetes 集群,一样不能访问。如果我们要把端口暴露出去,供外网访问,则可以使用 Service。

关于 Service 的知识,在第四章中会详细讲解,这里仅说明如何创建 Service,以及 containerPort 的作用。

在上一小节中,我们创建的 Pod 没有声明过 containerPort,因此我们创建 Service 的时候,需要指定映射的端口。

查看上一节创建的 Deployment、Pod:

kubectl get deployments
kubectl get pods
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx 1/1 1 1 5m44s NAME READY STATUS RESTARTS AGE
nginx-55649fd747-9vfrx 1/1 Running 0 5m44s

通过 kubectl expose 可以快速创建 Service,并为 Deployment 部署的多个 Pod 暴露一个相同的端口。

由于 Pod 中的 nginx 访问端口是 80,我们想在外网中访问时使用 6666 端口,则命令如下;

kubectl expose deployment nginx --port=6666 --target-port=80
# 指定源端口为 80,要映射到 6666 端口
kubectl expose deployment nginx --port=80
# 如果没有指定源端口,则表示其端口也是 80

如果对象直接是 Pod 或者 DaemonSet 等对象,则 kubectl expose {对象} ...,会自动为此对象中的 Pod 创建端口映射。

查看 Service:

kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
nginx ClusterIP 10.105.13.163 <none> 6666/TCP 6s

由于我们只是简单地创建 Service,并没有指定 Service 的公开程度,可以看到 TYPE 中,其类型为 ClusterIP,表示只能在 Pod 所在的节点上通过此 IP 和端口访问 Pod(如果安装了 CNI 网络插件,则任意节点皆可访问)。

可以使用 10.105.13.163 和 6666 端口访问 Pod 中的 Nginx 服务。

这里介绍了如何创建 Service,暴露端口,而在后面的章节中,会详细介绍 Service。

[Info] 提示

如果已经指定过 containerPort,可以使用 kubectl expose deployment nginx 快速映射 containerPort 中指定的端口。

本地端口

每个 Pod 都有自己的唯一 IP 地址,Pod 所在的服务器上,通过 IP 地址可以直接访问 Pod。

除了 Service,我们还可以使用 port-forward 在服务器上直接映射本地端口到 Pod。

root@instance-2:~# kubectl port-forward nginx-55649fd747-s4824 666:80
Forwarding from 127.0.0.1:666 -> 80
Forwarding from [::1]:666 -> 80

此方式具有很大限制,首先如果 Pod 在 instance-2 节点中,那么此命令在 instance-2 节点上运行才能生效,在其它节点上运行无效。

此方式只能映射本地端口,如 127.0.0.1,不能通过外网访问。

原本只能通过 具体的 Pod IP 才能访问 Pod,现在在服务器上通过 127.0.0.1 也可以直接访问服务。

Kubernetes:Pod 端口映射的更多相关文章

  1. (五)Kubernetes Pod状态和生命周期管理

    什么是Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位.Pod代表着集群中运行的进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP,管理容器如何 ...

  2. Kubernetes Pod 全面知识

    Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...

  3. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  4. Windows10环境配置nat123端口映射访问mysql

    背景:因工作需要,在宽带路由器内部设置一个台式机(可上网),配置成数据库服务器.分散各处的多台外网机可以通过jdbc连接该数据库服务器进行开发.要进行端口映射. 环境: 宽带通 Windows10企业 ...

  5. Tp-link TL-WR841N无线路由器端口映射到外网如何设置

    针对TP-LINK的无线路由器进行演示如何设置端口映射和访问控制,演示使用的具体型号是TP-LINK TL-WR841N 3G无线路由器如何设置端口映射. 什么是端口映射? 端口映射又称端口转发,有的 ...

  6. TTradmin v1.1 - 免端口映射穿透任何内网、基于radmin核心的即时远程协助

        TTradmin 是一款免端口映射可直接穿透任何内网,基于radmin核心的即时远程协助软件.在使用的时候只需要保证“协助端”和“被协助端”使用同一个验证码即可实现安全便捷的远程控制,不需要进 ...

  7. linux下用用iptables做端口映射的shell

    情形一:跨网络.跨主机的映射Full-Nat 我们想到达主机B的80端口,但是由于网络限制可能无法直接完成.但是我们可以到达主机A的8080端口,而主机A可以直接到达B的80端口.这时候可以使用ipt ...

  8. Hyper-V端口映射

    有时候我们为了让局域网或外网用户直接远程访问或访问虚拟机里的服务,可以将实机端口直接映射到Hyper-V的虚拟机里面,省去很多麻烦. 下面是hyper-v共享IP端口映射一些常用命令共享IP端口映射一 ...

  9. CentOS下Apache配置多域名或者多端口映射

    CentOS下Apache默认网站根目录为/var/www/html,假如我默认存了一个CI项目在html文件夹里,同时服务器的外网IP为ExampleIp,因为使用的是MVC框架,Apache需开启 ...

  10. Hyper-V 共享式网络链接 端口映射

    远程路由访问我配置了很久都不成功,经过多方搜索,现面的命令能实现端口映射一.查询端口映射情况netsh interface portproxy show v4tov4查询这个IP所有的端口映射.net ...

随机推荐

  1. 如何抓取http请求/拦截器用法

    我们都知道postman是模拟接口向服务端发送请求的,在编写请求数据的时候非常 麻烦,那么如果我们可以先抓取该接口后直接使用,就方便的很多 抓取http请求 1.我们打开postman时就会看见右上角 ...

  2. 【解决一个小问题】macbook m2 上交叉编译 gozstd

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 已知 zstd 是一个优秀的压缩库,gozstd封装了这个 ...

  3. 在cmd(命令行)或bat文件切换盘符

    bat文件 写一个自动更新git的bat文件,如果bat文件放在E盘,想要去到D盘的某个目录下执行命令,代码如下: SET ksf=D:\code\KSFramework @echo on d: cd ...

  4. 手撕Vue-实现将数据代理到Vue实例

    前言 经过上一篇文章的学习,完成了 v-on 指令的实现,接下来我们来实现将数据代理到 Vue 实例上. 为什么要完成这个功能呢?因为我们在使用 Vue 的时候,可以直接通过 this.xxx 的方式 ...

  5. Docker 安装与升级

    卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest ...

  6. Flask Echarts 实现历史图形查询

    Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递.用户界面使用ECharts图形库实时渲染数据.它提供了丰富多彩.交互性强的图表和地图,能够在网页上直观.生动地展示数据.EChart ...

  7. C#中DataTable数据导出为HTML格式文件

    /// <summary> /// DataTable导出为HTML的Table并保存到本地 /// </summary> /// <param name="d ...

  8. 天玑9300大战骁龙8 Gen3:十余项数据实测 到底谁才是安卓之王?

    一.前言:全大核天玑9300正面硬钢骁龙8 Gen3 究竟谁才是安卓芯片之王? 今年,两家移动芯片厂商都开始放大招了,骁龙首发Cortex-X4超大核,联发科也不甘示弱,初次将"全大核&qu ...

  9. AI PC两年要大卖1亿台!就靠它了

    Intel在中国北京召开了主题为"AI无处不在,创芯无所不及"的2023Intel新品发布会暨AI技术创新派对,正式发布了代号为"Meteor Lake"的面向 ...

  10. WebAssembly核心编程[3]: Module 与 Instance

    WebAssembly程序总是以模块来组织,模块是基本的部署.加载和编译单元.在JavaScript编程接口中,模块通过WebAssembly.Module类型表示.WebAssembly.Modul ...