Controller与Service系列(一)Controller基本概念

更新时间:2023-07-13 22:44:16 阅读: 评论:0

Controller与Service系列(⼀)Controller基本概念
⼀、简介
  控制器(Controller)是集群上管理和运⾏容器的对象。Pod就是通过Controller实现应⽤的运维,如伸缩、滚动升级等,其中Pod与Controller之间通过标签(Label)以及标签选择器(Selector)建⽴关联。
控制器(Controller)对象有不同的类型,⽐较常⽤的有:
Deployment  使⽤它可以进⾏应⽤的部署、应⽤的升级回滚、弹性伸缩等。
StatefulSet  管理有状态应⽤,⽤来管理某 Pod集合的部署和扩缩,并为这些 Pod 提供持久存储和持久标识符。
DaemonSet  确保全部(或者某些)节点上运⾏⼀个 Pod 的副本。
Job  ⼀次性任务
CronJob 创建基于时隔重复调度的 Jobs
⼆、Deployment
(⼀)应⽤部署
Deployment常⽤的场景就是应⽤的部署、升级、回滚、伸缩等。
1、部署准备
在之前的操作中直接通过命令⾏的⽅式进⾏应⽤的部署:
[root@k8smaster ~]# kubectl create development web --image=nginx
但是这样不利于重⽤,所以可以采⽤yaml⽂件的⽅式:
# 导出yaml⽂件
[root@k8smaster ~]# kubectl create deployment web --image=nginx --dry-run -o yaml > web.yam
可以看到yaml⽂件中的内容:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
lector:
matchLabels:
app: web
strategy: {}
公司高管
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
键盘手
resources: {}
status: {}十一月十一
可以看到Deployment控制器中的lector中与Pod中的labels进⾏匹配,它们之间就是基于此进⾏关联。
2、yaml部署
[root@k8smaster ~]# kubectl apply -f web.yaml
deployment.apps/web created
⽬前该应⽤只能集群内部访问,需要暴露端⼝到外部,这样外部才能访问。
3、应⽤发布(对外暴露端⼝)
# 导出yaml⽂件
[root@k8smaster ~]# kubectl expo deployment web --port=80 --type=NodePort --target-port=80 --name=webOut -o yaml > webOut.yaml apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2021-06-18T18:11:36Z"
labels:
app: web
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels:
.: {}
f:app: {}
f:spec:
f:externalTrafficPolicy: {}
f:ports:
.: {}
k:{"port":80,"protocol":"TCP"}:
.: {}
f:port: {}
f:protocol: {}
f:targetPort: {}
f:lector:
.: {}
f:app: {}
f:ssionAffinity: {}
f:type: {}
manager: kubectl
operation: Update
time: "2021-06-18T18:11:36Z"
name: web1
namespace: default
resourceVersion: "393318"
lfLink: /api/v1/namespaces/default/rvices/web1
玩出了名堂uid: 9cbe6be0-d147-43a4-812f-32ae6722fdf3
spec:
clusterIP: 10.97.65.66
externalTrafficPolicy: Cluster
ports:
- nodePort: 31681
port: 80
protocol: TCP
targetPort: 80
lector:
app: web
ssionAffinity: None
type: NodePort
status:好的图片大全
loadBalancer: {}
web1.yaml
进⾏部署:
[root@k8smaster ~]# kubectl apply -f web1.yaml
# 查看
[root@k8smaster ~]# kubectl get pods,svc
NAME                      READY  STATUS    RESTARTS  AGE
pod/web-5dcb957ccc-j2pg4  1/1    Running  0          15m
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP  PORT(S)        AGE
rvice/kubernetes  ClusterIP  10.96.0.1    <none>        443/TCP        61d
rvice/web1        NodePort    10.97.65.66  <none>        80:31681/TCP  3m51s
(⼆)应⽤升级、回滚
1、应⽤升级
# 升级
[root@k8smaster ~]# kubectl t image deployment web nginx=nginx:1.15
deployment.apps/web image updated
# 查看升级状态
[root@k8smaster ~]# kubectl rollout status deployment web
deployment "web" successfully rolled out
2、应⽤回滚
# 查看回滚版本
[root@k8smaster ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION  CHANGE-CAUSE
1        <none>
2        <none>
# 回滚到上⼀个版本
[root@k8smaster ~]# kubectl rollout undo deployment web
deployment.apps/web rolled back
# 回滚到指定版本
[root@k8smaster ~]# kubectl rollout undo deployment web --to-revision=2
(三)弹性伸缩
# 伸缩前查看
[root@k8smaster ~]# kubectl get pods,svc
NAME                      READY  STATUS    RESTARTS  AGE
pod/web-5dcb957ccc-66txn  1/1    Running  0          3m5s
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP  PORT(S)        AGE
rvice/kubernetes  ClusterIP  10.96.0.1    <none>        443/TCP        61d
rvice/web1        NodePort    10.97.65.66  <none>        80:31681/TCP  40m中国创业板
# 进⾏伸缩
[root@k8smaster ~]# kubectl scale deployment web --replicas=3
deployment.apps/web scaled
# 伸缩后查看
[root@k8smaster ~]# kubectl get pods,svc
NAME                      READY  STATUS              RESTARTS  AGE
pod/web-5dcb957ccc-66txn  1/1    Running            0          3m41s
pod/web-5dcb957ccc-jx4kl  0/1    ContainerCreating  0          2s
pod/web-5dcb957ccc-zvmcm  0/1    ContainerCreating  0          2s
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP  PORT(S)        AGE
rvice/kubernetes  ClusterIP  10.96.0.1    <none>        443/TCP        61d
rvice/web1        NodePort    10.97.65.66  <none>        80:31681/TCP  41m
三、StatefulSet
  StatefulSet ⽤来管理某 Pod 集合的部署和扩缩,并为这些 Pod 提供持久存储和持久标识符。所以相对于Deployment⽽⾔它是有状态的,需要考虑下⾯的情况:
保持每个Pod独⽴、启动顺序、唯⼀性
唯⼀的⽹络标识、持久存储
创建StatefulSet:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
-
port: 80
name: web
clusterIP: None
lector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefult
namespace: default
spec:
rviceName: nginx
replicas: 2
lector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
它创建了⼀个 Headless Service nginx⽤来发布 StatefulSet web中的 Pod 的 IP 地址,表现形式就是clusterIP为None。执⾏上⾯的yaml⽂件:
[root@k8smaster ~]# kubectl apply -f statefult.yaml
rvice/nginx created
上⾯创建两个Pod的副本,但是它是按照{0,N-1}的顺序来创建Pod的,也就是Pod是有顺序的。
其次查看创建的两个Pod:
[root@k8smaster ~]# kubectl get pods
NAME                  READY  STATUS    RESTARTS  AGE
nginx-statefult-0  1/1    Running  0          15m
nginx-statefult-1  1/1    Running  0          14m
每个都是有唯⼀的名称,最后看⼀下⽹络标识,每个 Pod 都拥有⼀个基于其顺序索引的稳定的主机名。使⽤kubectl exec在每个 Pod 中执⾏hostname。
[root@k8smaster ~]# for i in 0 1; do kubectl exec "nginx-statefult-$i" -- sh -c 'hostname'; done
微信红包有限额吗
nginx-statefult-0
nginx-statefult-1
四、DaemonSet
DaemonSet 确保全部(或者某些)节点上运⾏⼀个 Pod 的副本。当有节点加⼊集群时,也会为他们新增⼀个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod
DaemonSet 的⼀些应⽤场景:
在每个节点上运⾏集群守护进程
在每个节点上运⾏⽇志收集守护进程
在每个节点上运⾏监控守护进程
创建⼀个⽇志收集⼯具的DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
lector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
执⾏该yaml⽂件:
[root@k8smaster ~]# kubectl apply -f ds.yaml
daemont.apps/ds-test created
可以看到在各个node节点上已经部署了Pod:
[root@k8smaster ~]# kubectl get pods -o wide
NAME            READY  STATUS    RESTARTS  AGE  IP            NODE      NOMINATED NODE  READINESS GATES
ds-test-6qdwg  1/1    Running  0          84s  10.244.1.23  k8snode1  <none>          <none>
ds-test-m79px  1/1    Running  0          84s  10.244.2.20  k8snode2  <none>          <none>
进⼊到某个Pod中进⾏查看:
[root@k8smaster ~]# kubectl exec -it ds-test-6qdwg bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. U kubectl kubectl exec [POD] -- [COMMAND] instead.
root@ds-test-6qdwg:/# ls /tmp/log/
anaconda  btmp-20210617  dmesg        maillog          pods    cure-20210617    tuned
audit      containers    dmesg.old  maillog-20210617  ppp    spooler        vmware-vmsvc.log
boot.log  cron        firewalld  messages          rhsm    spooler-20210617  wtmp
btmp      cron-20210617  lastlog    messages-20210617  cure  tallylog        yum.log
五、Job
  Job 会创建⼀个或者多个 Pods,并将继续重试 Pods 的执⾏,直到指定数量的 Pods 成功终⽌。随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。当数量达到指定的成功个数阈值时,任务(即 Job)结束。删除 Job 的操作会清除所创建的全部 Pods。挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执⾏。
下⾯是⼀个 Job 配置⽰例。它负责计算π到⼩数点后 2000 位,并将结果打印出来。
立体声混音apiVersion: batch/v1
kind: Job

本文发布于:2023-07-13 22:44:16,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1095081.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:创建   集群   节点   伸缩   升级
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图