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

news2024/11/7 12:38:38

主要内容:

掌握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        //标准输入,默认false
        tty: false          //终端,默认false
        ports:              //服务端口定义
        - 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: pi
        image: 192.168.1.100:5000/myos:v1804
        command: ["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 * * * *"   //每分钟创建一个Job
  jobTemplate:              //Job资源模板定义
    spec:                  //Job资源的详细定义
      template:            //POD资源模板定义
        spec:              //容器的详细定义
          containers:
          - name: pi
            image: 192.168.1.100:5000/myos:v1804
            command: ["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: httpd
  replicas: 2        //副本数为2
  template:
    metadata:
      labels:
        myapp: httpd
    spec:
      containers:
      - name: webcluster
        image: 192.168.1.100:5000/myos:httpd
        stdin: false
        tty: false
        ports:
        - protocol: TCP
          containerPort: 80
      restartPolicy: Always
      
---
kind: Service      //定义Service资源类型
apiVersion: v1
metadata:
  name: myapache
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    myapp: httpd
  type: 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: TCP
    port: 80
    targetPort: 80
  selector:           //选择为哪个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: TCP
    port: 80
    targetPort: 80
  selector:            //选择为哪个deployment提供服务(后端)
    myapp: httpd       //标签必须与deployment资源文件中一致(mypod)
  type: ClusterIP      //类型为ClusterIP
  clusterIP: 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.coloradmin.cn/o/2235011.html

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

相关文章

基于Zynq FPGA对雷龙SD NAND的测试

一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号&#xff0c;在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能&#xff0c;并且在意外掉电的情况下同样能保证数据的安全。 …

探索空间计算与 VR 设备的未来:4K4DGen 高分辨率全景 4D 内容生成系统

在当今科技飞速发展的时代,空间计算和 VR 设备正逐渐成为人们体验沉浸式场景的重要工具。而今天,我们要为大家介绍一款具有创新性的技术 ——4K4DGen 高分辨率全景 4D 内容生成系统,它为 VR/AR 沉浸式体验带来了全新的可能性。 一、项目概述 4K4DGen 项目的核心目标是实现 …

使用官网tar包制作OpenSSL及OpenSSH rpm包进行升级安装(OpenSSH_9.9p1, without OpenSSL未解决)

一、制作openssl-1.1.1w.rpm包 1、安装基础依赖包和rpmbuild及其依赖包 yum install curl which make gcc perl perl-WWW-Curl rpm-build rpm-build rpmdevtools tree -y yum install gcc-c glibc glibc-devel openssl openssl-devel \pcre-devel zlib zlib-devel perl…

Node.js回调函数以及事件循环使用介绍(基础介绍 三)

回调函数 Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在完成任务后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 所有 API 都支持回调函数。 例如&#xff0c;我们可以…

Linux(CentOS)安装 MySQL

CentOS版本&#xff1a;CentOS 7 MySQL版本&#xff1a;MySQL Community Server 8.4.3 LTS 1、下载 MySQL 打开MySQL官网&#xff1a;https://www.mysql.com/ 直接下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 其他版本 2、上传 MySQL 文件到 CentOS 使用F…

服务器被攻击排查记录

起因 我的深度学习的所有进程突然被killed&#xff0c;我以为是检修&#xff0c;后面发现好像简单的python代码可以正常运行。但是我的训练进程一启动就会被killed 第一时间没有用htop查看cpu&#xff0c;用top看着挺正常的&#xff0c;但是后面看htop&#xff0c;全是绿的&a…

TDengine 签约蘑菇物联,改造通用设备工业互联网平台

在当前工业互联网迅猛发展的背景下&#xff0c;企业面临着日益增长的数据处理需求和智能化转型的挑战。通用工业设备的高能耗问题愈发突出&#xff0c;尤其是由这些设备组成的公辅能源车间&#xff0c;亟需更高效的解决方案来提升设备运行效率&#xff0c;降低能源消耗。为此&a…

【大数据学习 | kafka高级部分】文件清除原理

2. 两种文件清除策略 kafka数据并不是为了做大量存储使用的&#xff0c;主要的功能是在流式计算中进行数据的流转&#xff0c;所以kafka中的数据并不做长期存储&#xff0c;默认存储时间为7天 那么问题来了&#xff0c;kafka中的数据是如何进行删除的呢&#xff1f; 在Kafka…

TOEIC 词汇专题:市场销售篇

TOEIC 词汇专题&#xff1a;市场销售篇 市场销售是企业推广产品和树立品牌形象的重要环节。今天为大家介绍在市场销售领域中常用的托业词汇&#xff0c;助力更好地理解相关英语场景。 1. 市场推广与活动 市场销售离不开推广活动&#xff0c;以下是一些核心词汇&#xff1a; A…

基于 Vue3、Vite 和 TypeScript 实现开发环境下解决跨域问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…

OpenCV-Python-安装环境与测试样例

本文使用Pycharm安装openCV 1.打开pycharm终端 (GUI是我自己创建的项目名称) 错误&#xff1a;终端如果打开闪退的话 应对如下&#xff1a; 汉化版&#xff1a;文件->设置->工具->终端->红框位置设置cmd 英文版&#xff1a;file->settings->Tools->t…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

一、何为Wasm &#xff1f; Wasm&#xff0c;全称 WebAssembly&#xff0c;官网描述是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm被设计为一个可移植的目标&#xff0c;用于编译C/C/Rust等高级语言&#xff0c;支持在Web上部署客户端和服务器应用程序。 Wasm 的开发者参…

【JAVA毕业设计】基于Vue和SpringBoot的墙绘产品展示交易平台

本文项目编号 T 049 &#xff0c;文末自助获取源码 \color{red}{T049&#xff0c;文末自助获取源码} T049&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

在全域数据整合过程中,如何确保数据的一致性和准确性

在全域数据整合过程中&#xff0c;确保数据的一致性和准确性是至关重要的&#xff0c;这不仅关系到数据分析结果的可靠性&#xff0c;还直接影响到企业决策的科学性和有效性。Aloudata AIR 逻辑数据编织平台通过数据虚拟化技术&#xff0c;为这一过程提供了强有力的支持。以下是…

w024基于SpringBoot的企业客户管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

element-plus快速实现table组件表头吸顶和滚动条吸底

使用devecoui 组件快速实现 element-plus table 组件&#xff0c;表头吸顶和滚动条吸底&#xff0c;且完美实现固定表头的吸顶效果&#xff0c;同时devecoui组件还可以实现&#xff0c;查询列表的快速开发&#xff0c;里面集成了更多的功能。详细功能请前往&#xff1a;添加链接…

C++STL容器详解——list

目录 一.list 1.list的介绍 2.为什么会有list? 二.list的常见接口 1.list的构造函数 2.list的遍历 3.迭代器类型 4.list的头插头删和尾插尾删 5.list任意位置的插入和删除 6.list的sort()及reverse() 7.迭代器失效 三.整体代码 一.list 1.list的介绍 list的文档说…

服务器数据恢复—EVA存储故障导致上层应用不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EVA某型号控制器EVA扩展柜FC磁盘。 服务器存储故障&检测&#xff1a; 磁盘故障导致该EVA存储中LUN不可用&#xff0c;导致上层应用无法正常使用。 服务器存储数据恢复过程&#xff1a; 1、将所有磁盘做好标记后从扩展柜中取出。硬…

hf_transformers

强者自定义&#xff0c;弱者用默认&#xff0c;傻逼不看说明书 1. 2.在 model.generate()里填参数&#xff0c;默认为20个新token generated_ids model.generate(**model_inputs, max_new_tokens50) 3. 默认情况下&#xff0c;除非在GenerationConfig文件中指定&#xff0…