`
JerryWang_SAP
  • 浏览: 1084367 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

一个简单的例子理解Kubernetes的三种IP地址类型

阅读更多

很多Kubernetes的初学者对Kubernetes里面三种不同的IP地址和工作机制理解得不是很清楚。

本文我们通过一个最简单的例子来学习。

用如下命令行创建一个基于nginx的deployment:

kubectl run nginx --image=nginx:maxline

用kubectl get deploy查看成功生成的名为nginx的deployment:

 

此时这个deployment里的nginx pod还无法对外界提供服务。

我们创建一个service让外界能够消费。使用命令行创建这样的一个service:

kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80

type的类型选择为LoadBalancer, --port指定的是80端口,意思是这个service对外界暴露出来的服务端口是80,--target-port=80,这个端口是pod内部的nginx docker容器提供服务的工作端口,默认为80。这里实际上建立了向外界开发的80端口同nginx容器内部端口的一个映射关系。

 

执行完毕后,我们调用下面的命令行,看到了创建的service的Cluster IP和External IP。

 

其中external IP很好理解,这个service通过external IP加上我们前面介绍的被映射到80端口向外界提供服务:

浏览器里输入External IP http://35.241.173.27:80, 能成功访问nginx服务器的index.html:

 

而我们通过Service的Cluster IP是无法访问这个Service提供的功能的。

我们知道Kubernetes里的所有pod都可以彼此通信,而不需要通过网络地址转换(Network Address Translation-NAT),所有的节点也可以与所有的pod通信。而Service的Cluster IP,是一个内部的IP地址,专门用于同Cluster内部的节点或者pod通信。同外界通信,还是通过External IP进行。

NodePort

再试试NodePort。

kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80

注意看下图的PORT栏下面显示的类型为NodePort的端口:31375

这个端口号是Kubernetes expose命令自动生成的,范围在30000到32767之间。如果需要修改,可以编辑api server的配置文件:/etc/kubernetes/apiserver:

 
 

有了这个端口号,我们随便使用一个node的IP地址,后面拼接上:31375即是外部可以消费的完整地址。

使用命令行kubectl get nodes -o wide, 在结果里选择任意节点的External-IP,后面加上:31375:

 

测试:

http://146.148.23.183:31375/

测试通过。

 

Pod的端口转发功能

值得一提的是,有时我们出于测试的目的,需要一种简单的办法查看一个pod是否能正常提供服务。如果每次通过kubectl的方式创建service就太麻烦了。

这里介绍一种简单的办法:pod的端口转发功能(port forward)。

比如我们想测试下图get pods返回的第一个pod的功能,名称为nginx-6f754dd4b9-74jdn:

 

执行命令行 kubectl port-forward pod/nginx-6f754dd4b9-74jdn 8080:80

看到提示信息Forwarding from 127.0.0.1:8080 -> 80, 意思是把当前主机的8080端口映射到nginx pod的80工作端口:

 

最后,就能够通过localhost:8080直接访问nginx pod提供的服务了:

 

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

 
0
0
分享到:
评论

相关推荐

    Kubernetes in Action pdf

    网络方面,Kubernetes采用扁平的网络模型,每个Pod都有自己的IP地址,可以直接与其他Pod通信。书中会介绍CNI(Container Network Interface)插件,以及如何配置自定义网络策略。 此外,读者还将接触到Kubernetes的...

    在K8S集群部署一个简单的例子文档

    此文件定义了一个包含三个Tomcat应用Pod的Replication Controller,并设置了环境变量指向MySQL服务。 ```yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 3 selector: ...

    在Azure上向Kubernetes容器公开端口

    1. **创建ClusterIP服务**:这是默认的服务类型,它为Pod提供一个内部IP地址,但不直接暴露给外部网络。如果你的应用仅在集群内部通信,这可能就足够了。 2. **创建NodePort服务**:如果你想让外部网络可以通过任意...

    k8s deployment service 实现例子.pdf

    - **ClusterIP**:在集群内部使用,提供一个虚拟IP地址供集群内部访问,是默认类型。 - **NodePort**:在每个节点上分配一个静态端口,外部可以直接通过`<节点IP>:<节点端口>`来访问Pod。 - **LoadBalancer**:为...

    DaemonSet实验手册1

    在Kubernetes集群中,DaemonSet是一种关键的控制器,它确保所有或者特定的节点上都运行一个副本的Pod。本实验手册主要围绕如何使用DaemonSet进行操作,包括创建、查看和测试其自动恢复功能。以下是对实验步骤的详细...

    overlay demo

    例如,Linux中的overlayfs就是这样的一个例子,它可以将两个或更多的文件系统合并,其中上方的文件系统(upper layer)的修改会覆盖下方的文件系统(lower layer)。 4. **Docker Compose**:在"overlay demo"的...

    容器网络架构设计指南.pptx

    在Kubernetes中,Pod是最小的可调度单元,它可以包含一个或多个共享网络命名空间的容器。Pod的网络模型是通过CNI(容器网络接口)插件实现的,这些插件负责为Pod分配IP地址和设置网络规则。CNI插件的例子包括flannel...

Global site tag (gtag.js) - Google Analytics