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会优先占用端口,而与启动顺序无关。

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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