本文为作者的 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. 从零开始配置vim(23)——lsp基础配置

    上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色.自动格式化以及增量选中功能.算是初步体验了 lsp的相关功能.从这篇开始我们通过lsp的功能 ...

  2. 太强了!本地存档一键导入 Sealos 帕鲁专属服务器

    上一篇:幻兽帕鲁 Palworld 私有服务器一键部署教程 作为一名资深帕鲁,我的职责就是帮助各位帕鲁主人们闭着眼睛部署私服,完全不用带脑子. 我就喜欢群里的帕鲁老板们压榨我,拿鞭子抽我让我赶紧上新功 ...

  3. 程序设计实验第一学期期末考试复习用源代码【C语言深度解剖】【超详细注释】

    有关此篇 在这里博主先告诉大家,博主在学校学的C语言课本是<谭浩强的C语言>那这本红色的书. 博主到期末阶段是学到了结构体那一章,下面是博主的复习代码,是一些比较有编程思想的一些源代码,博 ...

  4. 简单总结Tomcat/SpringMVC/Spring/SpringBoot的关系

    Tomcat是一个Web应用服务器,可以作为Servlet容器.它的作用是,解析客户端client发起的request,并组装出HttpRequest.创建HttpResponse,将二者交于内部的H ...

  5. Java并发(五)----线程常见方法总结

    常见方法 方法名 static 功能说明 注意 start()   启动一个新线程,在新的线程运行 run 方法中的代码 start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还 ...

  6. Java商城单体和微服务架构有什么区别

    微服务架构 概述 BizSpring移动全端国际化电商平台,是建立在Spring Cloud 基础上的微服务应用,服务化是系统达到一定规模以后的必然选择,主流的互联网公司基本都在迁移到服务化架构. 我 ...

  7. Windows 10 配置Java 环境变量

    下载 JDK 下载地址:https://www.oracle.com/java/technologies/downloads/ 点击下载按钮: 开始安装JDK: 可以设置为你想安装的路径. 环境变量配 ...

  8. [Elasticsearc] Elasticsearch 初见

    Elasticsearch 初见 启动 双击 bin 目录下的 elasticsearch.bat 文件,等待终端运行成功 索引的增删改查 增(PUT) postman 发送请求 PUT 请求:htt ...

  9. 从零开始的react入门教程(十一),react ref 详解,三种写法与 ref 转发(传递)

    壹 ❀ 引 在前面的文章中,我们介绍了react的状态提升,随之引出了redux以及context,其实都说到底都是为了方便管理react的状态,让数据交互与组件通信变得更为简单.我们知道,react ...

  10. test-02-java 单元测试框架 junit5 入门介绍

    拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息 ...