Kubernetes 网络:Pod 和 container 的那点猫腻
1. Kubernetes 网络模型
- 所有容器都可以不用 NAT 和别的容器通信。
- 所有节点都可以不用 NAT 和所有容器通信,反之亦然。
- 容器的地址和外部看到的地址是同一个地址。
2. 单节点 Pod 访问
$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: httpd-test
image: httpd
- name: bootcamp-test
image: bootcamp:v1 $ kubectl apply -f deployment.yaml
deployment.apps/deployment created $ kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-595bb7bd6c-6jxwr 2/2 Running 0 44s
$ netstat -ntlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10204/httpd
tcp6 0 0 :::8080 :::* LISTEN 10077/node $ ps aux | grep 10077 | grep -v grep
root 10077 0.0 0.9 708220 23720 ? Sl 09:32 0:00 node server.js
$ ps aux | grep 10204 | grep -v grep
root 10204 0.0 0.1 5940 4360 ? Ss 09:32 0:00 httpd -DFOREGROUND
$ kubectl exec -it deployment-595bb7bd6c-6jxwr /bin/bash
Defaulting container name to bootcamp-test.
Use 'kubectl describe pod/deployment-595bb7bd6c-6jxwr -n default' to see all of the containers in this pod.
root@deployment-595bb7bd6c-6jxwr:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.5/24 brd 172.18.0.255 scope global eth0
valid_lft forever preferred_lft forever root@deployment-595bb7bd6c-6jxwr:/# curl 172.18.0.5:8080
Hello Kubernetes bootcamp! | Running on: deployment-595bb7bd6c-6jxwr | v=1
root@deployment-595bb7bd6c-6jxwr:/# curl 172.18.0.5:80
<html><body><h1>It works!</h1></body></html>
$ curl 172.18.0.5:8080
Hello Kubernetes bootcamp! | Running on: deployment-595bb7bd6c-6jxwr | v=1
$ curl 172.18.0.5:80
<html><body><h1>It works!</h1></body></html>
$ curl 172.18.0.5:8081
curl: (7) Failed to connect to 172.18.0.5 port 8081: Connection refused
3. Pod 网络模型
$ docker ps | grep deployment
24adb2a738f4 httpd "httpd-foreground" Up 6 minutes k8s_httpd-test_deployment-..
1339d17223d8 8fafd8af70e9 "/bin/sh -c 'node se…" Up 7 minutes k8s_bootcamp-test_deployment-..
c86a97fff88b k8s.gcr.io/pause:3.1 "/pause" Up 7 minutes k8s_POD_deployment-...
$ mkdir -p /var/run/netns
$ docker inspect --format '{{ .State.Pid }}' 24adb2a738f4
8349
$ docker inspect --format '{{ .State.Pid }}' 1339d17223d8
8189
$ docker inspect --format '{{ .State.Pid }}' c86a97fff88b
8100 $ ln -s /proc/8349/ns/net /var/run/netns/httpd
$ ln -s /proc/8189/ns/net /var/run/netns/bootcamp
$ ln -s /proc/8100/ns/net /var/run/netns/pause $ ip netns list
pause (id: 3)
bootcamp (id: 3)
httpd (id: 3) $ ip netns exec httpd ls -la /proc/self/ns/
lrwxrwxrwx 1 root root 0 Jan 17 08:37 net -> 'net:[4026532636]'
...
$ ip netns exec bootcamp ls -la /proc/self/ns/
lrwxrwxrwx 1 root root 0 Jan 17 08:37 net -> 'net:[4026532636]'
...
$ ip netns exec pause ls -la /proc/self/ns/
lrwxrwxrwx 1 root root 0 Jan 17 08:37 net -> 'net:[4026532636]'
...
$ docker inspect 24adb2a738f4 | grep NetworkMode
"NetworkMode": "container:c86a97fff88bd73d221dfbe56e209e868f4479671bca9d01c14fd07ba1f03a4d",
$ docker inspect 1339d17223d8 | grep NetworkMode
"NetworkMode": "container:c86a97fff88bd73d221dfbe56e209e868f4479671bca9d01c14fd07ba1f03a4d",
$ docker inspect c86a97fff88b | grep NetworkMode
"NetworkMode": "default"
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242ed103e29 no vethd2c436f $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
11: veth4132daf@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 7a:db:25:ff:27:85 brd ff:ff:ff:ff:ff:ff link-netnsid 3
inet6 fe80::78db:25ff:feff:2785/64 scope link
valid_lft forever preferred_lft forever root@deployment-595bb7bd6c-6jxwr:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.5/24 brd 172.18.0.255 scope global eth0
valid_lft forever preferred_lft forever
Kubernetes 网络:Pod 和 container 的那点猫腻的更多相关文章
- kubernetes 的pod控制器
转载于网络 pod是kubernetes的最小单元,自主式创建的pod删除就没有了,但是通过资源控制器创建的pod如果删除还会重建.pod控制器就是用于实现代替我们去管理pod的中间层,并帮我们确 ...
- Kubernetes网络的4种解决方案
一.Kubernetes + Flannel Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的 ...
- Kubernetes探索学习004--深入Kubernetes的Pod
深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...
- 深入解读docker网络与kubernetes网络
前言:你是否学习使用k8s很久很久了可是对于网络这块仍旧似懂非懂呢? 您是否对网上一堆帖子有如下的抱怨: 打开多个博客,然后发现有区别么? 明显是直译过来的,越看越迷糊 “因为xxx,所以yyy”,. ...
- 从零开始入门 K8s | Kubernetes 网络概念及策略控制
作者 | 阿里巴巴高级技术专家 叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什 ...
- Kubernetes之Pod使用
一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...
- Kubernetes网络之Flannel工作原理
目录 1.Docker网络模式 1.1 bridge网络的构建过程 1.2 外部访问 2.Kubernetes网络模式 2.1 同一个Pod中容器之间的通信 2.2 不同Pod中容器之间的通信 2.3 ...
- kubernetes concepts -- Pod Overview
This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...
- 超长干货丨Kubernetes网络快速入门完全指南
Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...
- DevOps专题|玩转Kubernetes网络
Kubernetes无疑是当前最火热的容器编排工具,网络是kubernetes中非常重要的一环, 本文主要介绍一些相应的网络原理及术语,以及kubernetes中的网络方案和对比. Kubernete ...
随机推荐
- npm install 报-4048错误
报错原因: 有缓存 权限不够 有三种解决方法: 第一种:找到.npmrc文件并删除 在 C:\Users\自己用户的文件夹\ 下找到 .npmrc 文件并删除 注意:这个文件是隐藏的,需要显示隐藏才能 ...
- keycloak~从login-status-iframe页面总结如何跨域传值~续
keycloak~从login-status-iframe相关文章,可阅读我的这两篇keycloak~从login-status-iframe页面总结如何跨域传值,keycloak~对接login-s ...
- TS MQTT封装
TS MQTT封装 导入相关包 npm i mqtt npm i lodash guid 随机生成就行,具体可以参考百度或者随便生成一个随机数* 代码封装 import mqtt from 'mqtt ...
- Docker部署系列之Docker Compose安装Redis三主三从集群
总结/朱季谦 在日常开发或者编程当中,经常需要用到redis集群,若是按照传统的方式,一个机器一个机器搭建,难免过于繁琐,故而可以通过dock er-compose编排方式,快速搭建.我在搭建过程当中 ...
- C#汉诺塔递归算法实现
目录: 一.什么是递归 1.先来看一下一个递归的例子 2.递归的基本原理 二.汉诺塔问题 1.汉诺塔的故事 2.回到编程,汉诺塔问题主要就是解决这个问题: 3.怎么解决汉诺塔问题 要解决汉诺塔问题就要 ...
- 一篇文章彻底搞懂TiDB集群各种容量计算方式
背景 TiDB 集群的监控面板里面有两个非常重要.且非常常用的指标,相信用了 TiDB 的都见过: Storage capacity:集群的总容量 Current storage size:集群当前已 ...
- C++通过文件指针获取文件大小
目录 1. 叙述 2. 结论 1. 叙述 对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取.网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小.但是我总觉得这样做可 ...
- Cassandra Gossip协议的二三事儿
摘要:Gossip协议是Cassandra维护各节点状态的一个重要组件,下面我们以Gossip协议三次握手为线索逐步分析Gossip协议源码. Gossip协议是Cassandra维护各节点状态的一个 ...
- OpenCV萌新福音:易上手的数字识别实践案例
摘要:信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的. 本文分享自华为云社区<Python openCV案例:信用卡数字识别>,原文作者:深蓝的回音 . ...
- Open Serverless Benchmark Initiative: 华为云联合上海交大发布ServerlessBench 2.0
Key Takeaways 华为云联合上海交大,首次提出 Open Serverless Benchmark Initiative (OSBI) ,推动Serverless基准测评规范化.标准化: O ...