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

Linux云计算 |【第五阶段】CLOUD-DAY8
主要内容: 掌握DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器 一…...

岛屿数量 广搜版BFS C#
和之前的卡码网深搜版是一道题 力扣第200题 99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。…...

hive切换表底层文件类型以及分隔符
1、改底层文件存储类型,但是一般只会在数据文件与期望类型一致的时候使用,比如load等方式时发现建表时没指定对这样的,因为这个语句不会更改具体的底层文件内容,只改元数据 ALTER TABLE 表名 SET FILEFORMAT 希望类型;2、更改数据…...

ChatGPT o1与GPT-4o、Claude 3.5 Sonnet和Gemini 1.5 Pro的比较
全新的ChatGPT o1模型(代号“Strawberry”)是OpenAI的最新进展,专注于以前的AI模型难以应对的领域:高层次推理、数学和复杂编程。OpenAI设计o1模型以花费更多时间思考问题,使其在需要逐层推理的任务中提高准确性。本文…...

asp.net文件防盗链
URLRewriter实现 可以参考下面的文章 代码 .net framework 新建asp.net framework的web项目,新建AntiTheftChainHandler using System.Web;namespace AntiTheftChainStu01.Handler {public class AntiTheftChainHandler : IHttpHandler{public bool IsReusable…...

【日志】力扣58.最后一个单词的长度//14.最长公共前缀//28. 找出字符串中第一个匹配项的下标
2024.11.6 【力扣刷题】 58. 最后一个单词的长度 - 力扣(LeetCode)https://leetcode.cn/problems/length-of-last-word/?envTypestudy-plan-v2&envIdtop-interview-150 int lengthOfLastWord(char* s) {int count 0;for (int i strlen(s) - 1; i…...

华为杯”第十五届中国研究生数学建模竞赛-B题:光传送网建模与价值评估(续)
目录 4. 问题二 光传送网规划 4.1 基本假设 4.2 模型建立 4.3 子问题一 4.2 子问题二 4.5 子问题三 5. 问题三 改善星座图 5.1 问题简述 5.2 问题分析 5.3 建模与问题求解 5.3.1 方案一 5.3.2 方案二 6. 模型评价 6.1 模型的优点 6.2 模型的缺点 参考文献 本文篇幅较长,分为上…...

android 使用xml设置背景图片和圆角
使用xml设置背景图片和圆角 <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item><shape><solid android:color"android:color/transparen…...

数据结构,问题 E: 表达式括号匹配
题目描述 假设一个表达式有英文字母(小写)和数字、运算符(,—,*,/)和左右小(圆)括号构成,以“”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号…...

国家宠物美容师职业技能等级评价(高级)理论考试题
国家宠物美容师职业技能等级评价 理论考试复习参考范围 高级/三级 宠物美容师(高级)理论考试题 一 判断题 犬只的世界只有黑白灰三种,通过颜色呈现的深浅度进行辨识(A ) A 对 B 错 美国养犬俱乐部简称AKC…...

Spring挖掘:(AOP篇)
学习AOP时,我们首先来了解一下何为AOP 一. 概念 AOP(面向切面编程,Aspect Oriented Programming)是一种编程技术,旨在通过预编译方式或运行期动态代理实现程序功能的统一管理和增强。AOP的主要目标是在不改变原有业务逻辑代码的…...

十四届蓝桥杯STEMA考试Python真题试卷第二套第四题
来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第四题:糖果罐调整 该题解通过贪心策略在每一步都选择对当前状态最有利的操作,从而达到最少调整次数的目标。 题目描述 现有 N 罐糖果,且已知每罐糖果的初始数量。现给出两个数值 L 和 R(L≤R),需要把每罐糖果的数…...

单元测试怎么做
单元测试是软件开发中非常重要的一部分,能够确保代码的正确性、可靠性和可维护性。对于 Vue 项目来说,单元测试主要关注的是测试组件及其相关功能是否正常。下面是如何在 Vue 项目中进行单元测试的详细步骤,包括测试框架的选择、测试工具的配…...

移动应用开发 实验二:标准身高计算器
文章目录 准备工作一,创建Android Studio项目二,创建活动模块三,设计用户界面(一)设置页面布局(二)添加标题文本控件(三)设计体重输入框(四)设计性…...

金华迪加现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
0x01 产品描述: 金华迪加现场大屏互动系统是由金华迪加网络科技有限公司开发的一款专注于增强活动现场互动性的系统。该系统设计用于提供高质量的现场互动体验,支持各种大型活动,如企业年会、产品发布会、展览展示等。其主要功能包…...

使用 pd.ExcelWriter 创建多工作表 Excel 文件的详细教程
with pd.ExcelWriter(...) as writer 可以将多个内容写入一个 Excel 文件中。具体地说,它创建了一个Excel 文件写入器,使得我们可以在一个文件中创建多个工作表(Sheet)。 with pd.ExcelWriter("模型指标和损失值.xlsx")…...

驱动-----dht11温湿度传感器
单总线:只用一根线。 复位信号:设置为输出模式,低电平20ms,然后再拉高30us。然后设置为输入模式,dht11会先拉低80us,然后拉高80us表示对接成功 数据0:开始先拉低50us,然后拉高26~28u…...

Docker 基础命令简介
目录 Docker 基础命令 1. Docker 版本信息 2. 获取 Docker 帮助 3. 列出所有运行中的容器 4. 运行一个新的容器 5. 查看容器日志 6. 停止容器 7. 启动已停止的容器 8. 删除容器 9. 列出所有镜像 10. 拉取镜像 11. 构建镜像 12. 删除镜像 13. 执行命令 14. 查看容…...

嵌入式开发之静态库和共享库
静态库 静态库的特点: 默认执行库链接的时候,检索的是Linux的/lib、/usr/lib目录下,如果指定gcc -c .... -L 指定路径 -l指定库文件;c语言分为预编译、编译、汇编、链接四个步骤。链接的时候是把依赖库文件函数的代码拷贝到程序里面,即便是删除库文件。拷贝后的程序依旧…...

关于npm源的切换及相关操作
要查看当前配置的 npm 源(registry),可以使用以下命令: 查看 npm 源 npm config get registry这个命令会返回目前被设置的 npm registry URL,通常情况下是 https://registry.npmjs.org/。 列出所有 npm 配置项 如果…...

vue前端sku实现
this.value.skuStockList [];let skuList this.value.skuStockList;//只有一个属性时if (this.selectProductAttr.length 1) {let attr this.selectProductAttr[0];for (let i 0; i < attr.values.length; i) {skuList.push({spData: JSON.stringify([{key:attr.name,v…...

使用Vue3和Vue2进行开发的区别
使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了,但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候,回答的还是有些琐碎,干脆今天专门整理一下,做个记录。 一、再也不用set了 众所…...

爬虫入门urllib 和 request(二)
文章目录 1、urllib介绍2、urllib的基本方法介绍2.1 urllib.Request2.2 response.read() 3、urllib请求百度首页的完整例子4、小结 1、urllib介绍 除了requests模块可以发送请求之外, urllib模块也可以实现请求的发送,只是操作方法略有不同! urllib在python中分为urllib和url…...

【大数据学习 | HBASE】hbase的整体架构
hbase的region存储原理图 首先我们看到hbase的组成分为两个大的部分,分别是hmaster和hregionserver,主节点用于协调数据,regionserver用于真正的去管理表,其中regionserver存在多个,他们共同协调管理全有的表ÿ…...

群控系统服务端开发模式-应用开发-个人资料
群控系统服务端开发模式后端基础框架现在就差个人资料、及权限验证。下面开发个人资料。 一、获取个人信息 1、添加路由 在根目录下route文件夹下面app.php文件中添加如下代码: Route::post(member/personal_data,permission.Member/personalData);// 获取个人信息…...

openssl生成加密,公钥实现非对称加密
私钥用于加密,公钥用于解密 私钥用于颁发token,公钥用于验证token,公钥不能颁发token 私钥和公钥是一对,不能单独使用,利用私钥生成公钥,利用公钥进行解密 使用openssl来生成一对私钥和公钥:ope…...

[CKS] K8S Admission Set Up
最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于Admission。 Whats Admission Kubernetes Admission是Kubernetes集群中一种机制,用于控制和修改集群中的资源对象。它允许您在Kubernetes资源被创建、更新或删除之前,对资源…...

前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)
一、固定定位 固定定位 (position:fixed)其实是绝对定位的子类别,一个设置了 position:fixed 的元素是相对于视窗固定的,就算页面文档发生了滚动,它也会一直待在相同的地方。 ⚠️:固定定位会脱离文档流。…...

Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
现象 Tomcat 启动后,控制台输出卡在了: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JA…...

计算机网络:网络层 —— 移动 IP 技术
文章目录 IPv6IPv6 的诞生背景主要优势IPv6引进的主要变化 IPv6数据报的基本首部IPv6数据报首部与IPv4数据报首部的对比 IPv6数据报的拓展首部IPv6地址IPv6地址空间大小IPv6地址的表示方法 IPv6地址的分类从IPv4向IPv6过渡使用双协议栈使用隧道技术 网际控制报文协议 ICMPv6ICM…...