k8s-pod-初探2

port配置

踩坑完毕,回到主线。

前面关于port的理解存在偏差,需要用实验来确认port配置的含义。

k8s官方文档对于对于这些配置项的解释还是没有很完善。下面是在其他博文中找到的解释。

ports:                    #需要暴露的端口库号列表
  - name: string          #端口号名称
    containerPort: int    #容器需要监听的端口号
    hostPort: int         #容器所在主机需要监听的端口号,默认与ContainerPort相同
    protocol: string      #端口协议,支持TCP和UDP,默认TCP

已知:

从k8s集群内部的宿主机(物理机、虚拟机)可以直接访问pod的服务地址 ip:80

未知(需要测试):

1、同一局域网内,但没有加入k8s集群的其他服务器能否访问pod的服务地址 ip:80---无法访问

2、能否跳过pod直接访问容器的服务地址 ip:80---没查到ip

首先要知道容器的IP地址

[root@devhost25-2 ~]# docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) |grep nginx
/k8s_nginx_mynginx4_default_8bd68b04-cae2-4d35-abf6-bc425c54aa64_0 -
/k8s_POD_mynginx4_default_8bd68b04-cae2-4d35-abf6-bc425c54aa64_0 -
/k8s_nginx_mynginx_default_5653595e-9763-4a7b-b3f8-210bad3daa26_0 -
/k8s_POD_mynginx_default_5653595e-9763-4a7b-b3f8-210bad3daa26_0 -

可以看到上面的命令查出的结果是 - 无法看出ip,尝试进入容器查看

# ip addr
/bin/sh: 22: ip: not found
# ifconfig
/bin/sh: 23: ifconfig: not found

然后我就没辙了,不过根据linux系统的精神,所有内容都是文件,但是我google了好久也没找到ip地址到底存在哪一个文件中。然后我就怀疑是不是一定要容器开放端口,ip地址才可以用docker inspect查询,起了一个不开端口的容器,结果也是有ip的。后来问了一个底层开发的朋友,据说ip是不写文件的。

[root@md-2 ~]# docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
/myubuntu - 172.17.0.2

那只能先认为通过k8s启动的容器其实是没有容器ip的。

从侧面看,也很有可能k8s启动的容器确实没有ip

-从容器与pod的关系,一个pod内部可以有多个容器,这些容器之间共享资源

-flannel calico的原理介绍中,终端都只是到了pod,而没有体机容器

3、访问pod所在的主机的80端口能否返回相同的响应---无法访问

-果然端口都没有,确实无法访问
[root@devhost25-2 ~]# curl 10.100.1.237
curl: (7) Failed to connect to 10.100.1.237 port 80: Connection refused

从以上的信息来看,这个port配置应该和docker中暴露端口的意思是一样的,例如下面的例子

docker run -p 80:80

来做一下实验:

在我们之前的pod配置文件上增加配置,如下

apiVersion: v1  #必选,版本号,例如v1
kind: Pod       #必选,Pod
metadata:       #必选,元数据
  name: mynginx        #必选,Pod名称----name1
  labels:              #自定义标签
    name: mynginx      #自定义标签名字----name2
    app: mynginx
  annotations:         #自定义注释
    name: mynginx      #自定义注释名字----name3
    app: mynginx
spec:                  #必选,Pod中容器的详细定义
  containers:          #必选,Pod中容器列表
    - name: nginx      #必选,容器名称----name4
      image: nginx:1.20.0    #必选,容器的镜像名称
      ports:
        - name: http           #端口号名称
          containerPort: 80    #容器端口
          hostPort: 80         #pod对应的端口
          protocol: TCP        #协议类型

结果和我们之前的猜测保持一致,增加ports的配置之后,访问宿主机的ip:80也可以访问到pod的内容了。

我这里pod ip 是 10.19.130.67,宿主机是 10.100.1.237。curl 10.19.130.67 和 curl 10.100.1.237 得到的结果是一样的。正当我想再仔细看看的时候,服务器又挂了,wc,只能明天找网管重启了。

---第二天

昨天,我还想看看

1、关了这个pod之后是否就不能访问了

启动了2个pod如下,mynginx1没有配置ports,mynginx2配置了ports。

[root@brdev1 matt]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
mynginx1   1/1     Running   1          23h   10.19.130.68   devhost25-2   <none>           <none>
mynginx2   1/1     Running   1          23h   10.19.130.69   devhost25-2   <none>           <none>

当我关了pod-mynginx2之后访问宿主机10.100.2.167应该就不能通了,结果居然是---能访问到!

大吃一惊!结果ip弄错了,宿主机不是10.100.2.167,而是10.100.1.237,犯了个低级错误。

结果如下:这回和预期的结果终于一样了。

[root@brdev1 matt]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
mynginx1   1/1     Running   0          13s   10.19.130.70   devhost25-2   <none>           <none>
mynginx2   1/1     Running   0          7s    10.19.130.71   devhost25-2   <none>           <none>
[root@brdev1 matt]# curl 10.19.130.70
<!DOCTYPE html>
<html>
...
</html>
[root@brdev1 matt]# curl 10.19.130.71
<!DOCTYPE html>
<html>
...
</html>
[root@brdev1 matt]# curl 10.100.1.237
<!DOCTYPE html>
<html>
...
</html>
[root@brdev1 matt]# kubectl delete pod mynginx2
pod "mynginx2" deleted
[root@brdev1 matt]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATES
mynginx1   1/1     Running   0          3m43s   10.19.130.70   devhost25-2   <none>           <none>
[root@brdev1 matt]# curl 10.19.130.70
<!DOCTYPE html>
<html>
...
</html>
[root@brdev1 matt]# curl 10.19.130.71
^C  #无响应
[root@brdev1 matt]# curl 10.100.1.237
curl: (7) Failed connect to 10.100.1.237:80; 拒绝连接

2、宿主机上是不是本身就开启了nginx,所以恰巧就能访问

确认宿主机上没有开启nginx

3、宿主机上的端口开放情况

使用netstat查看宿主机的端口开放,居然没有发现80端口开着,好奇怪。

[root@devhost25-2 ~]# netstat -ltpne |grep 80
tcp6       0      0 10.100.1.237:41280      :::*                    LISTEN      0          840891     24698/java

那如果在10.100.1.237宿主机上启动一个nginx端口开在80,结果会是什么样子呢。

我居然启动了,没有端口已被占用的报错。现在把宿主机上的nginx的index页面的内容改一下,看访问10.100.1.237:80时,到底访问的是哪一个nginx。

分别从集群内部3台服务器和集群外部1台服务器的机器取访问10.100.1.237:80,访问到的都是pod中的nginx。

会不会跟启动顺序有关,因为现在的情况是先启动了pod-nignx,后启动 宿主机-nginx,那现在将pod-nginx关闭,访问10.100.1.237:80,看是啥。

集群内部3台服务器和集群外部1台服务器访问10.100.1.237:80,结果一致,都是宿主机-nginx。

再启动pod-nginx,查看结果。

访问结果又变回pod-nginx了,4台服务器结果一致。

再去看一下宿主机-nginx的日志,有没有报错信息-----------没有错误日志

现在基本可以得出结论了:当pod和宿主机同时使用某一个端口时,不会因为冲突而报错,但是pod会优先占用端口,而与启动顺序无关。

至于为什么会这样,就不去深究了,毕竟精力有限,作为运维实施,了解到这样子的程度应该够用了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1:POD创建创建文件pod_test.yamlapiVersion: v1kind: Podmetadata:n...
    运维之美阅读 4,618评论 0 4
  • k8s中最为重要的基础资源,pod,pod controller,servicepod controller类型有...
    stephe_c阅读 2,564评论 0 1
  • 容器技术概念入门篇 从进程说开去 容器本身没有价值,有价值的是“容器编排”。 容器其实是一种沙盒技术。顾名思义,沙...
    白板时钟阅读 2,493评论 0 2
  • 1.Pod Pod是k8s的最基本的操作单元,包含一个或多个紧密相关的容器,类似于豌豆荚的概念。一个Pod可以被一...
    jony456123阅读 7,397评论 0 5
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,087评论 2 7