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