前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes学习记录(3)——集群外部访问Pod或Service

kubernetes学习记录(3)——集群外部访问Pod或Service

作者头像
胡了了
发布2017-12-28 17:14:13
1.5K0
发布2017-12-28 17:14:13
举报
文章被收录于专栏:从零学习云计算
代码语言:javascript
复制
学习阅读的书籍为《kubernetes权威指南:从Docker到Kubernetes实践全接触》,书中有不少地方讲的比较模糊,故在此做下学习过程中的梳理。

Pod和Service是Kubernetes集群范围内的虚拟概念。集群外的客户端系统无法通过Pod的IP地址或者Service的虚拟IP地址和虚拟端口号访问到它们。

解决措施:

1.将容器应用的端口号映射到物理机上,包括两种方式

通过设置容器级别的hostPort,将容器应用的端口号映射到物理机上。

建立Pod的yaml为:pod-hostport.yaml。需要注意,在yaml中不要使用tab,同时缩进会影响yaml中的数据结构,注意检查缩进。

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    image: kubeguide/tomcat-app:v2
    ports:
    - containerPort: 8080
      hostPort: 8081

需要注意!当指定hostPort之后,同一台宿主机将无法启动该容器的第2份副本。后面会有例子进行测试。

代码语言:javascript
复制
kubectl create -f pod-hostport.yaml 
这里写图片描述
这里写图片描述

创建Pod时,需要下载基础镜像,推荐在nodes服务器上先下载好基础镜像,或者搭建本地docker镜像仓库,速度会快很多。

代码语言:javascript
复制
kubectl get pods -o wide
这里写图片描述
这里写图片描述

可以看到webapp被分配到了192.168.121.139这台node上。

代码语言:javascript
复制
curl 192.168.121.139:8081

使用curl访问该IP地址上的8081端口,可以获得返回值。 再创建pod-hostport-rc.yaml,对“当指定hostPort之后,同一台宿主机将无法启动该容器的第2份副本”这句话进行验证。

代码语言:javascript
复制
apiVersion: v1
kind: ReplicationController
metadata:
  name: hostporttest
  labels:
    app: hostporttest
spec:
  replicas: 5
  selector:
    app: hostporttest
  template:
    metadata:
      labels:
        app: hostporttest
    spec:
       containers:
       - name: hostporttest
         image: kubeguide/tomcat-app:v2
         ports:
         - containerPort: 8080
           hostPort: 8081

删除上文创建的pod。创建RC,查看pods的自动创建情况。

代码语言:javascript
复制
kubectl delete -f pod-hostport.yaml 
kubectl create -f pod-hostport-rc.yaml 
这里写图片描述
这里写图片描述

我的node服务器一共有两台,IP地址分别为192.168.121.139和192.168.121.140。从上图可以看出,RC本来需要自动创建5个pod,但由于pod设定hostPort,所以每台node只能创建该容器的一个副本,最终只创建了2个Pod。 执行指令,查看处于Pending状态的Pod,以hostporttest-0krbs为例。

代码语言:javascript
复制
kubectl describe pod hostporttest-0krbs
这里写图片描述
这里写图片描述

可以看见,由于所有nodes都已创建了该容器的副本,所以该Pod没有可供分配的nodes。

设置Pod级别的hostNetwork=true。

该Pod中所有容器的端口号都将直接被映射到物理机上。如果容器的ports定义部分如果不指定hostPort,则默认hostPort等于containerPort。否则,指定的hostPort必须等于containerPort的值。 在此,直接编写pod-hostnetwork-rc.yaml,验证同一台宿主机上能否创建多个该pod。

代码语言:javascript
复制
apiVersion: v1
kind: ReplicationController
metadata:
  name: hostnetwork
  labels:
    app: hostnetwork
spec:
  replicas: 5
  selector:
    app: hostnetwork
  template:
    metadata:
      labels:
        app: hostnetwork
    spec:
       hostNetwork: true
       containers:
       - name: hostnetwork
         image: kubeguide/tomcat-app:v2
         ports:
         - containerPort: 8080
代码语言:javascript
复制
kubectl create -f pod-hostnetwork-rc.yaml 

结果显示每台宿主机仍是只能创建一个该pod。

这里写图片描述
这里写图片描述

2.将Service的端口号映射到物理机上,包括两种方式

通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。

创建webapp-svc-nodeport.yaml。

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: hostnetwork
  labels:
    app: hostnetwork
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30003
  selector:
    app: hostnetwork
代码语言:javascript
复制
kubectl create -f webapp-svc-nodeport.yaml
curl 192.168.121.139:30003

可以获得返回结果。

通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。

这种用法仅用在公有云服务提供商的云平台上设置Service的场景。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决措施:
    • 1.将容器应用的端口号映射到物理机上,包括两种方式
      • 通过设置容器级别的hostPort,将容器应用的端口号映射到物理机上。
      • 设置Pod级别的hostNetwork=true。
    • 2.将Service的端口号映射到物理机上,包括两种方式
      • 通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。
      • 通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档