本文为作者的 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. 【译文】IEEE白皮书 6G 太赫兹技术的基本原理 2023版

    第一章 简介 太赫兹波是介于微波和光波之间的光谱区域,频率从 0.1THz ~ 10THz 之间,波长在 3mm ~ 30μm 之间.提供大块连续的频带范围以满足对 Tbit/s 内极高数据传输速率的 ...

  2. vue获取子组件的实例$el、$attrs和inheritAttrs的使用

    我的需求 有些时候,我们需要获取组件的DOM元素 有些小伙伴会说,这还不简单 直接使用this.$ref.xx不就可以了吗 我们来看一下,是不是我们想的那样简单 组件内容 <template&g ...

  3. Fabric区块链浏览器(3)

    本文是区块链浏览器系列的第五篇,项目完整代码在这里. 在上一篇文章中给浏览器增加了简单的用户认证,至此浏览器的基本功能就已经大致完成了. 在这片文章中,我将使用kratos对区块链浏览器器进行重构,使 ...

  4. 【3】VSCode 主题设置推荐,自定义配色方案,修改注释高亮颜色

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  5. C/C++ 操作数组与指针笔记

    指针数组: #include <stdio.h> #include <stdlib.h> #include <string.h> void PrintInt() { ...

  6. Spring一套全通6—注解编程

    百知教育 --- Spring系列课程 --- 注解编程 第一章.注解基础概念 1. 什么是注解编程 指的是在类或者方法上加入特定的注解(@XXX),完成特定功能的开发. @Component pub ...

  7. KMP 学习笔记

    前言-- \(char\) 与 \(string\) 有的时候 \(char\) 数组确实比 \(string\) 好用,且字符串长度很大时 \(string\) 会被卡掉,所以不要犯懒,老实用 \( ...

  8. Spring Boot 参数校验注解(自整理,不停的测试更新)

    首先我们只使用java官方的 javax.validation.constraints ,足以使用了,不使用spring boot 自身的,自身的与官方的一致,可能会有扩展,但是还得引入包,麻烦,只用 ...

  9. Window Server+IIS配置实现一台服务器绑定多个HTTPS证书

    参考原文链接:https://blog.csdn.net/lengyiqiu/article/details/89182239 此处做个记录防止丢失: 直接上步骤: 1.选安装好SSL证书,供下面配置 ...

  10. Linux-如何比较比较两个目录中的文件差异

    在 Linux 命令行中比较两个目录是一项常见的任务,特别是当你需要确保两个目录之间的文件完全相同时. 本文我们将介绍一些在 Linux 命令行中比较两个目录的方法. 方法一:使用 diff 命令比较 ...