配置Kubernetes外网访问集群

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

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

(0)

相关推荐

  • Kubernetes(K8S)入门基础内容介绍

    Introduction basic of kubernetes 我们要学习 Kubernetes,就有首先了解 Kubernetes 的技术范围.基础理论知识库等,要学习 Kubernetes,肯定要有入门过程,在这个过程中,学习要从易到难,先从基础学习. 那么 Kubernetes 的入门基础内容(表示学习一门技术前先了解这门技术)包括哪些? 根据 Linux 开源基金会的认证考试,可以确认要了解 Kubernetes ,需要达成以下学习目标: Discuss Kubernetes. Lea

  • kubernetes中的namespace、node、pod介绍

    namepace.node.pod? 当我们讨论 k8s 时总是会讨论集群,k8s 中的每个集群由多个机器/虚拟机组成,集群也被称为 命名空间(namespace),命名空间是虚拟的,因此也叫虚拟集群. Namespace 是对一组资源和对象的抽象集合. node 是集群中的单个机器/虚拟机,node 有两种,一种是 master ,一种是 worker.master 用来运行 kubernetes 服务,例如 API Server:worker 是真正工作的节点,用来运行你的容器. maste

  • 使用kubeadm命令行工具创建kubernetes集群

    目录 命令行工具 通过软件仓库安装 二进制文件下载安装 ubutu & centos 快速安装 创建 kubernetes 集群 1,创建 Master 2,然后初始化集群网络. 3,加入集群 清除环境 命令行工具 主要有三个工具,命令行工具使用 kube 前缀命名. kubeadm:用来初始化集群的指令. kubelet:在集群中的每个节点上用来启动 Pod 和容器等. kubectl:用来与集群通信的命令行工具. 通过软件仓库安装 方法 ① 此方法是通过 Google 的源下载安装工具包.

  • Minikube搭建Kubernetes集群

    Minikube 打开 https://github.com/kubernetes/minikube/releases/tag/v1.19.0 下载最新版本的二进制软件包(deb.rpm包),再使用 apt 或 yum 安装. 或者直接下载 minikube 最新版本二进制文件(推荐). curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.19.0/minikube-linu

  • Kubernetes集群的组成介绍

    Kubernetes集群的组成 我们谈起 Kubernetes 和应用部署时,往往会涉及到容器.节点.Pods 等概念,还有各种术语,令人眼花缭乱.为了更好地摸清 Kubernetes,下面我们将介绍 Kubernetes 中与应用程序部署(deployment)和执行(execution)相关的知识. Kubernetes 集群由多个组件(components).硬件(hardware).软件(software)组成,它们共同工作来管理容器化(containerized)应用的部署和执行,这些

  • 配置Kubernetes外网访问集群

    查询 Service 关于 Service,读者可以查看官方文档的资料:https://kubernetes.io/zh/docs/concepts/services-networking/service/ Service 是 k8s 中为多个 pod 公开网络服务的抽象方法.在 k8s 中,每个 pod 都有自己的 ip 地址,而且 Service 可以为一组 pod 提供相同的 DNS ,使得多个 pod 之间可以相互通讯,k8s 可以在这些 pod 之间进行负载均衡. 查询 pod: ku

  • VMware下配置Linux系统局域网和外网访问图文教程

    要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设你装的是一个minimal版本的CentOS,那么很多Linux系统下面的工具都是没有被安装的,这个时候如果不能访问互联网,你会感觉特别的蛋疼,因为很多工具都没法下载以及安装,那么,今天小编就给大家分享一下如何在VMware下配置Linux系统成功访问局域网和外网. 第一步:打开VMware虚拟机,

  • Linux安装mysql并配置外网访问的实例

    配置步骤 1.查看是否配置DNS 如果没有配置DNS参照前文配置DNS 配置相关 如果没有配置DNS yum命令找不到Linux软件库的 DNS配置免费的 DNS1=114.114.114.114即可,也可以加一个备用的DNS2=119.29.29.29 2.用yum安装mysql yum -y install mysql mysql-server mysql-dev 这里用yum 进行-y 同意操作,后面的三个软件分别是mysql, mysql-server,mysql-dev无关顺序 3.启

  • 阿里云服务器安装配置tomcat 添加外网访问端口的教程

    阿里云服务器安装配置tomcat 添加外网访问端口 最近双十一不是,买了一个阿里云服务器玩玩,但是配置好tomcat,添加安全组规则后,死活访问不通,telnet 也无法通过,好在最好经过一阵废寝忘食之后,成功解决问题,下面就记录一下如何解决第一次在阿里云上部署tomcat能够在外网访问,添加端口映射,只要你跟着博主的步骤操作,一般是没有问题的. 一.JAVA环境配置 1.1 Jdk和Tomcat下载 首先我们需要安装 jdk 和 tomcat ,地址都已经给您备好了,往下看: 查看linux

  • nginx外网访问内网站点配置操作

    背景: 站点是前后端分离:vue+springboot 前端内网地址:192.168.1.10:81 API内网地址:192.168.1.12:8080 外网域名:abc.ab.com 外网IP:10.114.X.X 需求: 通过域名可以访问站点且站点静态资源且可访问API请求数据 方案一:(前提:外网域名映射服务器外网IP) 1.nginx配置域名监听且访问静态资源 2.重点来了!!!静态资源请求API的地址由192.168.1.12:8080修改为域名访问方式(abc.ab.com:8080

  • Python使用Kubernetes API访问集群

    通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理,像这样: 使用 grep/cut 方式: # 查看所有的集群,因为你的 .kubeconfig 文件中可能包含多个上下文 kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}' #

  • 怎样设置才能允许外网访问MySQL

    设置mysql服务允许外网访问,修改mysql的配置文件,有的是my.ini,有的是my.cnf[linux]. 1:设置mysql的配置文件      /etc/mysql/my.cnf      找到 bind-address  =127.0.0.1  将其注释掉://作用是使得不再只允许本地访问:   重启mysql:/etc/init.d/mysql restart; 2:登录mysql数据库:mysql -u root -p mysql> use mysql;   查询host值: m

  • Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess

    Apache 从2.2升级到 Apache2.4.x 后配置文件 httpd.conf 的设置方法有了大变化,以前是将 deny from all 全部改成 Allow from all 实现外网访问,现在是将 Require all denied 以及 Require local 都该为 Require all granted 就可以了. .htaccess 如果不起作用将 LoadModule rewrite_module modules/mod_rewrite.so 前面的注释(#)去掉就

  • 设置Mysql5.6允许外网访问的详细流程分享

    最近部署mysql5.6,发现默认mysql只允许本地提供服务,如果要进行若干配置,记录如下. 一.设置MySQL服务允许外网访问 修改mysql的配置文件,有的是my.ini(windows),有的是my.cnf(linux), 在配置文件中增加 [mysqld] port=3306 bind-address=0.0.0.0 然后重新启动mysql服务,执行service mysql restart. 二.设置mysql用户支持外网访问 需要使用root权限登录mysql,更新mysql.us

  • kubernetes存储之GlusterFS集群详解

    目录 1.glusterfs概述 1.1.glusterfs简介 1.2.glusterfs特点 1.3.glusterfs卷的模式 2.heketi概述 3.部署heketi+glusterfs 3.1.准备工作 3.1.1.所有节点安装glusterfs客户端 3.1.2.节点打标签 3.1.3.所有节点加载对应模块 3.2.创建glusterfs集群 3.2.1.下载相关安装文件 3.2.2.创建集群 3.2.3.查看gfs pods 3.3.创建heketi服务 3.3.1.创建heke

随机推荐