Linux云计算 |【第五阶段】CLOUD-DAY8

主要内容:

掌握DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器

一、DaemonSet控制器

DaemonSet在每个机器都要启动运行Pod时,确保全部或一些Node上运行Pod副本当有Node节点加入集群时,也会为他新增Pod副本,当Node从集群移除时,这些Pod也会被回收;(有多少个Node节点,就在每个节点上运行Pod副本)

删除DaemonSet控制器时,将删除所有它创建的Pod副本;

典型应用:Ceph节点、监控节点、Filebeat日志收集等;

系统服务:Kube-proxy和Flannel就是这种类型;

DaemonSet与Deployment在编写配置文件时非常相似,区别是不需要配置replicas参数POD副本数,因为DaemonSet是每节点启动Pod副本;

  • 格式:kubectl -n kube-system get daemonsets.apps     //查看DaemonSet控制器

补充:查询daemonsets.apps发现flannel和proxy的每个节点都创建了Pod副本,且没有二级控制器RS;(架构:daemonset-pod)

DaemonSet资源文件模板


编写DaemonSet资源文件示例:

[root@master ~]# vim mynginx.yaml
---                     //资源定义起始标志
kind: DaemonSet         //创建资源的类型(DaemontSet控制器,注意大小写)
apiVersion: apps/v1     //控制器资源类型的版本
metadata:               //控制器资源的元数据name: mynginx         //控制器资源的名称(mynginx)
spec:                   //控制器资源的详细定义selector:             //声明资源匹配选择器matchLabels:        //资源方式:匹配标签myapp: nginx     //为服务的后端选择标签(具体匹配的标签,与labels要一致)template:            //POD资源模板定义metadata:          //POD资源的元数据labels:          //声明定义标签myapp: nginx   //标签名(与matchLabels要一致)spec:              //容器的详细定义containers:             //容器定义- name: nginxcluster    //容器名称image: 192.168.1.100:5000/myos:nginx    //启动容器的镜像地址stdin: false        //标准输入,默认falsetty: false          //终端,默认falseports:              //服务端口定义- protocol: TCP      //服务使用的协议containerPort: 80   //容器监听的端口号restartPolicy: Always    //容器的死亡策略[root@master ~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
[root@master ~]# kubectl get pod -o wide

# DaemonSet控制器自动为所有节点上运行Pod副本;

[root@master ~]# kubectl get daemonsets.apps
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
mynginx   3         3         3       3            3           <none>          12m

# 测试效果

[root@master ~]# curl http://10.244.2.13
this is nginx
[root@master ~]# curl http://10.244.1.11
this is nginx
[root@master ~]# curl http://10.244.3.19
this is nginx

思考:

在查询Pod资源时,发现Proxy和Flannel的Pod资源是有4个Pod副本;而执行编写的daemonset资源文件时,只有3个副本;DaemonSet调度器调度到除Master以外的所有节点,因希望Master节点除了一些系统服务以外,不会再有其它的POD副本,防止其它消耗高的POD抢占资源;而默认在Master上设置了污点策略,所以其它POD副本不会在Master上部署;

二、污点策略

1、污点标签

NoSchedule:不会被调度(容器创建时有效)

PreferNoSchedule:尽量不调度(容器创建时有效)

NoExecute:驱逐节点(容器创建、运行时都有效),针对不同控制器有不同效果;

1)查看污点标签

  • - 格式:kubectl describe nodes | grep -P "^Taints"
  • - 格式:kubectl describe node [node-name]    //查看节点详细信息(Taints)

2)设置污点标签

- 格式:kubectl taint node =

删除污点标签

- 格式:kubectl taint node -


示例1:污点标签NoSchedule配置(创建容器时有效)

① 设置污点标签(在daemonset的资源文件上测试)

[root@master ~]# kubectl delete -f mynginx.yaml    //删除资源,重新创建
daemonset.apps "mynginx" deleted
[root@master ~]# kubectl describe nodes | grep -P "^Taints"

[root@master ~]# kubectl taint node node-0001 k1=v1:NoSchedule   //设置污点标签
node/node-0001 tainted
[root@master ~]# kubectl describe nodes | grep -P "^Taints"

[root@master ~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
[root@master ~]# kubectl get pods   //设置污点标签后,只有2节点有POD副本
NAME            READY   STATUS    RESTARTS   AGE
mynginx-6j8h4   1/1     Running   0          9s
mynginx-8g2wc   1/1     Running   0          9s

② 删除污点标签

[root@master ~]# kubectl taint node node-0001 k1-
node/node-0001 untainted

[root@master ~]# kubectl get pods   //移除污点标签后,3节点都有POD副本
NAME            READY   STATUS    RESTARTS   AGE
mynginx-6j8h4   1/1     Running   0          68s
mynginx-8g2wc   1/1     Running   0          68s
mynginx-z4k4k   1/1     Running   0          39s

解释:为node-0001节点设置NoSchedule污点标签后,在创建容器时,不会对该节点调度创建Pod副本;移除NoSchedule污点标签后,会自动重新调度分配Pod副本;


示例2:污点标签NoExecute配置(创建、运行容器时都有效)

针对不同的控制器配置污点标签NoExecute会有不同效果

[root@master ~]# kubectl get pod    //当前运行的Pod容器(DaemonSet控制器)
NAME            READY   STATUS    RESTARTS   AGE
mynginx-6j8h4   1/1     Running   0          64m
mynginx-8g2wc   1/1     Running   0          64m
mynginx-z4k4k   1/1     Running   0          64m[root@master ~]# kubectl apply -f myapache.yaml   //执行Deployment资源
deployment.apps/myapache created
[root@master ~]# kubectl scale deployment myapache --replicas=3
deployment.apps/myapache scaled
[root@master ~]# kubectl get pod -o wide    //查看Pod资源信息

[root@master ~]# kubectl taint node node-0003 k1=v1:NoExecute   //设置污点
node/node-0003 tainted
[root@master ~]# kubectl get pod -o wide

解释:在POD容器运行时,为node-0003节点设置NoExecute污点标签后,针对Deployment控制器,0003节点被驱逐,并按照Deployment控制器的规则在另一节点重建Pod副本,为满足高可用,保证副本为3;针对Daemonset控制器,0003节点被驱逐,但并未创建额外的副本;

[root@master ~]# kubectl taint node node-0003 k1-
node/node-0003 untainted
[root@master ~]# kubectl get pod -o wide

解释:为node-0003节点移除NoExecute污点标签后,针对Deployment控制器,继续使用另外节点重建的Pod副本;针对Daemonset控制器,为0003节点创建Pod副本;

2、容忍污点

某些时候需要无视污点标签进行操作,这种方式称为对污点的容忍;

节点亲和性是Pod 的一种属性,它使 Pod 被吸引到一类特定的节点。这可能出于一种偏好,也可能是硬性要求。Taint(污点)则相反,它使节点能够排斥一类特定的Pod。

容忍度(Tolerations)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的;

容忍污点资源文件模板:

三、Job / CronJob资源对象

1、Job资源对象

Job也称为单任务控制器,负责执行一次任务,保证任务在一个或多个Pod上执行成功;如果运行一个Pod,当第一个Pod失败或者被删除(比如因接待硬件失效或重启)时,Job对象会启动一个新的Pod,直到这个任务完成Completed;

删除Job控制器的操作,会清除所创建的全部Pods;

  • - 格式:kubectl get job.batch    //查看Job控制器

Job资源文件模板(架构:Job - pod)

补充:command 可以替换容器默认启动命令


编写Job资源文件示例:

[root@master ~]# vim myjob.yaml
---
apiVersion: batch/v1     //资源类型的版本
kind: Job                //资源的类型(Job)
metadata:                //控制器的元数据name: pi               //控制器的名称
spec:                    //控制器资源的详细定义template:              //POD资源模板定义spec:                //容器的详细定义containers:       //容器定义- name: piimage: 192.168.1.100:5000/myos:v1804command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]   //替换默认启动命令,打印输出π到2000位;restartPolicy: OnFailure    //容器重启策略,只支持[OnFailure,Nerver][root@master ~]# kubectl apply -f myjob.yaml
job.batch/pi created
[root@master ~]# kubectl get job.batch
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           9s         10s
[root@master ~]# kubectl get pod
NAME                       READY   STATUS      RESTARTS   AGE
pi-246kc                   0/1     Completed   0          19s

# 验证效果

[root@master ~]# kubectl logs pi-246kc    //打印输出结构显示在终端

补充:K8S核心为POD,POD外层使用不同控制器实现不同应用;

2、CronJob资源对象

CronJob重复多次任务控制器,像是Job的升级版,是基于时间管理的Job;

典型用法:Crontab周期性计划任务

CronJob的本质是在约定的时间创建Job;

在Job中会保留最后三次的状态,并进行滚动更新,其它会被清除;

CronJob资源文件模板(架构:CronJob - Job - Pod)


编写CronJob资源文件示例:

[root@master ~]# vim mycronjob.yaml
---                         //资源定义起始标志
apiVersion: batch/v1beta1   //资源类型的版本
kind: CronJob               //控制器资源类型(CronJob)
metadata:                   //控制器资源的元数据name: cronjob-pi          //控制器资源的名称
spec:                       //CronJob的详细定义schedule: "*/1 * * * *"   //每分钟创建一个JobjobTemplate:              //Job资源模板定义spec:                  //Job资源的详细定义template:            //POD资源模板定义spec:              //容器的详细定义containers:- name: piimage: 192.168.1.100:5000/myos:v1804command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: OnFailure[root@master ~]# kubectl apply -f mycronjob.yaml
cronjob.batch/cronjob-pi created
[root@master ~]# kubectl get cronjobs.batch
NAME         SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pi   */1 * * * *   False     0        <none>          5s
[root@master ~]# kubectl get pod
NAME                          READY   STATUS      RESTARTS   AGE
cronjob-pi-1625464980-266ss   0/1     Completed   0          9s   //Completed完成

其他资源对象

1)StatefulSet有状态服务相关POD

- 为了解有状态服务设计的一种控制器

- 基于PVC的稳定持久化存储

- 稳定的网络标志,基于Headless Service

- 有序部署,有序扩展/收缩(基于init containers实现)

2)Horizontal Pod Autoscaling控制器

- 自动扩展,可以根据业务的高峰和低谷自动水平扩展Pod节点,提高资源利用率;

四、Service服务与负载均衡

1、服务使用场景

使用Deployment控制器在创建简单WEB集群时,多副本会自动调度分配到不同主机上

例如:使用scale创建2副本实验

[root@master ~]# kubectl apply -f myapache.yaml
deployment.apps/myapache created
[root@master ~]# kubectl scale deployment myapache --replicas=2
deployment.apps/myapache scaled
[root@master ~]# kubectl get pod -o wide

[root@master ~]# kubectl delete pod myapache-7d689bf8f-rt2vw
pod "myapache-7d689bf8f-rt2vw" deleted
[root@master ~]# kubectl get pod -o wide

说明:当发现某一个Pod不能使用的时候,RS控制器会在其它机器上再创建一个相同的Pod及其对应的容器(IP端、分配节点发生变化),会变化的Pod给用户访问带了非常多的不便;

2、Service资源文件

Service就是解决该问题的办法(Service的本质就是LVS负载均衡),会创建一个Cluster IP,这个地址对应资源地址,不管Pod如何变化,Service总能自动发现找到对应的Pod,且Cluster IP保持不变,如果有Pod对应多个容器,Service会自动在多个容器间实现负载均衡;(主要功能:自动发现、负载均衡)

原理:Service通过 IPTABLES / LVS 规则将访问的请求最终映射到Pod的容器内部服务上。

1)创建Service服务

  • - 格式:kubectl apply -f Service的资源文件

2)查询Service服务

  • - 格式:kubectl get service

定义Service服务资源文件模板

解释说明:Service服务的端口

① port:Service开放在前端的Cluster IP上端口,是提供给集群内部客户访问Service的入口,提供集群内部服务访问使用(类似VIP:port)

② targetPort:是后端Pod上容器服务监听的端口,从port或nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort进入容器,从而达到访问Pod容器内部服务的目的;


编写Service服务资源文件示例:

注意:服务创建前,必须要基于运行的容器应用集群

[root@master ~]# vim clusterip.yaml
---
kind: Service        //定义Service资源类型
apiVersion: v1       //类型的版本
metadata:            //类型的元数据name: myapache     //类型的名称
spec:                //类型的详细定义ports:             //Service服务的端口- protocol: TCP      //后端服务所使用的协议,需要一致port: 80          //前端监听的服务端口号targetPort: 80    //后端目标主机的服务端口号selector:           //选择为哪个deployment提供服务(后端)myapp: httpd      //标签必须与deployment资源文件中一致(mypod)type: ClusterIP     //服务类型(ClusertIP)[root@master ~]# kubectl apply -f clusterip.yaml
service/myapache created
[root@master ~]# kubectl get service

# 访问Service服务

Service服务只有在集群内部才可以访问,集群外无法访问服务(LVS-NAT网络架构有关 )

[root@master ~]# kubectl get pod -o wide       //查看集群容器

[root@master ~]# kubectl apply -f mypod.yaml    //创建Pod,并在Pod容器中访问服务
pod/mypod created
[root@master ~]# kubectl exec -it mypod -- /bin/bash
[root@mypod /]# curl http://10.254.106.60/info.php    //验证Service服务的轮询效果
<pre>
Array
([REMOTE_ADDR] => 10.244.3.30[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-gmgz9    //POD容器名
1229[root@mypod /]# curl http://10.254.106.60/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.3.30[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-k2vzw    //POD容器名
1229

# 删除其中一台容器,等待控制器重建,并测试Service服务的自动发现和负载均衡

[root@master ~]# kubectl delete pod myapache-7d689bf8f-k2vzw
pod "myapache-7d689bf8f-k2vzw" deleted
[root@master ~]# kubectl get pod -o wide

[root@master ~]# kubectl exec -it mypod -- /bin/bash
[root@mypod /]# curl http://10.254.106.60/info.php     //验证Service服务的轮询效果
<pre>
Array
([REMOTE_ADDR] => 10.244.3.30[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-hprkc    //POD容器名
1229[root@mypod /]# curl http://10.254.106.60/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.3.30[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-gmgz9    //POD容器名
1229

多个资源可以写到同一个YAML文件,使用【---】分割,用一个文件管理2个服务

补充:一般情况下,先创建Deployment,再创建Service,实现Service资源为Deployment资源提供服务,方便2个服务的管理;

— 示例:多资源文件

① 清除原来的资源文件配置

[root@master ~]# kubectl delete -f myapache.yaml
[root@master ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          8h

② 使用重定向方式,将2个资源服务写到同一个YAML文件

[root@master ~]# cat clusterip.yaml >> myapache.yaml   //重定向追加方式
---
kind: Deployment       //定义Deployment资源类型
apiVersion: apps/v1
metadata:name: myapache
spec:selector:matchLabels:myapp: httpdreplicas: 2        //副本数为2template:metadata:labels:myapp: httpdspec:containers:- name: webclusterimage: 192.168.1.100:5000/myos:httpdstdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always---
kind: Service      //定义Service资源类型
apiVersion: v1
metadata:name: myapache
spec:ports:- protocol: TCPport: 80targetPort: 80selector:myapp: httpdtype: ClusterIP[root@master ~]# kubectl apply -f myapache.yaml
deployment.apps/myapache created
service/myapache created
[root@master ~]# kubectl get pod      //查看Pod资源

[root@master ~]# kubectl get service    //查看Service服务

3、服务自动发现

主要目的:通过Service服务名称代替Cluster-IP)

Cluster-IP是集群分配的服务IP,提供前端集群访问;因Cluster-IP也是随机分配的,固定IP不太可取,所以K8S内部有服务的域名注册功能,推荐使用服务名称来当Cluster-IP;在集群内部通过服务的名称访问,服务的名称是通过coredns解析,每个服务在创建的过程中都会完成自动注册;

  • 服务名称:..svc.cluster.local

例:ClusterIP 10.254.69.188:80 = myapache.default.svc.cluster.local

解释:服务名称.default命名空间.service.cluster.local

[root@master ~]# kubectl get service

cluster.local在Master初始化配置文件中定义

[root@master ~]# vim init/kubeadm-init.yaml


示例:通过服务名称来代替ClusterIP访问集群容器

[root@master ~]# kubectl exec -it mypod -- /bin/bash
[root@mypod /]# curl http://myapache.default.svc.cluster.local
this is apache

# 因/etc/resolv.conf域名配置文件默认已加search搜索头,搜索域名后缀(自动补齐)

[root@mypod /]# cat /etc/resolv.conf
nameserver 10.254.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:5[root@mypod /]# curl http://myapache
this is apache
[root@mypod /]# ping myapache

补充:search可以将搜索的名称和域名配置文件的域名进行拼接搜索;

五、服务原理

1、代理模式种类

① Kubernetes v1.0 服务支持userspace代理模式(用户命名空间)

  • 数据流向:Client-> ClusterIP-> kube-proxy-> 容器

补充:图中Kube-proxy在集群中起到调度负载均衡作用,并需要与Apiserver进行通信,Apiserver能获取POD容器的地址并存入ETCD数据库,根据ETCD跟踪容器地址;但遇到大并发高负载的情况,Kube-proxy并不优于LVS专门的负载均衡器,所以性能就变差了;

② Kubernetes v1.1 服务支持iptables代理模式

  • 数据流向:Client-> ClusterIP--(旁路模式kube-proxy)-> 容器

补充:图中Kube-proxy在集群中负责修改IPTABLES规则,不负责流量数据转发;集群中通过IPTABLES来进行端口转发;

③ Kubernetes v1.8 服务支持ipvs代理模式

  • 数据流向:Client-> ClusterIP--(旁路模式kube-proxy)-> 容器

补充:图中Kube-proxy在集群中负责修改LVS规则,不负责流量数据转发;集群中通过LVS来进行调度转发;

补充:在Kubernetes v1.2中,kube-proxy的iptables模式成为默认设置,现阶段默认使用ipvs,如果不能满足要求回退至iptables模式;

说明:Service服务本质就是LVS负载均衡,而Kube-proxy就是负责修改LVS规则;

[root@master ~]# ipvsadm-save -n | grep 10.254.69.188
-A -t 10.254.69.188:80 -s rr
-a -t 10.254.69.188:80 -r 10.244.1.15:80 -m -w 1    //集群容器RIP地址
-a -t 10.254.69.188:80 -r 10.244.2.20:80 -m -w 1    //集群容器RIP地址
[root@master ~]# kubectl get pod -o wide

2、服务类型

Service允许指定一个Type类型(一般默认是ClusterIP)

① ClusterIP:通过集群的内部IP暴露服务,但服务只能够在集群内部可以访问,这也是默认的ServiceType;

② NodePort:通过每个Node上的IP和静态端口暴露服务,NodePort服务会路由到ClusterIP服务,可以对外提供服务;

③ LoadBalancer:使‘用云提供商的负载均衡器,如华为云容器引擎CCE,外部的负载均衡器可以路由到NodePort服务和Cluster服务;(对外提供服务)

1)nodePort服务

场景:之前构建的服务已可以在集群内部运转,但集群外还无法访问集群内部的服务;有时候,服务可能来自第三方或其他团队,我们无法把所有服务都放入集群内部里,这时就需要集群内部和集群外部的服务能够实现互相访问;

- LoadBalancer:使用外部的云服务(需支持externallPs)

- nodePort:基于端口对外提供服务(四层)(端口映射)

- Ingress:使用ingress控制器(七层)(本质为Nginx)

nodePort服务资源文件模板:


编写nodePort服务资源文件示例:
[root@master ~]# vim mynodeport.yaml
---
kind: Service         //定义资源的类型
apiVersion: v1
metadata:name: mynodeport    //资源的名称
spec:ports:- protocol: TCPport: 80targetPort: 80selector:           //选择为哪个deployment提供服务(后端)myapp: httpd      //标签必须与deployment资源文件中一致(mypod)type: NodePort      //指定服务类型(NodePort)[root@master ~]# kubectl apply -f mynodeport.yaml
service/mynodeport created
[root@master ~]# kubectl get service

补充:80为访问容器服务的端口,30705为对外发布访问集群的端口;

# K8S中所有节点都是LVS负载均衡器,通过Node节点30705端口均可访问集群容器

[root@ecs-proxy ~]# curl http://192.168.1.31:30705/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.1.0[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-sn2xn    //POD容器
1229[root@ecs-proxy ~]# curl http://192.168.1.32:30705/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.2.0[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-lwpb8    //POD容器
1229[root@ecs-proxy ~]# curl http://192.168.1.33:30705/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.3.0[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-sn2xn    //POD容器
1229

补充:集群服务图例

2)Headless服务

场景:有时候不需要或不想要负载均衡,以及单独的Cluster IP,可以创建Headless服务;

原理:Headless服务会把IP通过多个A记录的形式解析到具体的容器IP上,多用于有状态的服务;

主要目的:用户通过headless服务,解析到容器IP,不需要使用ClusterIP,不使用负载均衡,直接访问容器;

Headless服务资源文件模板


编写headless 服务资源文件示例:
[root@master ~]# vim myheadless.yaml
---
kind: Service           //定义资源的类型
apiVersion: v1
metadata:name: myheadless      //资源的名称
spec:ports:- protocol: TCPport: 80targetPort: 80selector:            //选择为哪个deployment提供服务(后端)myapp: httpd       //标签必须与deployment资源文件中一致(mypod)type: ClusterIP      //类型为ClusterIPclusterIP: None      //设置None[root@master ~]# kubectl apply -f myheadless.yaml
service/myheadless created
[root@master ~]# kubectl get service

# 进入pod查看解析结果

[root@master ~]# kubectl exec -it mypod -- /bin/bash
[root@mypod /]# yum install -y bind-utils   //软件包含host命令,用来解析域名
[root@mypod /]# host myheadless.default.svc.cluster.local
myheadless.default.svc.cluster.local has address 10.244.2.20
myheadless.default.svc.cluster.local has address 10.244.1.15

五、Ingress插件

1、Ingress介绍

Ingress公开了从集群外部到集群内service路由,实现负载均衡;Ingress本质是Nginx,所以只能发布7层的web服务,也可以将Ingress配置为提供服务外部可访问的URL、负载均衡流量;

Ingress控制器通常由负载均衡器来实现;必须具有ingress控制器才能满足Ingress的要求,仅创建资源无效;

Ingress镜像地址:https://github.com/kubernetes/ingress-nginx

  • 格式:kubectl get ingresses //查看ingress控制器 

架构图:

说明:用户直接访问Ingress控制器,由于是7层的负载均衡,控制器上可以实现基于域名的负载均衡,每个域名对应一个Service(Cluster IP),再对应POD资源;


示例:配置Ingress控制器

① 安装控制器

# 拷贝云盘 kubernetes/v1.17.6/ingress 文件夹到 master上,导入镜像到私有仓库

[root@ecs-proxy v1.17.6]# rsync -av ingress 192.168.1.21:/root
[root@master ~]# tree ingress/
ingress/
├── ingress-example.yaml
├── ingress-nginx.tar.gz    //ingress控制器镜像文件
├── ingress-service.yaml
└── mandatory.yaml       //ingress资源文件
0 directories, 4 files

② 导入镜像到私有仓库

[root@master ~]# cd ingress/
[root@master ingress]# docker load -i ingress-nginx.tar.gz
[root@master ingress]# docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 192.168.1.100:5000/nginx-ingress-controller:0.30.0
[root@master ingress]# docker push 192.168.1.100:5000/nginx-ingress-controller:0.30.0
[root@master ingress]# curl http://192.168.1.100:5000/v2/nginx-ingress-controller/tags/list
{"name":"nginx-ingress-controller","tags":["0.30.0"]}

③ 修改资源配置文件

[root@master ingress]# vim mandatory.yaml
221:  image: 192.168.1.100:5000/nginx-ingress-controller:0.30.0  //修改为私有镜像地址

④ 执行资源配置文件

# ingress指定创建命名空间ingress-nginx,并把所有的Pod放在该命名空间内

[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# kubectl get namespaces    //查看命名空间
NAME              STATUS   AGE
default           Active   4d14h
ingress-nginx     Active   106s
kube-node-lease   Active   4d14h
kube-public       Active   4d14h
kube-system       Active   4d14h
[root@master ingress]# kubectl -n ingress-nginx get pod   //查看POD资源
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-fc6766d7-rq4v5   1/1     Running   0          2m13s

⑤ 通过ingress控制器映射集群内web服务,发布服务

[root@master ingress]# vim ingress-example.yaml
---
apiVersion: extensions/v1beta1    //资源的版本
kind: Ingress            //定义资源的版本
metadata:name: my-web           //资源的名称annotations:kubernetes.io/ingress.class: "nginx"
spec:backend:serviceName: myapache    //Service服务名
servicePort: 80
root@master ingress]# kubectl apply -f ingress-example.yaml
ingress.extensions/my-app created
[root@master ingress]# kubectl get ingresses
NAME     HOSTS   ADDRESS        PORTS   AGE
my-app   *       192.168.1.33   80      89s

# 测试服务,及轮询效果

[root@master ingress]# curl http://192.168.1.33/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.3.0[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-lwpb8
1229[root@master ingress]# curl http://192.168.1.33/info.php
<pre>
Array
([REMOTE_ADDR] => 10.244.3.0[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.29.0[REQUEST_URI] => /info.php
)
php_host:       myapache-7d689bf8f-sn2xn
1229

扩展知识

  • Ingress本质是nginx / haproxy 实现的负载均衡
  • Ingress可以设置七层规则,例如根据域名选择服务

小结:

本篇章节为【第五阶段】CLOUD-DAY8 的学习笔记,这篇笔记可以初步了解到 DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器,除此之外您还可以参考以下内容:

  • 污点和容忍度 | Kubernetes

Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能网联汽车:人工智能与汽车行业的深度融合

内容概要 在这个快速发展的时代&#xff0c;智能网联汽车已经不再是科幻电影的专利&#xff0c;它正在悄然走进我们的日常生活。如今&#xff0c;人工智能&#xff08;AI&#xff09;技术与汽车行业的结合犹如一场科技盛宴&#xff0c;让我们看到了未来出行的新方向。通过自动…

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

NumPy安装

1.NumPy简介 NumPy(Numerical Python) 是 Python 语言的扩展程序库&#xff0c;支持大量维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliph…

全自动一键批量创建站群网站插件 | Z-BlogPHP 堆词起站工具

在当今竞争激烈的数字营销世界&#xff0c;如何快速提升网站曝光率和流量&#xff1f;答案就是智能站群系统。 本文将结合实际效果&#xff0c;介绍一款功能强大的站群系统&#xff0c;重点讲述其堆词功能、泛目录管理、一键批量创建、内容转码、自定义标签和GPT内容生成与发布…

【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例

说明&#xff1a;本专栏内容来自于个人学习笔记、以及相关项目的实践与总结。写作目的是为了让读者体会深度学习的独特魅力与无限潜力&#xff0c;以及在各行各业之中的应用与实践。因作者时间精力有限&#xff0c;难免有疏漏之处&#xff0c;期待与读者共同进步。 前言 在当今…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

Linux 进程终止 进程等待

目录 进程终止 退出码 错误码 代码异常终止(信号详解) exit _exit 进程等待 概念 等待的原因 wait 函数原型 参数 返回值 监控脚本 waitpid 概念 函数原型 参数 返回值 WIFEXITED(status) WEXITSTATUS(status) 问题 为什么不用全局变量获得子进程的退出信…

[MySQL]DQL语句(一)

查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言&#xff0c;只在MySQL适用。 数据库查询又分单表查询和多表查询&#xff0c;这里讲一下单表查询。 基础查询 # 查询指定列 SELECT * FROM …

Java 批量导出Word模板生成ZIP文件到浏览器默认下载位置

是不是你们要找的&#xff01;是不是你们要找的&#xff01;是不是你们要找的&#xff01; 先看效果&#xff1a; 1.word模板格式 2.模板位置 3.需要的依赖 <!--POI-TL实现数据导出到word模板--><dependency><groupId>cn.hutool</groupId><artifact…

Flarum:简洁而强大的开源论坛软件

Flarum简介 Flarum是一款开源论坛软件&#xff0c;以其简洁、快速和易用性而闻名。它继承了esoTalk和FluxBB的优良传统&#xff0c;旨在提供一个不复杂、不臃肿的论坛体验。Flarum的核心优势在于&#xff1a; 快速、简单&#xff1a; Flarum使用PHP构建&#xff0c;易于部署&…

CPU用户时间百分比

在计算机系统中&#xff0c;"CPU用户时间百分比&#xff08;CPU User Time&#xff09;"是一个性能监控指标&#xff0c;它描述了CPU在用户模式下执行的累积时间与总的CPU时间的比例。这个指标可以帮助我们了解系统在执行用户态程序时的负载情况。下面是一些关于CPU用…

ubuntu20.04安装ros与rosdep

目录 前置配置 配置apt清华源 配置ros软件源 添加ros安装源&#xff08;中科大软件源&#xff09; 设置秘钥 更新源 ros安装 安装ros 初始化 rosdep 更新 rosdep 设置环境变量 安装 rosinstall 安装验证 启动海龟仿真器 操控海龟仿真器 rosdep安装更新 安装 使用…

mobile频段要查找、设置并获取相关参数,该怎么破?

今天我们一起来学习查找和设置mobile频段&#xff0c;并获取相关参数。 一、mobile概述 1.1 简介 “4G mobile”指的是第四代移动通信技术&#xff0c;常用于描述通过4G网络进行的高速无线数据传输和通信。4G网络最显著的特征是其高速数据传输能力。理论上&#xff0c;4G可以…

「C/C++」C++11 之<thread>多线程编程

✨博客主页何曾参静谧的博客📌文章专栏「C/C++」C/C++程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明目…

[SAP ABAP] SMW0上传模板

通常来说&#xff0c;一个批量导入的程序必须使用指定的模板&#xff0c;我们需要将模板保存到SAP系统中&#xff0c;以便用户下载并更改。这里我们可以使用事务码SMW0解决上述的问题 1.选择二进制类型 2.输入存放的包 3.创建对象 选择需要进行上传的本地模板文件到SAP系统中 …

LSTM模型改进实现多步预测未来30天销售额

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

中科蓝汛GPIO操作说明

第一种写法&#xff1a; GPIO配置输入模式 //内部上拉 GPIOBDE | BIT(4); //数字IO使能: 0为模拟IO, 1 为数字IO GPIOBDIR | BIT(4); //控制IO的方向: 0为输出, 1为输入. GPIOBFEN & ~BIT(4);//0:当作通用GPIO使用 //1:当作其它功能性IO GPIOBPU | BIT(4); //10K上拉…

3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建

1. 研究背景 从二维图像中重建三维人脸是计算机视觉研究的一项关键任务。在虚拟现实、医疗美容、计算机生成图像等领域中&#xff0c;研究人员通常依赖三维可变形模型&#xff08;3DMM&#xff09;进行人脸重建&#xff0c;以定位面部特征和捕捉表情。然而&#xff0c;现有的方…

高并发编程

一台64G内存的服务器QPS可以达到9W&#xff0c;TPS&#xff08;事务&#xff09;可以达到5K&#xff0c;每个TPS大约包含18个QPS.只读的话QPS可以达到30~40万.阿里云有相关测试工具、测试方法、测试结果。 1、volatile 保证可见性&#xff0c;禁止指令重排&#xff0c;避免多线…

HTML 基础标签——表单标签<form>

文章目录 1. `<form>` 标签:定义表单容器2. `<input>` 标签:多用途输入控件3. `<textarea>` 标签:多行文本输入框4. `<select>` 标签:下拉选择框5. `<option>` 标签:下拉菜单选项6. `<button>` 标签:按钮元素7. `<label>` 标签…