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
滚动更新示意图
更新版本和回滚
## 更新版本
[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 的一些典型用法:
- 在每个节点上运行集群守护进程
- 在每个节点上运行日志收集守护进程
- 在每个节点上运行监控守护进程
资源配置清单
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来获取相应的数据。
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
Comments | NOTHING