一.Daemonset 控制器(不支持滚动更新)

该文中的所有容器需自己创建

1.DaemonSet的概述

DaemonSet 每个机器斗要启动运行的Pod,确保全部或一些Node上运行Pod副本

-当有Node加入集群时,也会为他新增Pod副本,当Node从集群移除,这些Pod也会回收

-删除DaemonSet时将删除所有他创建的Pod副本

-典型应用:ceph节点,监控节点,filebeat日志收集等

-系统服务 kube-proxy和flannel就是这种类型

2.DaemonSet控制器的资源文件书写格式

daemonset与deployment非常相似,区别是不需要设置replicas,因为daemonset是每节点启动的

deployment启动

user-->> deployment--->>(优选与打分机制)--->>选择pod(此时即是优点也是缺点,如果一定要在每一台上运行就不行,比如监控)

# 示例
~]# vim mynginx.yaml
---                # 文件起始
kind: DaemonSet    # 文件类型,所有对象查看(kubectl api-resources)
apiVersion: apps/v1  # 资源的版本,( kubectl explain Daemonset)
metadata:          # Daemonset的元数据
name: mynginx    # Daemonset的名字
spec:              # Daemonset的详细信息
selector:        # Daemonset的标签matchLabels:   # Daemonset的标签组myapp: nginx # Daemonset的标签是nginx
template:        # peo的定义metadata:      # 定义标签labels:myapp: nginxspec:          # 详细信息containers:  # 容器的详细信息- name: nginxcluster  # 容器名image: 172.17.0.98:5000/myos:nginx2  # 镜像command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"]  # 设置启动stdin: false  # 不用交互式tty: false   # 不用终端ports:       # 开放的端口- protocol: TCPcontainerPort: 80restartPolicy: Always
# 发现daemonset没有replicas副本设置,这是因为daemonset不允许设置副本数,而且deployment下有一个rc二级控制,而daemonset直接连pod,且不知持滚动更新
​
~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
~]# kubectl get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
mynginx-4qwl8   1/1     Running   0          3s    10.244.2.34   vm-0-142-centos   <none>           <none>
mynginx-tzs48   1/1     Running   0          3s    10.244.1.26   vm-0-114-centos   <none>           <none>

3.污点策略

注:daemonset 会调度到除master以外所有的节点;master节点除了一些系统服务以外不会在有其他POD

为什么其他POD不会在master上部署

  • 污点策略:

-NoSchedule 不会被调度

-PreferNoSchedule 尽量不调度

-NoExecute 驱逐节点

  • 查看污点标签

# 格式
~]# kubectl describe node [节点]
# 查看所有节点污点标签
~]# kubectl describe nodes | grep -P "^Taints"
​
​
# 查看master的污点策略
~]# kubectl describe node master | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule
# 查看node节点的污点策略
~]# kubectl describe node node1 | grep Taints
Taints:             <none>
~]# kubectl describe node node2 | grep Taints
Taints:             <none>
  • 设置污点标签

# 格式
~]# kubectl taint node [节点] key=value:NoSchedule
​
# 给node2设置不会被调度NoSchedule
~]# kubectl taint node  node2 key=value:NoSchedule
node/node2 tainted
# 查看
~]# kubectl describe node node2 | grep Taints
Taints:             key=value:NoSchedule
  • 删除污点标签

# 格式
~]# kubectl taint node [节点] key-
​
# 删除node2的污点策略
~]# kubectl taint node node2 key-
node/node2 untainted
~#   kubectl describe node node2 | grep Taints
Taints:             <none>##  利用上面的容器测试污点策略,Daemonset是在所有节点上运行容器,所以只要在一台机器上设置策略那么也就不会调度到设置污点的那个节点上去
# 此时没有设置任何策略
~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
~]# kubectl get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
mynginx-nv482   1/1     Running   0          2s    10.244.2.35   vm-0-142-centos   <none>           <none>
mynginx-pjvvl   1/1     Running   0          2s    10.244.1.27   vm-0-114-centos   <none>           <none>
​
# 设置污点策略
~]# kubectl taint node  vm-0-142-centos key=value:NoSchedule
node/vm-0-142-centos tainted
​
# 重新安装
~]# kubectl delete -f mynginx.yaml
daemonset.apps "mynginx" deleted
~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
# 此时发现容器不会调度到设置污点策略的节点上了
~]# kubectl get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
mynginx-vtwld   1/1     Running   0          3s    10.244.1.28   vm-0-114-centos   <none>           <none>
​

4.容忍策略

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

污点策略官方文档

污点和容忍度 | Kubernetes

##  示例
# 可以看出现在只有一台机器运行了容器
~]# kubectl get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
mynginx-bpm2z   1/1     Running   0          10s   10.244.1.29   vm-0-114-centos   <none>           <none>
​
# 因为其他两台设置了污点策略,所以只有一台运行
~]#  kubectl describe nodes | grep -P "^Taints"
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             <none>
Taints:             key=value:NoSchedule
​
# 修改文件
~]# cat mynginx.yaml
---
kind: DaemonSet
apiVersion: apps/v1
metadata:name: mynginx
spec:selector:matchLabels:myapp: nginxtemplate:metadata:labels:myapp: nginxspec: tolerations:                          # 声明污点策略- key: "node-role.kubernetes.io/master"  # 声明的键(因为污点策略都是以键值的形式存在的,这里是建)operator: "Equal"           # 完全匹配,污点只要存在即可value: ""                   # 值valueeffect: "NoSchedule"        # 容忍策略containers:- name: nginxclusterimage: 172.17.0.98:5000/myos:nginx2command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"]stdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always
​
# 更新
~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx configured
# 查看
~]# kubectl get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
mynginx-6t6nx   1/1     Running   0          13s   10.244.0.6    master            <none>           <none>
mynginx-bpm2z   1/1     Running   0          10s   10.244.1.29   vm-0-114-centos   <none>           <none>

5.污点与容忍示例

# 准备好环境,删除所有pod并删除所有node的污点策略
~]# kubectl delete -f mynginx.yaml
daemonset.apps "mynginx" deleted
~]# kubectl describe nodes |grep -P "^Taints"
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             <none>
Taints:             <none>
​
# 创建pods,并设置成三台
~]# cat myapache.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: myapache
annotations:kubernetes.io/change-cause: httpd.v1
spec:
selector:matchLabels:myapp: httpd
replicas: 3
template:metadata:labels:myapp: httpdspec:containers:- name: webclusterimage: 172.17.0.98:5000/myos:httpdstdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always
~]# kubectl apply -f myapache.yaml
deployment.apps/myapache created
​
~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
myapache-9d7557448-6c7c6   1/1     Running   0          9s
~]# kubectl scale deployment myapache --replicas=3
deployment.apps/myapache scaled
~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-8p5qs   1/1     Running   0          5s    10.244.2.39   vm-0-142-centos   <none>           <none>
myapache-9d7557448-q4rm9   1/1     Running   0          5s    10.244.1.30   vm-0-114-centos   <none>           <none>
myapache-9d7557448-qc5g7   1/1     Running   0          5s    10.244.1.31   vm-0-114-centos   <none>           <none>
​
# 然后再创建三台nginx
]# cat mynginx.yaml
---
kind: DaemonSet
apiVersion: apps/v1
metadata:name: mynginx
spec:selector:matchLabels:myapp: nginxtemplate:metadata:labels:myapp: nginxspec:tolerations:- key: "node-role.kubernetes.io/master"operator: "Equal"value: ""effect: "NoSchedule"containers:- name: nginxclusterimage: 172.17.0.98:5000/myos:nginx2command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"]stdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always
~]# kubectl apply -f mynginx.yaml
daemonset.apps/mynginx created
​
# 可以看到nginx再每一台上运行了容忍策略
~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-8p5qs   1/1     Running   0          3m35s   10.244.2.39   vm-0-142-centos   <none>           <none>
myapache-9d7557448-q4rm9   1/1     Running   0          3m35s   10.244.1.30   vm-0-114-centos   <none>           <none>
myapache-9d7557448-qc5g7   1/1     Running   0          3m35s   10.244.1.31   vm-0-114-centos   <none>           <none>
mynginx-45dsc              1/1     Running   0          3s      10.244.2.40   vm-0-142-centos   <none>           <none>
mynginx-d662z              1/1     Running   0          3s      10.244.0.7    master            <none>           <none>
mynginx-mgcts              1/1     Running   0          3s      10.244.1.32   vm-0-114-centos   <none>           <none>
​
## 测试模仿机器损坏,但是还能用
# 在任意节点打上驱逐策略,我这里就在node1上驱逐容器
~]# kubectl taint node  vm-0-114-centos k1=v1:NoExecute
node/vm-0-114-centos tainted
~]# kubectl describe nodes |grep -P "^Taints"
Taints:             node-role.kubernetes.io/master:NoSchedule
Taints:             k1=v1:NoExecute
Taints:             <none>
​
# 因为apache使用deployment做控制器的,且运行了三台,如上所示在node1运行了二台的;nginx则是用的daemonset控制器也就是在所有pod上运一台,此时可以看出,运行在node1上的机器已经没有应用了。现在就可以下线维修了
~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-8p5qs   1/1     Running   0          10m   10.244.2.39   vm-0-142-centos   <none>           <none>
myapache-9d7557448-md7q7   1/1     Running   0          39s   10.244.2.41   vm-0-142-centos   <none>           <none>
myapache-9d7557448-zbwpk   1/1     Running   0          39s   10.244.2.42   vm-0-142-centos   <none>           <none>
mynginx-45dsc              1/1     Running   0          7m    10.244.2.40   vm-0-142-centos   <none>           <none>
mynginx-d662z              1/1     Running   0          7m    10.244.0.7    master            <none>           <none>
​
​
# 维修好node机器之后,把污点删除,运用daemonset的控制器的nginx就会恢复
]# kubectl taint node  vm-0-114-centos k1-
node/vm-0-114-centos untainted
[root@master config]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE   READINESS GATES
.....
mynginx-45dsc              1/1     Running   0          16m   10.244.2.40   vm-0-142-centos   <none>           <none>
mynginx-d662z              1/1     Running   0          16m   10.244.0.7    master            <none>           <none>
mynginx-kjb4z              1/1     Running   0          7s    10.244.1.33   vm-0-114-centos   <none>           <none>

二.其他资源控制器(对象)

1.Job控制器

1)job的概述(单任务)

Job也称为单任务控制器, 负责执行一次任务,保证任务在一个或多个Pod.上执行成功

如果你运行一一个Pod,当第一个Pod失败或者被删除(比如因为节点硬件失效或者重启)时,Job对象会启动一个新的Pod, 直到这个任务完成。

删除Job的操作会清除所创建的全部Pods。

2.CronJob资源对象

1)cronjob概述

CronJob重复多次任务控制器

Cr onJob像是Job的升级版,他是基于时间管理的Job

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

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

在job中会保留最后三次的状态,其他会被清除

# Cronjob示例
~]# vim mycronjob.yaml
---               # 起始---
apiVersion: batch/v1beta1   # cronjob的版本( kubectl api-resources  | grep cron)
kind: CronJob          # 资源的类型
metadata:              # cronjob的元数据
name: cronjob-pi     # cronjob的名字
spec:                  # cronjob的详细信息
schedule: "*/1 * * * *"   # 定义时间周期
jobTemplate:         # 这里定义的是job的详细信息    spec:              # job.spectemplate:        # 这里定义的是pod的详细信息spec:          # pod.speccontainers:  # 这里是容器的定义- name: piimage: 192.168.1.100:5000/myos:v1804command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: OnFailure
# 创建cronjob
~]# kubectl apply -f mycronjob.yaml
cronjob.batch/cronjob-pi created
​
# 查看资源控制器
~]# kubectl get cronjobs.batch
NAME         SCHEDULE           SUSPEND   ACTIVE        LAST SCHEDULE   AGE
cronjob-pi   */1 * * * *        False     1             <none>          28s
# 容器启动完成之后进入completed
~]# kubectl get pod
NAME                            READY     STATUS      RESTARTS          AGE
cronjob-pi-1595410620-vvztx     0/1       Completed   0    62s
cronjob-pi-1595410620-vvztx     0/1       Completed   0    2s
# 查看job是否都启动了
~]# kubectl get jobs.batch
NAME   COMPLETIONS   DURATION   AGE
cronjob-pi-1595410620   1/1           2s         98s
cronjob-pi-1595410620   1/1           5s         38s
​
# 默认只能创建三个job,创建第四个时就会把第一个删除

3.其他资源对象

其他资源对象

●Stateful Set有状态服务相关POD

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

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

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

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

●Hor izontal Pod Autoscaling 控制器(HPA)

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

注:这里主要的知识是pv,pvc,以及对cpu等资源的规划,慢慢来,这里只需要知道有这几个资源控制器就行

三.访问服务

1.服务图例与类型

1)服务使用场景

访问会变化的pod给我们访问带来了非常多的不便

service就是解决这一个问题的方法

service会创建一个cluster ip, 这个地址对应资源地址,不管pod如何变化,service总能找到对应的pod, 且cluster ip保持不变,如果有pod对应多个容器,service会自动在多个容器间实现负载均衡

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

# 此时会发现pod的IP非常的不好用,当重启时podSubnet(也就是在注册flanel时定义的pod ip)的IP地址就会改变,访问服务时就会不方便,所以k8s建议创建服务时用service,(在访问时直接访问网段,k8s会直接追踪到服务地址,且当有多个服务时会提供负载均衡,服务的ip也永远不会变)
​
## 示例
# 创建一个apache的服务
~]# kubectl apply -f myapache.yaml
deployment.apps/myapache created
~]# 然后设置成两个副本
~]# kubectl scale deployment myapache --replicas=2
deployment.apps/myapache scaled
# 此时查看会在node2和node3上运行容器
~]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE
myapache-7d689bf8f-c268l   1/1     Running   0          13s   10.244.2.16   node-0002
myapache-7d689bf8f-4z225   1/1     Running   0          5s    10.244.1.15   node-0003
# 当删掉一个在node3上的容器时,会在另一个node上启动一个容器(因为这里用的是deployment控制器)
~]# kubectl delete pod myapache-7d689bf8f-4z225
pod "myapache-7d689bf8f-4z225" deleted
~]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE
myapache-7d689bf8f-c268l   1/1     Running   0          38s   10.244.2.16   node-0002
myapache-7d689bf8f-mccqv   1/1    Running   0          13s   10.244.3.12   node-0001
# 如果用node3的ip去访问时,则会失败

2)服务资源文件的格式与示例

注:多个资源可以写在同一个Yaml文件,使其---分割

## 服务资源示例
#创建 ClusterIP 服务
~]# vim clusterip.yaml
---             # 资源文件的开始---
kind: Service   # 服务类型
apiVersion: v1  # 版本(kubectl api-resources  | grep Services)
metadata:       # 元数据(service的元数据)name: myapache # service的名字
spec:           # service的详细信息ports:      # 定义端口类型- protocol: TCP  # 端口协议port: 80    # 开放的前端端口,也就是访问端口targetPort: 80  # 目标主机端口,也就是容器内的端口selector:     # 后端绑定(通过标签来绑定)myapp: httpd  # 标签必须与 deploy 资源文件中一致type: ClusterIP  # 服务的类型
~]# kubectl apply -f clusterip.yaml
service/myapache created
~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.254.0.1      <none>        443/TCP   6d2h
myapache     ClusterIP   10.254.40.243   <none>        80/TCP    44m
# 测试访问service的ip
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-9g7rr
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-z27kx
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-2xgbk
~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
myapache-9d7557448-2xgbk   1/1     Running   0          3h30m
myapache-9d7557448-9g7rr   1/1     Running   0          3h30m
myapache-9d7557448-z27kx   1/1     Running   0          3h30m
# 可以看出还有负载均衡功能
## 测试删除容器是否会自动跟踪
# 删除node1上的一个容器,控制器自动在node2创建一个容器
]# kubectl delete pods myapache-9d7557448-2xgbk
pod "myapache-9d7557448-2xgbk" deleted
~]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-9g7rr   1/1     Running   0          3h32m   10.244.1.160   vm-0-114-centos   <none>           <none>
myapache-9d7557448-w6mdf   1/1     Running   0          4s      10.244.2.44    vm-0-142-centos   <none>           <none>
myapache-9d7557448-z27kx   1/1     Running   0          3h32m   10.244.2.43    vm-0-142-centos   <none>           <none>
# 测试访问
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-9g7rr
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-w6mdf
~]# curl http://10.254.40.243/info.html
myapache-9d7557448-z27kx
# 可以看到service(服务)会自动找到容器
​
## 如果本地访问网址慢的话,可以用本地的校验,把flannel的值设置成yes即可
~]# ethtool -k flannel.1| grep checksum
......tx-checksum-ip-generic: on
......
# 设置
~]# ethtool -K flannel.1 tx-checksum-ip-generic off
Actual changes:
tx-checksumming: offtx-checksum-ip-generic: off
tcp-segmentation-offload: offtx-tcp-segmentation: off [requested on]tx-tcp-ecn-segmentation: off [requested on]tx-tcp6-segmentation: off [requested on]tx-tcp-mangleid-segmentation: off [requested on]
udp-fragmentation-offload: off [requested on]
# 查看
~]# ethtool -k flannel.1| grep checksum
....tx-checksum-ip-generic: off
....

注:service是根据容器的label(标签)来绑定的,主要功能是负载均衡和和自动跟踪容器。

3)服务端口

service服务的端口

  • port

    service暴露在cluster ip上的端口,是提供给集群内部客户访问service的入口,供集群内部服务访问使用

  • targetPort

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

创建/查询服务

创建服务: kubectI apply -f 资源文件

查询服务可以使用: kubectI get service

服务自动发现

cluster- ip是集群随机分配的服务ip,供集群访问,在集群内部也可以通过服务的名称访问,服务的名称是通过coredns(dns)解析的,每个服务在创建的过程中都会完成自动注册

默认域名: <服务名称>. <名称空间>. svc. cluster. local

## 访问域名示例
# 先查看service的名字
~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
myapache     ClusterIP   10.254.40.243   <none>        80/TCP    3h54m
# 查看命名空间
~]# kubectl get pods -A | grep myapache
default       myapache-9d7557448-9g7rr         1/1     Running   0               3h57m
default       myapache-9d7557448-w6mdf         1/1     Running   0               24m
default       myapache-9d7557448-z27kx         1/1     Running   0               3h57m
# 进入容器访问
~]# kubectl exec -it myapache-9d7557448-w6mdf -- /bin/bash
~]# ping myapache.default.svc.cluster.local -c 5
PING myapache.default.svc.cluster.local (10.254.40.243) 56(84) bytes of data.
64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=3 ttl=64 time=0.051 ms
64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=4 ttl=64 time=0.052 ms
64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=5 ttl=64 time=0.058 ms
​
--- myapache.default.svc.cluster.local ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.025/0.046/0.058/0.014 ms
# 或者直接访问apache也可以,service创建时会自动写入文件到resolv.conf文件中
~]# cat /etc/resolv.conf
nameserver 10.254.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

注:集群内可以直接访问服务,集群外无法访问

2.服务原理概述

1)服务类型

Service允许指定一个Type类型的, 默认是ClusterIP

  • ClusterIP:通过集群的内部IP 暴露服务,服务只能够在集群内部可以访问(集群外就不能访问了),这也是默认的ServiceType

  • NodePort: 通过每个Node上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到ClusterIP 服务

  • LoadBalancer:使用云提供商的负载局衡器,外部的负载均衡器可以路由到NodePort 服务和ClusterIP 服务(必须买云服务得SaaS服务(及云服务商做好得服务))

2)代理模式种类

k8s中的代理都是kube- proxy来设置的

- Kubernetes v1.0服务支持userspace代理模式

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

- Kubernetes v1.8服务支持ipvs

- 在Kubernetesv1.2中,kube- proxy的iptables模式成为默认设置,现在默认使用ipvs,如果不能满足要求回退至iptables模式

第一代的访问方式:

用户访问ClusterIP,ClusterIP通过iptables的端口映射,映射给kube-proxy,由kube-proxy转发给对应的容器;此时发现kube-proxy的性能,稳定性等等都非常的不好;所以就把kube-proxy拿走了进入下一代

第二代的访问方式:

客户端通过访问,此时跳过ClusterIP直接访问iptables,iptables直接转发给对应的容器;从而实现客户对后端的访问,此时kube-proxy退居幕后专门设置iptables的规则;此时发现iptables不是专门做负载均衡的(调度算法少),所以就把kiptables拿走了进入下一代

第三代,也就是现在用的这一代

用户访问LVS,此时pod直接变成service了;此时kube-proxy退居幕后专门设置LVS的规则,因为LVS没有服务(内核级服务),所以k8s也没有服务,我们设置好规则之后kube-proxy负责翻译给LVS

## 查看LVS规则
# 查看服务控制器的名字,取最前面的(myapache)
]# kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-9g7rr   1/1     Running   0          4h27m   10.244.1.160   vm-0-114-centos   <none>           <none>
myapache-9d7557448-w6mdf   1/1     Running   0          54m     10.244.2.44    vm-0-142-centos   <none>           <none>
myapache-9d7557448-z27kx   1/1     Running   0          4h27m   10.244.2.43    vm-0-142-centos   <none>           <none>
# 查看service
~]# kubectl get svc | grep myapache
myapache     ClusterIP   10.254.40.243   <none>        80/TCP    4h29m
# 根据ip查看规则
]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn......
TCP  10.254.40.243:80 rr-> 10.244.1.160:80              Masq    1      0          0         -> 10.244.2.43:80               Masq    1      0          0         -> 10.244.2.44:80               Masq    1      0          0
.....
# 此时可以看出是利用轮询机制到每一台容器服务的后端

注:设置k8s服务的本质就是把LVS与容器建立关联,

kube-proxy的作用

# 查看kube-proxy,此时可以发现kube-proxy是daemonset控制器安装的(与硬件绑定,所以在所有节点都有设置,相当与有多少节点就有多少LVS服务)
~]# kubectl get pods -A -o wide | grep kube-proxy
kube-system   kube-proxy-flzrz                 1/1     Running   2 (3d13h ago)   6d6h    172.17.0.51    master            <none>           <none>
kube-system   kube-proxy-sv5n8                 1/1     Running   0               3d13h   172.17.0.142   vm-0-142-centos   <none>           <none>
kube-system   kube-proxy-tkctb                 1/1     Running   0               4d12h   172.17.0.114   vm-0-114-centos   <none>           <none>

3)ClusterIP服务概述

-创建简单的WEB集群多副本会自动分配到不同机器上会变化的资源

-当发现某一个pod不能使用的时候RS会在其他机器上在创建一个相同的pod,及其对应的容器

4)nodeport 服务

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

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

  • nodePort:基于端口对外提供服务(四层)(本质:LVS)

  • Ingress:使用ingress控制器(七层)(本质:nginx)

nodePort对外服务示例

# 创建文件
~]# vim mynodeport.yaml
---             # 资源开始起始---
kind: Service   # 资源类型
apiVersion: v1  # 类型版本
metadata:       # 该内型得元数据name: mynodeport   # 该内型得名字
spec:           # Service的详细信息ports:        # 端口设置- protocol: TCP  # 类型port: 80    # 开放端口  targetPort: 80  # 容器内端口selector:     # 标签(service是根据标签来控制容器的)myapp: httpd  # 标签名type: NodePort     # 指定服务类型(对外访问)
~]# kubectl apply -f mynodeport.yaml
~]# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
mynodeport   NodePort    10.254.49.174   <none>        80:30975/TCP   83s
# 此时nodeport实现了负载,容器的变化与跟踪(这里两点与ClusterIP类似)
]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
myapache-9d7557448-9g7rr   1/1     Running   0          5h16m
myapache-9d7557448-z27kx   1/1     Running   0          5h16m
​
#---------------------------所有node节点30975端口均可访问-----------------------------------
# 在跳板机上访问服务
~]# curl http://172.17.0.142:30975/info.html
myapache-9d7557448-z27kx
~]# curl http://172.17.0.114:30975/info.html
myapache-9d7557448-9g7rr
# 如果要设置公网访问那么就需要在云上购买一台LB(弹性负载)然后设置端口,端口绑定后端ip及端口,再给LB添加一个公网就可以访问公网了
# 添加之后访问
~]# curl http://172.17.0.50:30975/info.html
myapache-9d7557448-9g7rr
~]# curl http://172.17.0.50:30975/info.html
myapache-9d7557448-z27kx

5)Headless 服务

有时不需要或不想要负载均衡,以及单独的Service IP。遇到这种情况,我们可以创建Headless服 务

Headless 服务会把ip通过多个A记录的形式解析到具体的容器IP上面,多用于有状态的服务(相当于域名来解析,和clusterip不同的是,clusterip只会创建一个总的服务ip,而hadless会自动为容器创建不同的解析ip)

## headless示例
# 创建资源文件
~]# vim myheadless.yaml
---           # 文件的起始
kind: Service # 资源类型
apiVersion: v1 # 资源版本(kubectl api-resources | grep Service
)
metadata:      # 资源的元数据 name: myheadless # 资源的名字
spec:           # 资源的详细信息ports:        # 绑定端口- protocol: TCP  # 端口类型port: 80    # 前端端口targetPort: 80 # 后端端口selector:     # 定制标签管理容器myapp: httpd # 标签名type: ClusterIP # 类型ClusterIP支持负载clusterIP: None  # 设置Clusterip为None
e      # 新添加
# 创建headless
~]# kubectl apply -f myheadless.yaml
service/myheadless created
​
# 查看service,可以看到headless这里并没有clusterip,这里我们需要进入容器解析查看,因为headless是直接给容器服务的
~]# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
.....
myheadless   ClusterIP   None            <none>        80/TCP         7m41s
.....
​
#-----------------------------------进入pod查看解析结果------------------------------------
~]# kubectl exec -it myapache-9d7557448-9g7rr -- /bin/bash
/]# yum install -y bind-utils
/]# host myheadless.default.svc.cluster.local
myheadless.default.svc.cluster.local has address 10.244.1.160
myheadless.default.svc.cluster.local has address 10.244.2.43
~]# cat /etc/resolv.conf
....
search default.svc.cluster.local svc.cluster.local cluster.local
# 查看容器的IP与之一样
~]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP             NODE              NOMINATED NODE   READINESS GATES
myapache-9d7557448-9g7rr   1/1     Running   0          16h   10.244.1.160   vm-0-114-centos   <none>           <none>
myapache-9d7557448-z27kx   1/1     Running   0          16h   10.244.2.43    vm-0-142-centos   <none>           <none>

Headless应用示例图与概述

首先用户通过headless服务查询终节点的ip,headless把ip告诉用户,然后用户直接访问容器,headless适合较大的集群,这里就用来解析一下域名

总:ClusterIP———>> LVS(负载均衡)4层

nodePort———>> LVS+iptables(端口映射)4层

headless———>> DNS A(也就是DNS的A记录解析)

四.ingress插件

1.ingress介绍

ingress是公开了从集群外部到集群内services路由

可以将Ingress配置为提供服务外部可访问的URL、负载均衡流量

Ingress控制器通常由负载均衡器来实现

必须具有ingress控制器才能满足Ingress的要求,仅创建资源无效

ingress软件也就是nginx服务的负载均衡,如果此时nginx负载直接访问后台服务是会出现问题的,当容器因损坏的话,这个时候就会创建新的容器,此时nginx也就无法找到新的容器了;此时nginx为了跟踪后台容器借用了service服务,nginx借用service服务由service服务再把请求转发给后端容器(service自带容器跟踪功能)

ingress架构图

注:可以根据域名访问service

2.Ingrees 控制器安装地址文件

-导入镜像到私有仓库

-镜像: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0

-地址:ingress-nginx/deploy/static at nginx-0.30.0 · kubernetes/ingress-nginx (github.com)

-资源文件

https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml

3.安装控制器配置

## 安装示例
# 下载镜像
~]# docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
# 打上标签上传私有仓库
~]# docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 172.17.0.98:5000/nginx-ingress-controller:0.30.0
~]# docker push 192.168.1.100:5000/nginx-ingress-controller:0.30.0
# 查看私有仓库镜像
~]# curl http://172.17.0.98:5000/v2/nginx-ingress-controller/tags/list
{"name":"nginx-ingress-controller","tags":["0.30.0"]}
​
# 下载nginx-ingress资源配置文件
~]# wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml
# 修改资源文件
~]# vim ingress/mandatory.yaml
221:  image: 192.168.1.100:5000/nginx-ingress-controller:0.30.0  # 指向私有仓库
# 创建ingress
~]# kubectl apply -f ingress/mandatory.yaml
​
# 查看创建的ingress
~]# kubectl -n ingress-nginx get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-fc6766d7-ptppp   1/1     Running   0          47s

注意:k8s的1.22版本以后不支持这么安装了

4.发布服务

用ingress发布服务架构图

user---> ingress-->>service---myapache--->>contarner

# 如果在云上有购买LoadBalancer的Saas那么就可以用以下文件
~]# vim ingress-service.yaml
---
kind: Service
apiVersion: v1
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:externalTrafficPolicy: Localtype: LoadBalancerexternalIPs:- 172.17.0.50            # 指定LB的ip即可selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxports:- name: httpport: 80protocol: TCPtargetPort: http- name: httpsport: 443protocol: TCPtargetPort: https
# 创建
~]# kubectl apply -f ingress-service.yaml

如果没有云的Saas服务则可以运用一下

# 定制规制资源文件
~]# vim ingress-example.yaml
---                                 # 资源的起始---
apiVersion: extensions/v1beta1      # 资源的版本
kind: Ingress                       # 资源的类型
metadata:                           # 资源的元数据name: my-app                      # 资源的名字annotations:                      # 资源的标签kubernetes.io/ingress.class: "nginx"
spec:                              # 资源的详细信息backend:                         # 指定serviceserviceName: myapache          # service名,必须与服务的名子同样servicePort: 80                # service端口
​
# 创建资源
~]# kubectl apply -f ingress-example.yaml
# 查看(1分钟左右)
~]# kubectl get ingresses
NAME     HOSTS   ADDRESS        PORTS   AGE
my-app   *       10.254.0.24   80      3m2s
#----------------------- ----访问测试 -----------------------------
~]# curl http://10.254.0.24/info.html
myapache-9d7557448-9g7rr
~]# curl http://10.254.0.24/info.html
myapache-9d7557448-z27kx

基于域名的访问

~]# vim ingress-example.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: my-appannotations:kubernetes.io/ingress.class: "nginx"
spec:rules:- host: apache.tedu.localhttp: paths:- path: /backend:serviceName: web-apacheservicePort: 80- host: nginx.tedu.localhttp: paths:- path: /backend:serviceName: web-nginxservicePort: 80
# 创建资源
~]# kubectl apply -f ingress-example.yaml
# 查看(1分钟左右)
~]# kubectl get ingress
NAME             CLASS    HOSTS                                                                                ADDRESS   PORTS     AGE
web-apache     <none>   apache.tedu.local                                                                                80        82d
web-nginx  <none>   nginx.tedu.local                                                                 80   67d

注:Ingress 本质是nginx/haproxy 实现的负载均衡

ingress可以设置七层规则,例如根据域名选择服务

kubernetes资源控制与及ingress插件安装(容忍策略)相关推荐

  1. 【Ansible】Ansible控制windows插件安装及运行error与解决方法

    一. 问:因pip版本问题无法安装kerberos 答:安装提示需要先安装pip升级包 下载pip9.0.1升级包: ![1_2] 二.问:安装kerberos报错 答:需要先安装libkrb5开发包 ...

  2. Kubernetes v1.10.x HA 全手动安装教程(TL;DR)

    转自 https://www.kubernetes.org.cn/3814.html 本篇延续过往手动安装方式来部署 Kubernetes v1.10.x 版本的 High Availability ...

  3. kubernetes网络:service,插件,策略,dns优化

    文章目录 网络插件 Flannel UDP vxlan host-gw calico提前简介 网络策略 安装 Calico NetworkPolicy 测试 Service 三种IP和四种端口 定义 ...

  4. Kubernetes资源编排系列之四: CRD+Operator篇

    作者 炯思(钟炯恩) 雪尧(郭耀星) 这是我们的<Kubernetes资源编排系列>的第四篇--CRD+Operator篇.在前面的文章中,常常会提到CRD和k8s operator,但并 ...

  5. kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤

    kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤 Kubeflow使用场景 希望训练tensorflow模型且可以使用模型接口发布应用服务在k8s环境中(eg.local, ...

  6. 4、kubernetes资源清单快速入门190625

    一.资源清单概念 资源/对象的类型 工作负载型资源:Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, Cronjob, ... 服务发 ...

  7. Ranger-Sqoop2插件安装

    Ranger-Sqoop2插件安装,基于Ranger版本1.0.0,支持Sqoop2版本1.99.7. 1.获取安装包 scp root@10.43.159.11:/home/compile/rang ...

  8. 在kubernetes集群用helm离线安装harbor

    背景说明 在公司内部局域网环境kubernetes集群(未连接互联网)通过helm离线安装harbor 实施步骤 一.kubernetes集群安装helm(已安装的直接跳过此节) 1. 关于helm ...

  9. ingress controller安装总结

    本文主要介绍kubernetes官方推荐的ingress控制器ingress-Nginx controller在bare-metal环境中搭建的经验总结,因为我是在私有的服务器上搭建的kubernet ...

最新文章

  1. seaborn使用violinplot函数可视化小提琴图、并在violinplot函数中设置inner参数来添加横线(inner=“stick“)显示数据的稠密程度
  2. hdfs文档存储服务器,一文读懂HDFS分布式存储框架分析
  3. REVERSE-COMPETITION-NEPCTF
  4. 最长公共子上升序列(信息学奥赛一本通-T1306)
  5. 对称加密和非对称加密大概介绍和区别
  6. chrome 打印布局_在打印预览模式下使用Chrome的Element Inspector?
  7. 整理的部分Java和C#不同点
  8. 使用Docker部署前端项目实战教程,该踩的坑我都帮你踩了!
  9. 蛋白质分子动力学模拟
  10. x的x分之一次方极限x趋于0_x分之e的x次方减一的极限
  11. Wilcoxon符合秩和检验
  12. ZZM区块链全球区块文化娱乐相结合的新型网站源码
  13. 用uni-app制作首页幻灯片
  14. kali linux系统下安装 VMware Tools
  15. 【树 图 科 技 头 条】2022年7月26日 星期二 @伍鸣 博士 受邀参加2022年7月29日举办的“2022开放原子开源峰会-区块链分论坛”并发表主题演讲
  16. Python--几种set集合去重的方法
  17. @Scheduled使用及讲解
  18. Track'em Down
  19. select下拉选项禁用
  20. linux分区方案 1t,linux CentOS WEB服务器分区方案

热门文章

  1. 您能看出这个生成缩略图的方法有什么问题吗?
  2. 一个fork的面试题
  3. loadrunner编写脚本常用策略,用以记录,看的懂的拿走,看不懂说明与你有缘无份...
  4. mysql隔离级别与悲观锁、乐观锁
  5. 客户端用javascript填充Dropdownlist,服务器端获取不到Dropdownlist的值
  6. java web中中文乱码问题汇总
  7. 关于需求管理的胡思乱想---R3PR
  8. 【C/C++】如何判断文件夹或者文件是否存在
  9. Web Worker 使用教程
  10. 实例说明listen()函数第二个参数的意义与用法