Kuberneters Pod调度基础

一、Replication Controller

Replication Controller(复制控制器,RC),使Pod副本保持在预期值

root@k8s-master \~\]# vim replicationcontroller-nginx.yaml apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80

(1)创建replicationController

root@k8s-master \~\]# ku create -f replicationcontroller-nginx.yaml replicationcontroller/nginx created \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE nginx-bmsx8 1/1 Running 0 8s nginx-brpgz 1/1 Running 0 8s ### (2)删除Pod \[root@k8s-master \~\]# ku delete pod nginx-bmsx8 -n default pod "nginx-bmsx8" deleted \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE nginx-9hbr6 1/1 Running 0 4s nginx-brpgz 1/1 Running 0 12m ### (3)删除replicationcontroller \[root@k8s-master \~\]# ku delete -f replicationcontroller-nginx.yaml replicationcontroller "nginx" deleted ## 二、ReplicaSet ReplicaSet (复制集,RS)基于集合的标签选择器的下一代Replication Controller,用于Deployment协调创建,删除和更新。ReplicaSet支持标签选择器,建议使用Deployment自动管理ReplicaSet。 标签是用来标识k8s对象的一组附加在其上的一组键值对,通过标签筛选和排除一组对象。 标签选择器用来选择一组对(标签并不能表示唯一一个对象) 标签选择器 标签定义的方式: 基于等式的定义: app=nginx 基于键值对定义方式: app : nginx 基于集合标签定义方式: {key : app,operator:in,values:\[nginx,apache\]} ### (1)编辑ReplicaSet文件 > \[root@k8s-master \~\]# vim replicaset-example.yaml > > apiVersion: apps/v1 > > kind: ReplicaSet > > metadata: > > name: frontend > > labels: > > app: guestbook > > tier: frontend > > spec: > > # modify replicas according to your case > > replicas: 3 > > selector: > > matchLabels: > > tier: frontend > > matchExpressions: > > - {key: tier, operator: In, values: \[frontend\]} > > template: > > metadata: > > labels: > > app: guestbook > > tier: frontend > > spec: > > containers: > > - name: php-redis > > image: nginx:1.7.9 > > resources: > requests: > cpu: 100m > memory: 100Mi > > env: > > - name: GET_HOSTS_FROM > > value: dns > > # If your cluster config does not include a dns service, then to > > # instead access environment variables to find service host > > # info, comment out the 'value: dns' line above, and uncomment the > > # line below. > > # value: env > > ports: > > - containerPort: 80 备注: requests:请求资源限制,分配资源必须达到此要求 limits:最多可以请求多少资源 单位m:cpu计量单位是毫核(m)。一个节点cpu核心数量乘以1000,得到总结点cpu数量。如:一个节点有两核,那么该节点cpu总和量为2000m,该容器启动时为100/2000核心(5%)。 ### (2)创建RS \[root@k8s-master \~\]# ku create -f replicaset-example.yaml replicaset.apps/frontend created ### (3)查看Pod \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE frontend-8dv56 1/1 Running 0 8s frontend-d6d82 1/1 Running 0 8s frontend-dzmgf 1/1 Running 0 8s ### (4)删除RS \[root@k8s-master \~\]# ku delete -f replicaset-example.yaml replicaset.apps "frontend" deleted ## 三、无状态应用管理Deployment 无状态服务(stateless service)单次进行请求处理,不依赖其他请求。Deployment用来管理RS,为Pod和RS提供声明性更新,以及其他功能,生产环境中使用Deployment替代RS。 > \[root@k8s-master \~\]# vim nginx-deployment.yaml > > apiVersion: apps/v1 > > kind: Deployment > > metadata: > > name: nginx-deployment > > labels: > > name: nginx-deployment > > spec: > > replicas: 2 > > selector: > > matchLabels: > > app: nginx > > template: > > metadata: > > labels: > > app: nginx > > spec: > > containers: > > - name: nginx > > image: nginx:1.7.9 > > ports: > > - name: nginx > > containerPort: 80 ### (1)创建Deployment \[root@k8s-master \~\]# ku create -f nginx-deployment.yaml deployment.apps/nginx-deployment created \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE nginx-deployment-6cf9b75cdd-56qzm 1/1 Running 0 9s nginx-deployment-6cf9b75cdd-sxs5t 1/1 Running 0 9s ### (2)更新Deployment \[root@k8s-master \~\]# ku set image deployment nginx-deployment nginx=nginx:1.9.1 --record Flag --record has been deprecated, --record will be removed in the future \[root@k8s-master \~\]# ku set image deployment nginx-deployment nginx=nginx:1.12.1 --record Flag --record has been deprecated, --record will be removed in the future deployment.apps/nginx-deployment image updated ### (3)查看更新 \[root@k8s-master \~\]# ku rollout status deployment.v1.apps/nginx-deployment deployment "nginx-deployment" successfully rolled out \[root@k8s-master \~\]# ku get rs NAME DESIRED CURRENT READY AGE nginx-deployment-55bbd8478b 2 2 2 6m50s nginx-deployment-6cf9b75cdd 0 0 0 11m nginx-deployment-7569c477b6 0 0 0 7m14s \[root@k8s-master \~\]# ku describe deploy nginx-deployment (查看详细信息) ### (4)回滚更新 \[root@k8s-master \~\]# ku set image deployment nginx-deployment nginx=dotbalo/canary:v1 --record Flag --record has been deprecated, --record will be removed in the future deployment.apps/nginx-deployment image updated \[root@k8s-master \~\]# ku set image deployment nginx-deployment nginx=dotbalo/canary:v3 --record Flag --record has been deprecated, --record will be removed in the future deployment.apps/nginx-deployment image updated ### (5)查看历史版本 \[root@k8s-master \~\]# ku rollout history deployment/nginx-deployment deployment.apps/nginx-deployment REVISION CHANGE-CAUSE 1 \ 2 kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record=true 3 kubectl set image deployment nginx-deployment nginx=nginx:1.12.1 --record=true 4 kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v1 --record=true 5 kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v3 --record=true ### (6)查看某次更新详情 \[root@k8s-master \~\]# ku rollout history deployment/nginx-deployment --revision=3 deployment.apps/nginx-deployment with revision #3 Pod Template: Labels: app=nginx pod-template-hash=55bbd8478b Annotations: kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=nginx:1.12.1 --record=true Containers: nginx: Image: nginx:1.12.1 Port: 80/TCP Host Port: 0/TCP Environment: \ Mounts: \ Volumes: \ ### (7)回滚到指定版本 \[root@k8s-master \~\]# ku rollout undo deployment/nginx-deployment --to-revision=1 \[root@k8s-master \~\]# ku rollout history deployment/nginx-deployment (查看) \[root@k8s-master \~\]#ku rollout undo deployment/nginx-deployment (回滚到上次版本) ### (8)扩容Deployment \[root@k8s-master \~\]# ku scale deployment.v1.apps/nginx-deployment --replicas=6 deployment.apps/nginx-deployment scaled \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE nginx-deployment-5985c475f6-94jf7 1/1 Running 0 8s nginx-deployment-5985c475f6-rvj95 1/1 Running 0 8s nginx-deployment-5985c475f6-tzhk4 1/1 Running 0 16m nginx-deployment-5985c475f6-vlvcv 1/1 Running 0 8s nginx-deployment-86d6564694-4tsbm 0/1 ImagePullBackOff 0 16m nginx-deployment-86d6564694-f7qps 0/1 ContainerCreating 0 8s nginx-deployment-86d6564694-gpfrp 0/1 ContainerCreating 0 8s nginx-deployment-86d6564694-lpdlg 0/1 ContainerCreating 0 8s ### (9)暂停恢复更新 \[root@k8s-master \~\]# ku rollout pause deployment/nginx-deployment (暂停更新) deployment.apps/nginx-deployment paused \[root@k8s-master \~\]# ku rollout resume deployment/nginx-deployment (恢复更新) deployment.apps/nginx-deployment resumed ### (10)删除Deployment \[root@k8s-master \~\]# ku delete -f nginx-deployment.yaml deployment.apps "nginx-deployment" deleted ## 四、有状态应用管理 StatefulSet StatefulSet(有状态集,sts)用于部署有状态且有序启动应用程序。 > \[root@k8s-master \~\]# cat redis-statefulset.yaml > > apiVersion: v1 > > kind: Service > > metadata: > > name: redis-svc > > spec: > > selector: > > app: redis-sts > > ports: > > - port: 6379 > > protocol: TCP > > targetPort: 6379 > > apiVersion: apps/v1 > > kind: StatefulSet > > metadata: > > name: redis-sts > > spec: > > serviceName: redis-svc > > replicas: 2 > > selector: > > matchLabels: > > app: redis-sts > > template: > > metadata: > > labels: > > app: redis-sts > > spec: > > containers: > > - image: redis:5-alpine > > name: redis > > ports: > > - containerPort: 6379 备注: kind:service 定义一个名字为reids-svc kind:statefulSet 定义名字为redis-sts的statefulset,replicas表示pod副本数。 ### (1)创建sts \[root@k8s-master \~\]# ku create -f redis-statefulset.yaml statefulset.apps/redis-sts created ### (2)查看sts状态 \[root@k8s-master \~\]# ku get sts NAME READY AGE redis-sts 2/2 28s \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE redis-sts-0 1/1 Running 0 30s redis-sts-1 1/1 Running 0 20s 备注: 序号越小,创建时间越早,从AGE列可以看出,解决有状态启动顺序问题,例如,可以使redis-sts-0作为主节点,redis-sts-1作为从节点。 ### (3)sts扩缩容 \[root@k8s-master \~\]# ku scale sts redis-sts --replicas=3 (扩容) statefulset.apps/redis-sts scaled \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE redis-sts-0 1/1 Running 0 9m54s redis-sts-1 1/1 Running 0 9m44s redis-sts-2 1/1 Running 0 7s \[root@k8s-master \~\]# ku scale sts redis-sts --replicas=2 (缩容) statefulset.apps/redis-sts scaled \[root@k8s-master \~\]# ku get pod NAME READY STATUS RESTARTS AGE redis-sts-0 1/1 Running 0 10m redis-sts-1 1/1 Running 0 10m ### (4)非级联删除 删除sts有两种方式:级联删除和非级联删除 使用非级联方式删除 statefulset 时,statefulSet 的 Pod 不会被删除。使用级联方式删除statefulSet 时,statefulSet 和它的 Pod 都会被删除。 \[root@k8s-master \~\]# kubectl delete statefulsetredis-sts--cascade=false 采用非级联删除 \[root@k8s-master \~\]# kubectl get sts 查看 \[root@k8s-master \~\]# kubectl get pod 查看管理的 pod发现 pod 并没有被删除 \[root@k8s-master \~\]# kubectl delete po redis-sts-0 删除 pod \[root@k8s-master \~\]# kubectl delete po redis-sts-1 ### (5)级联删除 \[root@k8s-master \~\]# kubectl create -f redis-statefulset.yaml (先创建出 statefulset) 备注: 如果提示服务已存在,先删除kubectl delete -f redis-statefulset.yaml \[root@k8s-master \~\]# kubectl delete statefulset redis-sts (级联删除) \[root@k8s-master \~\]# ku get pod (查看pod,则pod全部删除) \[root@k8s-master \~\]# ku delete -f redis-statefulset.yaml (删除redis) ## 五、守护进程集 DaemonSet daemonset(守护进程集,缩写为ds)和守护进程类似,确保全部节点上运行一个Pod副本,当新的节点加入时,也会新增一个Pod;当节点移除时,Pod会被回收,删除daemonset会删除所有Pod。 > \[root@k8s-master \~\]# vim daemonset-nginx.yaml > > apiVersion: apps/v1 > > kind: DaemonSet > > metadata: > > name: pod-controller > > namespace: dev > > labels: > > controller: daemonset > > spec: > > selector: > > matchLabels: > > app: nginx-pod > > template: > > metadata: > > labels: > > app: nginx-pod > > spec: > > containers: > > - name: nginx > > image: nginx:1.7.9 > > ports: > > - name: nginx-port > > containerPort: 80 > > protocol: TCP ### (1)创建daemonset \[root@k8s-master \~\]# ku create namespace dev namespace/dev created \[root@k8s-master \~\]# ku create -f daemonset-nginx.yaml daemonset.apps/pod-controller created ### (2)查看daemonset \[root@k8s-master \~\]# ku get ds -n dev -o wide ### (3)查看所在节点 \[root@k8s-master \~\]# ku get pod -n dev -o wide ### (4)删除 DaemonSet \[root@k8s-master \~\]# kubectl delete ds pod-controller -n dev ## 六、计划任务CronJob cronjob (计划任务,缩写为 cj) 用于以时间为基准的周期性地执行任务,这些自动化任务和运行在 Linux系统上的 CronJob 一样。 > \[root@k8s-master \~\]# cat cronjob-example.yaml > > apiVersion: batch/v1 #1.21版本以上 改为batch/v1 > > kind: CronJob > > metadata: > > name: hello > > spec: > > schedule: "\*/1 \* \* \* \*" > > jobTemplate: > > spec: > > template: > > spec: > > containers: > > - name: hello > > image: busybox:v1 > > args: > > - /bin/sh > > - -c > > - date; echo Hello from the Kubernetes cluster > > restartPolicy: OnFailure ### (1)创建 Cronjob \[root@k8s-master \~\]# kubectl create -f cronjob-example.yaml ### (2)查看 \[root@k8s-master \~\]# kubectl get cj 等待一会后可以查看生成的 pod ### (3)查看pod,并生成日志 \[root@k8s-master \~\]# kubectl get jobs \[root@k8s-master \~\]# kubectl get pod 查看生成的 pod \[root@k8s-master \~\]# kubectl logs -f hel1o-27743522-crnf8 查看 pod 的执行日志 ### (4)删除 \[root@k8s-master \~\]# ku delete cronjob hello

相关推荐
Cynthia的梦10 分钟前
Linux学习-Linux进程间通信(IPC)聊天程序实践指南
linux·运维·学习
卡戎-caryon16 分钟前
【Linux网络与网络编程】03.UDP Socket编程
linux·服务器·网络·笔记·单例模式·udp·网络通信
張萠飛32 分钟前
Linux的TCP连接数到达2万,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出现什么问题
linux·网络·tcp/ip
孙同学_1 小时前
【Linux篇】自主Shell命令行解释器
android·linux
敲上瘾1 小时前
高并发内存池(二):Central Cache的实现
linux·服务器·c++·缓存·哈希算法
一只努力学习的Cat.2 小时前
Linux:环境变量
linux
安顾里2 小时前
Linux命令-tar
linux·运维·服务器
云上艺旅2 小时前
K8S学习之基础六十九:Rancher创建svc资源
学习·云原生·容器·kubernetes·rancher
沐土Arvin2 小时前
Nginx 核心配置详解与性能优化最佳实践
运维·开发语言·前端·nginx·性能优化
有莘不破呀2 小时前
服务器磁盘卷组缓存cache设置介绍
linux·运维·服务器