Kubernetes Controller控制器

Kubernetes Controller控制器

常用的控制器类型


# ReplicaSet RS:
按用户期望的副本创建pod,并始终保持相应数量副本

# Deployment:
Deployment通过控制RS来保证POD始终保持相应的数量副本
支持滚动更新,回滚,回滚默认保留10个版本
提供声明式配置,支持动态修改
管理无状态应用最理想的控制器
node节点可能会运行0个或多个POD

# DeamonSet:
一个节点只运行一个,必须是始终运行的状态

# StatefulSet:
有状态应用
控制器语法
[root@db01 ~]$ vim rs_nginx.yml
apiVersion: apps/v1							   # 控制器接口版本号/被操作的控制器接口版本号(pod)
kind: ReplicaSet							   # 资源类型 ReplicaSet
metadata:									  # RS的原数据
  name: nginx-rs							   # RS原数据名称
  labels:									  # RS原数据标签
    app: nginxssssssss						   # RS具体标签
spec:										  # 定义pod的实际运行配置
  replicas: 10								   # 要运行几个Pod
  selector:									   # 选择器
    matchLabels:							   # 匹配标签,控制器依靠匹配标签与pod配置建立连接
      app: nginx							   # 匹配Pod的标签,必须和Pod标签一样,才能控制pod
  template:									   # 创建的Pod的配置模板
    metadata:								   # pod自己的原数据
      name: web								   # pod名称
      labels:								   # pod自己的标签
        app: nginx							    # pod具体标签名
    spec:									   # 定义容器运行的配置
      containers:							    # 容器参数
      - image: nginx:1.17						# 容器镜像
        imagePullPolicy: IfNotPresent			 # 镜像拉取策略
        name: nginx-web01						# 容器标签
        ports:								   # 暴露端口
        - containerPort: 80
查看控制器版本
# apps
[root@db01 ~]$ kubectl get deployments.apps

ReplicaSet RS控制器


1.pod类型的资源,删除pod后,不会重建
2.替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行
3.如果所运行的pod副本数超过了用户期望的,那么控制器就会删掉,直到和用户期望的一致
4.如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致
5.同时启动多个pod副本
6.pod控制器不支持更新(能更新RS,但无法更新pod)

ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

ReplicaSet 的工作原理

RepicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。 每个 ReplicaSet 都通过根据需要创建和 删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

ReplicaSet 通过 Pod 上的 metadata.ownerReferences 字段连接到附属 Pod,该字段给出当前对象的属主资源。 ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet 的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。

ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个 控制器,且其匹配到 某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得

[root@db01 ~]$ vim rs_nginx.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  labels:
    app: nginxssssssss

spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: web
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17
        imagePullPolicy: IfNotPresent
        name: nginx-web01
        ports:
        - containerPort: 80


# 应用RS资源配置清单
[root@db01 ~]$ kubectl apply -f rs_nginx.yml
[root@db01 ~]$ kubectl create -f rs_nginx.yml


# 查看RS资源,启动了十台pod,在replicas配置
[root@db01 ~]$ kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   10        10        10      3m46s
[root@db01 ~]$ kubectl get pod -o wide


# 修改yaml文件应用修改
vim nginx-rs.yaml
kubectl apply -f nginx-rs.yaml


# 动态修改配置 扩容 收缩 升级
kubectl edit rs nginx-rs
kubectl scale rs nginx-rs --replicas=5

Deployment控制器


虽然我们创建的是Deployment类型资源,但实际上控制副本还是由RS来控制的,Deployment只是替我们去创建RS控制器,然后再由RS去控制POD副本.

Deployment控制器还有一个比较重要的功能就是滚动更新和版本回滚,而这个功能就是以来RS控制器。

apiVersion: apps/v1
kind: Deployment				# Deployment控制器还是调用的ReplicaSet控制器启动pod,所以还是使用apps接口
metadata:
  name: nginx-dp
  labels:
    app: nginxssssssss

spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx-dp

  template:
    metadata:
      labels:
        app: nginx-dp

    spec:
      containers:
      - image: nginx:1.19
        imagePullPolicy: IfNotPresent
        name: nginx-web01
        ports:
        - containerPort: 80


[root@db01 ~]$ kubectl create -f Deployment.yml


[root@db01 ~]$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dp-7879554849-45qjv   1/1     Running   0          5m13s
nginx-dp-7879554849-5fqbg   1/1     Running   0          5m13s
nginx-dp-7879554849-gc2zq   1/1     Running   0          5m13s
nginx-dp-7879554849-gnrzn   1/1     Running   0          5m13s
nginx-dp-7879554849-lgqqp   1/1     Running   0          5m13s
## nginx-dp-7879554849:这一段是Deployment控制器加的pod名称,后面的随机数是ReplicaSet加的


[root@db01 ~]$ kubectl get deployments.apps
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-dp   5/5     5            5           74m

# 查看pod详细信息
[root@db01 ~]$ kubectl describe deployments.apps nginx-dp


# 手动更新版本
[root@db01 ~]$ kubectl set image -f Deployment.yml nginx-web01=nginx:1.20
# 查看容器创建详细信息
[root@db01 ~]$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dp-6656bc7877-jnndh   1/1     Running   0          2m53s
nginx-dp-6656bc7877-q4q4f   1/1     Running   0          2m53s
nginx-dp-6656bc7877-xdhv5   1/1     Running   0          2m30s
nginx-dp-6656bc7877-z4z8w   1/1     Running   0          2m53s
nginx-dp-6656bc7877-zklsm   1/1     Running   0          2m29s

[root@db01 ~]$ kubectl describe pods nginx-dp-6656bc7877-jnndh
Name:         nginx-dp-6656bc7877-jnndh
Namespace:    default
Priority:     0
Node:         db03/10.0.0.53
Start Time:   Fri, 26 Nov 2021 18:24:42 +0800
Labels:       app=nginx-dp
              pod-template-hash=6656bc7877
Annotations:  <none>
Status:       Running
IP:           10.2.1.15
    Container ID:   docker://8457b02cebdf50f9db758b10a0bc55d00215722d35ef8c2a42baebc5a63eb433
    Image:          nginx:1.20				# //容器镜像更新到1.20版本

滚动更新示意图
在这里插入图片描述

更新版本
## 更新版本
### 资源清单
修改image
kubectl apply -f 资源清单 --record

### 命令
#### 语法:
kubectl set image 控制器 控制器名称 容器名称=容器镜像 --record

[root@db01 ~]$ kubectl set image deployment nginx-dp nginx-web01=nginx:1.21 --record
[root@db01 ~]$ kubectl apply -f dp-nginx.yaml --record

--record:记录版本更新命令到历史记录



## 查看历史版本
### 语法:
kubectl rollout history 控制器 控制器名称

[root@db01 ~]$ kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         kubectl set image deployment nginx-dp nginx-web01=nginx:1.21 --record=true
4         kubectl apply --filename=Deployment.yml --record=true



## 查看指定历史版本的详细信息
### 语法:
kubectl rollout history 控制器 控制器名称 --revision=

[root@db01 ~]$ kubectl rollout history deployment nginx-dp --revision=4

--revision:指定查看历史记录中第几条信息

[root@db01 ~]$ kubectl rollout history deployment nginx-dp --revision=4
deployment.apps/nginx-dp with revision #4
Pod Template:
  Labels:	app=nginx-dp
	pod-template-hash=7879554849
  # 第四条记录的创建命令
  Annotations:	kubernetes.io/change-cause: kubectl apply --filename=Deployment.yml --record=true
  Containers:
   nginx-web01:
    Image:	nginx:1.19
    Port:	80/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>



## 回滚
### 语法:
kubectl rollout undo 控制器 控制器名称 --to-revision=回滚到历史记录中第几条版本

[root@db01 ~]$ kubectl rollout undo deployment nginx-dp --to-revision=3

[root@db01 ~]$ kubectl get pods
[root@db01 ~]$ kubectl describe pods nginx-dp-7c4697675d-dsrjt
    Container ID:   docker://d79bc8a49fe199d6bfcc5375edd3dd9443097cd1dc840e48d116068a5b1df9df
    Image:          nginx:1.21



## 动态扩容 缩容
kubectl scale deployment nginx-deployment --replicas=5
kubectl scale deployment nginx-deployment --replicas=2

DaemonSet


DaemonSet 的一些典型用法:

  • 在每个节点上运行集群守护进程
  • 在每个节点上运行日志收集守护进程
  • 在每个节点上运行监控守护进程

在这里插入图片描述

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    app: nginx-ds
spec:
  selector:
    matchLabels:
      app: nginx-ds
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: nginx-ds
        image: nginx:1.16
        ports:
        - containerPort: 80
      - name: nginx-ds
        image: nginx:1.16
        ports:
        - containerPort: 80

HPA自动扩缩容


HPA官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

HAP通过收集来的监控指标分析所有Pod的负载情况,并且根据我们设定好的标准来自动扩容收缩ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量
Metrics Server介绍
在HAP早期版本使用的是一个叫Heapster组件来提供CPU和内存指标的,在后期的版本k8s转向了使用Metrcis Server组件来提供Pod的CPU和内存指标,Metrcis Server通过Metrics API将数据暴露出来,然后我们就可以使用k8s的API来获取相应的数据。

在这里插入图片描述

Metrics Server安装
# 1.下载yaml文件
wget https://github.com/kubernetes-sigs/metricsserver/releases/download/v0.4.0/components.yaml

由于默认的镜像是从google云下载的,所以需要一些手段先下载下来,然后再导入本地的节点中。

修改配置文件:
spec:
  nodeName: db02
  hostNetwork: true #使用host网络模式
  containers:
  - args:
    - --cert-dir=/tmp
    - --secure-port=4443
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --kubelet-use-node-status-port
    - --kubelet-insecure-tls #跳过证书检查
    image: metrics-server:v0.4.0 #修改为本地的镜像
    

## 谷歌内部镜像:学习工具中
metrics-server


## 创建资源:
kubectl apply -f components.yaml


## 查看pods详细信息
[root@db01 ~]$ kubectl -n kube-system get pods -o wide


## 执行查看负载命令
[root@master ~]$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 79m 7% 1794Mi 46%
node1 26m 2% 795Mi 20%
node2 23m 2% 785Mi 20%
生成测试镜像

创建测试首页

[root@db01 ~]$ mkdir Dockerfile
[root@db01 ~]$ cd Dockerfile

[root@db01 ~/Dockerfile]$ cat > index.php << 'EOF'
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>
EOF

创建dockerfile

[root@db01 ~/Dockerfile]$ cat > dockerfile << 'EOF'
FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
EOF

[root@db01 ~/Dockerfile]$ ll
total 354948
-rw-r--r-- 1 root root        81 Nov 26 12:21 dockerfile
-rw-r--r-- 1 root root       100 Nov 26 12:20 index.php

生成镜像

[root@db01 ~/Dockerfile]$ docker build -t php:v1 .

[root@db01 ~/Dockerfile]$ docker save php:v1 > php_v1.tgz

将镜像导出发送到其他节点:

[root@db01 Dockerfile]$ docker save php:v1 > php_v1.tgz
创建deployment资源
cat >php-dp.yaml<< 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  replicas: 1
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - image: php:v1
      imagePullPolicy: IfNotPresent
      name: php-apache
      ports:
      - containerPort: 80
        protocol: TCP
      resources:
        requests:
          cpu: 200m
EOF
创建HPA资源
cat > php-hpa.yaml <<EOF
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  targetCPUUtilizationPercentage: 50
EOF

查看HPA扩所容情况

kubectl get hpa -w
kubectl get pod -w

压测

while true; do wget -q -O- http://10.2.1.18; done

简单创建命令

创建dp

kubectl run php-apache --image=php:v1 --requests=cpu=200m --expose --port=80

创建hpa

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值