在前面几篇文章中,我们学习了 kubeadm 、kubectl 的一些命令,也学会了 Deployment、Service、ReplicaSet 的用法以及配置。本篇的内容主要是介绍如何配置网络,使得能够在外部网络访问集群。

在开始之前,需要根据 浅入Kubernetes(6):CKAD认证中的部署教程浅入Kubernetes(7):应用部署实例,Deployment、Service、ReplicaSet 这两篇文章中的过程,部署好集群以及部署 nginx 应用。

查询 Service

关于 Service,读者可以查看官方文档的资料:https://kubernetes.io/zh/docs/concepts/services-networking/service/

Service 是 k8s 中为多个 pod 公开网络服务的抽象方法。在 k8s 中,每个 pod 都有自己的 ip 地址,而且 Service 可以为一组 pod 提供相同的 DNS ,使得多个 pod 之间可以相互通讯,k8s 可以在这些 pod 之间进行负载均衡。

查询 pod:

kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-585449566-d2fdc 1/1 Running 0 4h14m
nginx-585449566-krsch 1/1 Running 0 67m
nginx-585449566-l2j6h 1/1 Running 0 67m

查看 Service:

kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
nginx ClusterIP 10.101.245.225 <none> 80/TCP 4h19m

kubectl exec {pod名称} {要执行的命令} 可以在 pod 中执行某个命令,这里我们可以打印某个 pod 的环境变量。

kubectl exec nginx-585449566-d2fdc -- pritenv
# 或者
# kubectl exec nginx-585449566-d2fdc env
... ...
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.19.10
... ...

Service 外部服务类型

k8s 中可以将一个 Service 暴露到集群外部,外界可以通过 ip 访问这个 Service。Service 有个 ServiceType ,允许我们指定如何暴露服务。

Type 有三种类型,其取值说明如下:

  • ClusterIP

    通过集群内部 IP 暴露服务,也就是说只能在集群内部访问,ClusterIP 是 ServiceType 的默认值。

  • NodePort

    通过每个节点上的 IP 和静态端口(NodePort)暴露服务。由于其是节点上的 ,所以具有通过集群外部访问这个服务。

  • LoadBalancer

    使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

  • ExternalName

    通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。

【图来源:https://blog.csdn.net/yang75108/article/details/101101384

配置 ServiceType

我们删除之前 Deployment 部署 nginx 时,通过 expose 创建的 Service。

kubectl delete service nginx

然后重新创建 service。

kubectl expose deployment nginx --type=LoadBalancer

查询 Service(kubectl get services):

NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
nginx LoadBalancer 10.97.249.37 <pending> 80:31036/TCP 30s

这里我们说一下这个端口的一些说明。

Service 是针对一个 Pod 或多个 Pod 起效,它为一组 pod 暴露相同的端口。也就是说,同一个 Service 中的 pod 不能分别设置不同的 端口。而且前面我们的一个 Service 中,是为一个 nginx 创建 Deployment ,并且设置副本集,所以他们的 端口是一致的。

Service 不会直接把 pod 暴露的 端口映射到公网,Service 默认在 30000-32767 之间为我们映射端口。所以笔者服务器上,是 310361(外网) 映射了 80(内网)。

这时已经可以直接通过外网访问 Service 中的服务了。如果你不知道服务器的公网 ip,可以通过命令查询:

curl ifconfig.io

然后访问 http://x.x.x.x:31036 即可。

当使用 LoadBalancer 暴露服务到集群外部网络时,我们访问的实际上是 Service,而不是具体的某个 pod,然后 Service 会将流量重定向到后端 pod 中。这个要看实际环境和云服务商的支持。

伸缩数量

kubectl scale 命令可以扩容或缩容 Deployment、ReplicaSet、Replication Controller 或 Job 中Pod数量。在上一篇文件中中我们已经使用到。这里我们继续使用这个命令来伸缩 nginx 副本的数量,然后观察外部网络访问 Service 时的结果。

现在将我们的 nginx 副本数量设置为 0。

kubectl scale deployment nginx --replicas=0

再访问 公网的 31036 端口(具体端口看你查询出来的),发现无法访问了,因为 pod 数量为 0 ,Service 找不到 pod 来提供服务。

如果我们把 ReplicaSet 数量设置为 1 或以上,则又可以继续访问了。

kubectl scale deployment nginx --replicas=2

阶段总结

到此为止,我们的学习已经完成一个小阶段,能够创建集群、加入新的 Node、部署 pod 以及暴露公网 ip,允许外部访问,还可以提供多副本以负载均衡。接下来我们总结一下学习到的工具、命令,后续的学习会在这些基础之上开展。

  • kubeadm

    kubeadm initkubeadm join 创建集群和使节点加入集群。

  • kubectl

    kubectl 原理是请求 apiserver 完成某些操作,日常操作中,最常用的就是 kubectl。

    kubectl create {对象} ,创建 deployment、job 等对象。

    kubectl apply -f 应用 yaml 文件,完成某些操作。

    kubectl get {对象} 查询对象。

    kubectl scale {对象} 伸缩对象数量(ReplicaSet)。

    kubectl expose 创建 Service。

    kubectl describe 获取对象详细的信息。

    kubectl exec 在对象中执行命令,例如 pod。

浅入Kubernetes(8):外网访问集群的更多相关文章

  1. 浅入深出ETCD之【集群部署与golang客户端使用】

    前言 之前说了etcd的简介,命令行使用,一些基本原理.这次来说说现实一点的集群部署和golang版本的客户端使用.因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一 ...

  2. 浅入Kubernetes(11):了解 Service 和 Endpoint

    目录 Srevice Service 的创建及现象 Service 定义 Endpoint slices 创建 Endpoint.Service Service 创建应用 创建 Endpoint 浅入 ...

  3. 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)

    这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...

  4. Kafka集群无法外网访问问题解决攻略

    Kafka无法集群外网访问问题解决方法  讲解本地消费者和生产者无法使用远程Kafka服务器的处理办法 服务搭建好Kafka服务后,机本.测试 OK,外面机器却无法访问,很是怪异. 环境说明:  Ka ...

  5. 在linux安装redis单机和集群后,如何在windows上使用redis客户端或者java代码访问错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。

    这几天在学习在linux上搭建服务器的工作,可谓历经艰辛.可喜最后收获也不少. 这次是在linux上搭建redis服务器后从windows上缺无法访问,连接不上. 仔细回忆以前搭建nginx和ftp的 ...

  6. 浅入Kubernetes(6):CKAD认证中的部署教程

    目录 预设网络 kubeadm 安装 k8s 配置 calico 自动补全工具 状态描述 目前为止,笔者已经写了 5 篇关于 k8s 的文章,这一篇笔者将介绍 CKAD 认证官方课程中,如何部署 k8 ...

  7. 简单操作:10分钟实现在kubernetes(k8s)里面部署服务器集群并访问项目(docker三)

    前言 经过docker安装.k8s开启并登录,我们终于到 "部署k8s服务器集群并访问项目" 这一步了,实现的过程中有太多坑,好在都填平了,普天同庆. 在进行当前课题之前,我们需要 ...

  8. windows azure中国 里面建立一个虚拟机,与虚拟机建立通信 里面部署IIS,外网访问

    在windows azure中国 里面建立一个虚拟机,里面部署IIS,外网不能访问么? 外网访问的地址是给的那个DNS地址 ,比如我的是 DNS 名称 urbanairserver.cloudapp. ...

  9. Ubuntu下MySQL配置为外网访问

    Ububtu安装MySQL后默认外网无法连接,但是很多时候我们想要在外网访问方便管理.在这里,简单叙述一下自己在配置过程中的操作,步骤如下: 以root身份登入mysql mysql -u root ...

随机推荐

  1. 基于docker部署skywalking实现全链路监控

    一.概述 简介 skywalking是一个开放源码的,用于收集.分析,聚合,可视化来自于不同服务和本地基础服务的数据的可观察的平台,skywalking提供了一个简单的方法来让你对你的分布式系统甚至是 ...

  2. 你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?

    前言 过年回来的第二周了,终于有时间继续总结知识了.这次来看一下SQL调优的知识,这类问题基本上面试的时候都会被问到,无论你的岗位是后端,运维,测试等等. 像本文标题中的两个问题,就是我在实际面试过程 ...

  3. [极客大挑战 2019]Secret File 1

    题目的名字就暗示我们考点文件隐藏进入页面查看源码 得到隐藏的界面点击访问 点击给的"SECRET"按钮页面出现提示"没看清么?回去再仔细看看吧.",说明响应的时 ...

  4. free命令查看内存

    [root@jojo ~]# free -h total used free shared buff/cache available Mem: 991M 273M 64M 1.1M 653M 535M ...

  5. 开发过程中遇到的js知识点总结,面试题等,持续更新

     1.Object.freeze() 方法用于冻结一个对象,即将对象设置为不可扩展.将对象的所有自有的属性和方法(包括Symbol值的属性和方法)配置为不可配置,不可写. Object.freeze( ...

  6. Docker搭建HAproxy+tomcat 实现高可用

    构建业务镜像1创建tomcat-app1和tomcat-app2两个目录,代表不同的两个基于tomcat的业务.准备tomcat的配置文件[root@localhost ~]#mkdir -p /da ...

  7. flask wtforms 的效验

    flask版 .py from flask import Flask, render_template, request, session, current_app, g, redirect from ...

  8. hibernate 的一对多关联关系映射配置

    hibernate 是操作实体类: 表是一对多的关系,当创建这2个实体的时候 在一的一方定义一个多的一方的集合 在多的一方定义一个一的一方的对象 表是多对多的关系,当创建这2个实体的时候 在互相中都有 ...

  9. Redis的常用淘汰策略以及算法实现

    一.Redis的内存配置 1,Redis配置内存为多少合适? 默认:如果不设置最大内存大小或者设置最大内存大小为0,在64为操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存. 极限情况: ...

  10. Java系列教程-SpringMVC教程

    SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...