配置Kubernetes外网访问集群


Posted in Servers onMarch 31, 2022

查询 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)。

配置Kubernetes外网访问集群

配置 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外网访问集群的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Servers 相关文章推荐
Nginx优化服务之网页压缩的实现方法
Mar 31 Servers
苹果M1芯片安装nginx 并且部署vue项目步骤详解
Nov 20 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
Tomcat starup.bat 脚本实现开机自启动
Apr 20 Servers
KVM基础命令详解
Apr 30 Servers
鲲鹏 CentOS 7 安装Python3.7
May 11 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
Nginx 配置 HTTPS的详细过程
May 30 Servers
windows系统安装配置nginx环境
Jun 28 Servers
Nginx如何获取自定义请求header头和URL参数详解
Jul 23 Servers
CentOS7设置ssh服务以及端口修改方式
Dec 24 Servers
CKAD认证中部署k8s并配置Calico插件
Mar 31 #Servers
使用kubeadm命令行工具创建kubernetes集群
Mar 31 #Servers
Minikube搭建Kubernetes集群
Apache Pulsar结合Hudi构建Lakehouse方案分析
Apache Hudi的多版本清理服务彻底讲解
Z-Order加速Hudi大规模数据集方案分析
Mar 31 #Servers
深入解析Apache Hudi内核文件标记机制
You might like
php编程每天必学之验证码
2016/03/03 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
老公给老婆的道歉信
2014/01/10 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
网吧消防安全制度
2014/01/28 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技