浅入Kubernetes(8):外网访问集群

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 浅入Kubernetes(8):外网访问集群

在前面几篇文章中,我们学习了 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)。


微信图片_20220505144201.png

【图来源: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。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
24天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
25天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
150 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
488 1
|
1月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
107 1
|
1月前
|
存储 Kubernetes 负载均衡
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
基于Ubuntu-22.04安装K8s-v1.28.2实验(四)使用域名访问网站应用
28 1
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
51 1
|
1月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
142 0
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
73 0
|
1月前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群