04Kubernetes-Controller控制器

常用的控制器类型

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

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

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

StatefulSet:
有状态应用

RpelicaSet控制器

1.pod类型的资源,删除pod后,不会重建
2.替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行
3.如果所运行的pod副本数超过了用户期望的,那么控制器就会删掉,直到和用户期望的一致
4.如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致

资源配置清单

apiVersion: apps/v1                     #接口版本号
kind: ReplicaSet                        #资源类型 ReplicaSet
metadata:                               #RS的原数据
  name: nginx-rs                        #RS原数据名称
  labels:                               #RS原数据标签
    app: nginx-rs                       #RS具体标签
spec:                                   #定义pod的实际运行配置
  replicas: 2                           #要运行几个Pod
  selector:                             #选择器
    matchLabels:                        #匹配标签
      app: nginx-pod                    #匹配Pod的标签
  template:                             #创建的Pod的配置模板
    metadata:                           #pod自己的原数据
      labels:                           #pod自己的标签
        app: nginx-pod                  #pod具体标签名
    spec:                               #定义容器运行的配置
      containers:                       #容器参数
      - name: nginx                     #容器名
        image: nginx:1.14               #容器镜像
        imagePullPolicy: IfNotPresent   #镜像拉取策略
        ports:                          #暴露端口
        - name: http                    #端口说明
          containerPort: 80             #容器暴露的端口

RS应用配置清单

kubectl create -f nginx-rs.yaml

查看RS资源

kubectl get rs 
kubectl get pod -o wide 

修改yaml文件应用修改

vim nginx-rs.yaml
kubectl apply -f nginx-rs.yaml

动态修改配置 扩容 收缩 升级

kubectl edit rs nginx
kubectl scale rs nginx --replicas=5

Deployment控制器

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

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

资源配置清单

apiVersion: apps/v1
kind: Deployment
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

# 命令行创建pod
[root@db01 ~]# kubectl set image -f dp-nginx.yaml nginx-web01=nginx:1.20

# 查看有没有更新
kubectl get pod -o wide
kubectl get deployments.apps
kubectl describe deployments.apps nginx-deployment

滚动更新示意图

file

更新版本和回滚

## 更新版本
[root@db01 ~]# kubectl set image deployment nginx-dp nginx-web01=nginx:1.22 --record
# 配置文件更新版本
[root@db01 ~]# kubectl apply -f dp-nginx.yaml --record

## 查看所有历史版本
[root@db01 ~]# kubectl rollout history deployment nginx-dp 

## 查看指定历史版本的详细信息
[root@db01 ~]# kubectl rollout history deployment nginx-dp  --revision=4

## 回滚
[root@db01 ~]# kubectl rollout undo deployment nginx-dp --to-revision=10

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

DaemonSet控制器

DaemonSet 的一些典型用法:

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

file

资源配置清单

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介绍:

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来获取相应的数据。

file

Metrics Server安装

# 1.下载yaml文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.0/components.yaml

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

## 谷歌内部镜像:
metrics-server

修改配置文件:

    spec:
      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    #修改为本地的镜像

创建资源

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%

生成测试镜像

创建测试首页

cat > index.php << 'EOF'
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>
EOF

创建dockerfile

cat > dockerfile << 'EOF'
FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
EOF

生成镜像

docker build -t php:v1 .

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

[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

山林不向四季起誓 荣枯随缘