K8s 的端口port映射问题

背景

对于port 可能有以下大概三种需求

  1. 同一个pod 里不同container 可以访问
  2. 在一个cluster 里, 不同pod 里可以访问
  3. 暴露到集群外面。即 可以在集群外通过ip 端口访问

先来了解下 k8s cluster networking

k8s cluster networking

每个pod 都有自己的 IP 地址 。这意味着你不需要 处理容器port 对 主机 port 的映射。pods 就像VM 或者 物理机哪样

k8s 的IP 地址 存在于 pod scope - 在一个Pod 的 容器们 共享 networknamespaces, 包括IP 地址。这意味着在一个pod 里的容器们 能够通过localhost 访问彼此的 端口。这也意味着 在一个pod 里的容器们需要协调 端口的使用。这就叫做 "IP-per-pod" model

来看一个例子

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

将上面代码保存为nginx.yaml

kubectl apply -f nginx.yaml
# 查看pod
kubectl get pods -l run=my-nginx -o wide
# 查看pod ip
kubectl get pods -l run=my-nginx -o yaml | grep podIP

你可以ssh 连接到集群里的任意一个node 并curl IPs。 Note: 这个容器没有用node 的80 端口。也没有用NAT 规则到这个pod 上。这意味着可以在同一个node 上使用相同的 containerPort 并且在 你的集群里用ip 从node或者其他 pod 上去访问 它们。类似 Docker, ports 仍然可以被 published 到 host node 的接口上。但在这个网络模型下这个需求大大减少了。

Service

为什么需要 service ?

我们可以直接与pod 交流。但是当 一个node die 的时候会发生什么呢?
pod 也会die, 然后Deployment 会创建新的pods(IP不同)。这是 Service 要解决的问题。
来看一个service yaml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    run: my-nginx

kubectl get svc my-nginx

➜  k8s_demo kubectl get svc my-nginx
NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
my-nginx   ClusterIP   10.68.82.69   <none>        8080/TCP   26s

你可以从集群里的任意node 上 curl nginx Service on <CLUSTER-IP>:<PORT>。 Note: service IP 是完全虚拟的。

访问 Service

两种方式

  • 环境变量
  • DNS

环境变量

kubectl exec my-nginx-3800858182-jr4a2 -- printenv | grep SERVICE
这事你并没有发现 my-nginx servervice.因为 pods 先启动的。还带来的一个缺点是 2个pods 都在一个机器上,当机器挂掉, service 也会挂掉。我们先杀死两个pod 然后 等待deployment 重新创建。会正确调度并且带有正确的环境变量。

DNS

k8s 提供了DNS 集群附加服务会自动授予其他services dns name。你可以检查它是不是在你的集群运行.
你可以在一个pod里 curl <service-name>:<port> 来访问service

kubectl get services kube-dns --namespace=kube-system

NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.68.0.2    <none>        53/UDP,53/TCP,9153/TCP   338d

expose internet

使用Nodeport 或者loadbalance

其他

当删除一个service, 再apply, cluster IP 也会变化
下面这张图 是说明了 deployment 的port 参数。这表示这个参数是不必要的,即使没有也会暴露出来


image.png

参考

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