0
点赞
收藏
分享

微信扫一扫

08-控制器详解、临时任务与计划任务、Headless服务

向上的萝卜白菜 2024-05-27 阅读 15

Deploy 控制器

# 清理 Pod ,使用控制器创建[root@master ~]# kubectl delete pod --all# 资源对象模板[root@master ~]# kubectl create deployment myweb --image=myos:httpd --dry-run=client -o yaml[root@master ~]# vim mydeploy.yaml---kind: Deployment          # 资源对象类型apiVersion: apps/v1       # 版本metadata:                 # 元数据  name: myweb             # 名称spec:                     # 详细定义  replicas: 2             # 副本数量  selector:               # 定义标签选择器    matchLabels:          # 支持 matchExpressions 表达式语法      app: httpd          # 通过标签来确定那个 Pod 由它来管理  template:               # 定义用来创建 Pod 的模板,以下为 Pod 定义    metadata:      labels:        app: httpd    spec:      restartPolicy: Always      containers:      - name: webserver        image: myos:httpd        imagePullPolicy: Always
[root@master ~]# kubectl apply -f mydeploy.yaml deployment.apps/myweb created[root@master ~]# kubectl get deployments NAME    READY   UP-TO-DATE   AVAILABLE   AGEmyweb   2/2     2            2           68s[root@master ~]# kubectl get replicasets NAME               DESIRED   CURRENT   READY   AGEmyweb-64b544dcbc   2         2         2       73s[root@master ~]# kubectl get podsNAME                     READY   STATUS    RESTARTS   AGEmyweb-64b544dcbc-5mhqn   1/1     Running   0          76smyweb-64b544dcbc-nt6tz   1/1     Running   0          76s

ClusterIP 服务

# 创建服务访问集群[root@master ~]# vim websvc.yaml---kind: ServiceapiVersion: v1metadata:  name: websvcspec:  type: ClusterIP  clusterIP: 10.245.1.80  selector:    app: httpd  ports:  - protocol: TCP    port: 80    targetPort: 80
[root@master ~]# kubectl apply -f websvc.yaml service/websvc created[root@master ~]# curl -m 3 http://10.245.1.80Welcome to The Apache.

Pod 维护管理

# 自维护自治理[root@master ~]# kubectl get podsNAME                     READY   STATUS    RESTARTS   AGEmyweb-64b544dcbc-5mhqn   1/1     Running   0          4m16smyweb-64b544dcbc-nt6tz   1/1     Running   0          4m16s
# Pod 被删除后,Deploy 会自动创建新的 Pod 来维护集群的完整性[root@master ~]# kubectl delete pod myweb-64b544dcbc-5mhqn pod "myweb-64b544dcbc-5mhqn" deleted[root@master ~]# kubectl get podsNAME                     READY   STATUS    RESTARTS   AGEmyweb-64b544dcbc-g8l9p   1/1     Running   0          3smyweb-64b544dcbc-nt6tz   1/1     Running   0          4m25s

集群扩缩容

# 设置 1 Pod 集群[root@master ~]# kubectl scale deployment myweb --replicas=1deployment.apps/myweb scaled[root@master ~]# kubectl get podsNAME                     READY   STATUS    RESTARTS   AGEmyweb-64b544dcbc-nt6tz   1/1     Running   0          5m46s# 设置 3 Pod 集群[root@master ~]# kubectl scale deployment myweb --replicas=3deployment.apps/myweb scaled[root@master ~]# kubectl get podsNAME                     READY   STATUS    RESTARTS   AGEmyweb-64b544dcbc-5sf5z   1/1     Running   0          3smyweb-64b544dcbc-6r6dw   1/1     Running   0          3smyweb-64b544dcbc-nt6tz   1/1     Running   0          5m56s

历史版本信息

# 查看历史版本[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION  CHANGE-CAUSE1         <none>
# 添加注释信息[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="httpd.v1"deployment.apps/myweb annotated[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION  CHANGE-CAUSE1         httpd.v1

滚动更新

# 修改镜像,滚动更新集群[root@master ~]# kubectl set image deployment myweb webserver=myos:nginxdeployment.apps/myweb image updated # 给新版本添加注释信息[root@master ~]# kubectl annotate deployments myweb kubernetes.io/change-cause="nginx.v1"deployment.apps/myweb annotated# 查看历史版本信息[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION  CHANGE-CAUSE1         httpd.v12         nginx.v1
# 访问验证服务[root@master ~]# curl -m 3 http://10.245.1.80Nginx is running !

版本回滚

# 历史版本与回滚[root@master ~]# kubectl rollout undo deployment myweb --to-revision 1deployment.apps/myweb rolled back[root@master ~]# curl -m 3 http://10.245.1.80Welcome to The Apache.
[root@master ~]# kubectl rollout history deployment myweb deployment.apps/myweb REVISION  CHANGE-CAUSE2         nginx.v13         httpd.v1
# 删除控制器方法1[root@master ~]# kubectl delete deployments myweb deployment.apps "myweb" deleted# 删除控制器方法2[root@master ~]# kubectl delete -f mydeploy.yamldeployment.apps "myweb" deleted

DaemonSet


资源对象案例

[root@master ~]# cp -a mydeploy.yaml myds.yaml[root@master ~]# vim myds.yaml---kind: DaemonSet  # 资源对象类型apiVersion: apps/v1metadata:  name: myds     # 控制器名称spec:  # replicas: 2  # 删除副本参数  selector:    matchLabels:      app: httpd  template:    metadata:      labels:        app: httpd    spec:      restartPolicy: Always      containers:      - name: webserver        image: myos:httpd        imagePullPolicy: Always
[root@master ~]# kubectl apply -f myds.yaml daemonset.apps/myds created[root@master ~]# kubectl get pods -o wideNAME         READY   STATUS    RESTARTS   IP            NODEmyds-msrcx   1/1     Running   0          10.244.1.11   node-0001myds-lwq8l   1/1     Running   0          10.244.2.17   node-0002myds-4wt72   1/1     Running   0          10.244.3.14   node-0003myds-6k82t   1/1     Running   0          10.244.4.15   node-0004myds-9c6wc   1/1     Running   0          10.244.5.19   node-0005

污点干扰

# 设置污点,重建 daemonset[root@master ~]# kubectl taint node node-0001 k=v:NoSchedulenode/node-0001 tainted[root@master ~]# kubectl delete -f myds.yaml daemonset.apps "myds" deleted[root@master ~]# kubectl apply -f myds.yaml daemonset.apps/myds created# 有污点不会部署,特殊需求可以设置容忍策略[root@master ~]# kubectl get podsNAME         READY   STATUS    RESTARTS   AGEmyds-pkdn9   1/1     Running   0          2smyds-pkp6b   1/1     Running   0          2smyds-j84cw   1/1     Running   0          2smyds-5c69p   1/1     Running   0          2s# 删除污点后会立即部署[root@master ~]# kubectl taint node node-0001 k=v:NoSchedule-node/node-0001 untainted[root@master ~]# kubectl get podsNAME         READY   STATUS    RESTARTS   AGEmyds-2c86p   1/1     Running   0          1smyds-pkdn9   1/1     Running   0          9smyds-pkp6b   1/1     Running   0          9smyds-j84cw   1/1     Running   0          9smyds-5c69p   1/1     Running   0          9s
# 删除控制器[root@master ~]# kubectl delete -f myds.yaml daemonset.apps "myds" deleted

Job/CronJob


Job 控制器

# 资源对象模板[root@master ~]# kubectl create job myjob --image=myos:8.5 --dry-run=client -o yaml -- sleep 3[root@master ~]# vim myjob.yaml ---kind: JobapiVersion: batch/v1metadata:  name: myjobspec:  template:  # 以下定义 Pod 模板    spec:      restartPolicy: OnFailure      containers:      - name: myjob        image: myos:8.5        command: ["/bin/bash"]        args:        - -c        - |          sleep 3          exit $((RANDOM%2))
[root@master ~]# kubectl apply -f myjob.yaml job.batch/myjob created
# 失败了会重启[root@master ~]# kubectl get pods -l job-name=myjob -wNAME             READY   STATUS      RESTARTS     AGEmyjob--1-lrtbk   1/1     Running     0            2smyjob--1-lrtbk   0/1     Error       0            4smyjob--1-lrtbk   1/1     Running     1 (1s ago)   5smyjob--1-lrtbk   0/1     Completed   1            9s
[root@master ~]# kubectl get jobs.batch NAME    COMPLETIONS   DURATION   AGEmyjob   1/1           8s         12s
# 删除Job控制器[root@master ~]# kubectl delete -f myjob.yaml job.batch "myjob" deleted


资源对象案例

# 资源对象模板[root@master ~]# kubectl create cronjob mycj --image=myos:8.5 --schedule='* * * * *' --dry-run=client -o yaml -- sleep 3[root@master ~]# vim mycj.yaml---kind: CronJobapiVersion: batch/v1metadata:  name: mycjspec:  schedule: "* * * * 1-5"  jobTemplate:  # 以下定义 Job 模板    spec:      template:        spec:          restartPolicy: OnFailure          containers:          - name: myjob            image: myos:8.5            command: ["/bin/bash"]            args:            - -c            - |              sleep 3              exit $((RANDOM%2))
[root@master ~]# kubectl apply -f mycj.yaml cronjob.batch/mycj created[root@master ~]# kubectl get cronjobs NAME   SCHEDULE        SUSPEND   ACTIVE   LAST SCHEDULE   AGEmycj   */1 * * * 1-5   False     0        <none>          4s
# 按照时间周期,每分钟触发一个任务[root@master ~]# kubectl get jobs -wNAME                     READY   STATUS              RESTARTSmycj-27808172--1-w6sbx   0/1     Pending             0mycj-27808172--1-w6sbx   0/1     ContainerCreating   0mycj-27808172--1-w6sbx   1/1     Running             0mycj-27808172--1-w6sbx   0/1     Completed           1
# 保留三次结果,多余的会被删除[root@master ~]# kubectl get jobs NAME            COMPLETIONS   DURATION   AGEmycj-27605367   1/1           31s        3m30smycj-27605368   1/1           31s        2m30smycj-27605369   1/1           31s        90smycj-27605370   0/1           30s        30s[root@master ~]# kubectl get jobs NAME            COMPLETIONS   DURATION   AGEmycj-27605368   1/1           31s        2m33smycj-27605369   1/1           31s        93smycj-27605370   1/1           31s        33s
# 删除CJ控制器[root@master ~]# kubectl delete -f mycj.yaml cronjob.batch "mycj" deleted

StatefulSet


headless 服务

# 配置 headless 服务[root@master ~]# cp websvc.yaml mysvc2.yaml [root@master ~]# vim mysvc2.yaml ---kind: ServiceapiVersion: v1metadata:  name: mysvc2       # 服务名称spec:  type: ClusterIP  clusterIP: None    # 设置 IP 为 None  selector:    app: httpd  ports:  - protocol: TCP    port: 80    targetPort: 80
[root@master ~]# kubectl apply -f mysvc2.yaml service/mysvc2 created[root@master ~]# kubectl get service mysvc2NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGEmysvc2        ClusterIP   None          <none>        80/TCP    61s

资源对象文件

[root@master ~]# cp -a mydeploy.yaml mysts.yaml[root@master ~]# vim mysts.yaml---kind: StatefulSet      # 资源对象类型apiVersion: apps/v1metadata:  name: mysts          # 控制器名称spec:  serviceName: mysvc2  # 新增 headless 服务名称  replicas: 3  selector:    matchLabels:      app: httpd  template:    metadata:      labels:        app: httpd    spec:      restartPolicy: Always      containers:      - name: webserver        image: myos:httpd        imagePullPolicy: Always        [root@master ~]# kubectl apply -f mysts.yaml statefulset.apps/mysts created
[root@master ~]# kubectl get podsNAME      READY   STATUS    RESTARTS   AGEmysts-0   1/1     Running   0          3smysts-1   1/1     Running   0          2smysts-2   1/1     Running   0          1s
[root@master ~]# host mysts-0.mysvc2.default.svc.cluster.local 10.245.0.10Using domain server:Name: 10.245.0.10Address: 10.245.0.10#53Aliases: 
mysts-0.mysvc2.default.svc.cluster.local has address 10.244.1.81
[root@master ~]# host mysvc2.default.svc.cluster.local 10.245.0.10Using domain server:Name: 10.245.0.10Address: 10.245.0.10#53Aliases: 
mysvc2.default.svc.cluster.local has address 10.244.3.82mysvc2.default.svc.cluster.local has address 10.244.2.83mysvc2.default.svc.cluster.local has address 10.244.1.81
# 删除sts控制器[root@master ~]# kubectl delete -f mysts.yaml -f mysvc2.yamlstatefulset.apps "mysts" deletedservice "mysvc2" deleted

弹性云服务


创建后端服务

# 为 Deploy 模板添加资源配额[root@master ~]# vim mydeploy.yaml ---kind: DeploymentapiVersion: apps/v1metadata:  name: mywebspec:  replicas: 1                 # 修改副本数量  selector:    matchLabels:      app: httpd  template:    metadata:      labels:        app: httpd    spec:      restartPolicy: Always      containers:      - name: webserver        image: myos:httpd        imagePullPolicy: Always        resources:           # 为该资源设置配额          requests:          # HPA 控制器会根据配额使用情况伸缩集群            cpu: 200m        # CPU 配额
[root@master ~]# vim websvc.yaml---kind: ServiceapiVersion: v1metadata:  name: websvcspec:  type: ClusterIP  clusterIP: 10.245.1.80  selector:    app: httpd  ports:  - protocol: TCP    port: 80    targetPort: 80
[root@master ~]# kubectl apply -f mydeploy.yaml -f websvc.yamldeployment.apps/myweb createdservice/websvc created
# 验证服务[root@master ~]# kubectl top podsNAME                    CPU(cores)   MEMORY(bytes)   myweb-c8c66f894-2cfjv   1m           17Mi  [root@master ~]# curl -s http://10.245.1.80Welcome to The Apache.

创建 HPA 控制器

[root@master ~]# vim myhpa.yaml ---kind: HorizontalPodAutoscalerapiVersion: autoscaling/v1metadata:  name: mywebspec:  minReplicas: 1  maxReplicas: 5  targetCPUUtilizationPercentage: 50  scaleTargetRef:    kind: Deployment    apiVersion: apps/v1    name: myweb

[root@master ~]# kubectl apply -f myhpa.yaml horizontalpodautoscaler.autoscaling/myweb created
# 刚刚创建 unknown 是正常现象,最多等待 60s 就可以正常获取数据[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICASmyweb   Deployment/myweb   <unknown>/50%   1         5         0
[root@master ~]# kubectl get horizontalpodautoscalers.autoscaling NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICASmyweb   Deployment/myweb   0%/50%          1         5         1

验证测试

# 终端 1 访问提高负载[root@master ~]# while sleep 1;do    curl -s "http://10.245.1.80/info.php?id=100000" -o /dev/nulldone# 终端 2 监控 HPA 变化[root@master ~]# kubectl get hpa -wNAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGEmyweb   Deployment/myweb   0%/50%    1         3         1          8m21smyweb   Deployment/myweb   49%/50%   1         3         1          9mmyweb   Deployment/myweb   56%/50%   1         3         1          9m15smyweb   Deployment/myweb   56%/50%   1         3         2          9m30smyweb   Deployment/myweb   37%/50%   1         3         2          9m45smyweb   Deployment/myweb   32%/50%   1         3         2          10mmyweb   Deployment/myweb   41%/50%   1         3         2          11mmyweb   Deployment/myweb   48%/50%   1         3         2          11mmyweb   Deployment/myweb   51%/50%   1         3         2          11mmyweb   Deployment/myweb   59%/50%   1         3         2          11mmyweb   Deployment/myweb   58%/50%   1         3         3          12mmyweb   Deployment/myweb   42%/50%   1         3         3          12mmyweb   Deployment/myweb   34%/50%   1         3         3          12m
# 如果 300s 内平均负载小于标准值,就会自动缩减集群规模[root@master ~]# kubectl get hpa -wNAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGEmyweb   Deployment/myweb   38%/50%   1         3         3          19mmyweb   Deployment/myweb   21%/50%   1         3         3          20mmyweb   Deployment/myweb   17%/50%   1         3         3          21mmyweb   Deployment/myweb    7%/50%   1         3         3          22mmyweb   Deployment/myweb    0%/50%   1         3         3          23mmyweb   Deployment/myweb    0%/50%   1         3         2          25mmyweb   Deployment/myweb    0%/50%   1         3         1          28m

拓展提高项目

项目

WEB集群项目:
使用 Nginx 搭建 web 集群,动态页面由 PHP 和 Tomcat 集群解析
使用 NFS 存放网页
将访问日志存放在计算节点的 /var/weblog 目录下
弹性部署 PHP、Tomcat 集群服务

举报

相关推荐

0 条评论