6. kubernetes pod控制器

6. kubernetes pod控制器

[TOC]

本文基于马哥的docker和k8s视频总结, 在此致谢马哥.

Pod控制器类型

  • ReplicaSet(创建并保持指定数量的pod副本, 支持动态扩缩容和滚动更新)
    • 用户期望的副本数
    • 标签选择器
    • pod资源模板
  • Deployment (建构在ReplicaSet之上, 用来管理无状态应用)
  • DaemonSet (节点级控制器, 确保集群中满足条件的每个节点只运行一个特定pod副本)
  • Job (执行一次性的作业, 确保任务是正常完成而不是异常退出)
  • CronJob (周期性运行作业)
  • StatefulSet (管理有状态应用且每个应用, 每个pod副本都被单独管理)

ReplicaSet

使用rs示例

生产环境中千万不可随意给pod打标签, 否则有标签重叠时k8s集群可能会随机杀掉正在服务的pod !

kubectl explain rs
apiVersion: app/v1
kind: ReplicaSet
metadata:
    name: myapp
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels: # 通过selector, 选择标签为app, 值为myapp且标签为release, 值为canary的pod
            app: myapp
            release: canary
    template: # 定义创建pod的模板
        metadata: # 此处指定的是创建出来的pod的元数据
            name: myapp-pod # 此处定义的pod名其实没什么用
            labels: # 由template中定义的标签一定要符合selector中定义的标准, 否则会一直创建
                app: myapp
                release: canary
                enviroment: qa
        spec: # 此处指定的是创建出来的pod的spec
            containers: 
            - name: myapp-container
                image: nginx:1.14-alpine
                imagePullPolicy: IfNotPresent # 默认值就是IfNotPresent, 此处可省略
                ports:
                - name: http
                    containerPort: 80
                - name: https
                    containerPort: 443
kubectl create -f replicaset-demo.yml
# 支持动态扩展和滚动更新 (但滚动更新需要手动重启pod)
kubectl edit rs myapp
    # 将replicas的值修改为5, 即可实现动态扩容(k8s集群会帮你自动去创建新的3个pod)
    # 将image的值改为更高版本, pod所使用的的镜像会更新, 但是pod需要被重启才会使用新的镜像版本

Deployment

能提供滚动式自定义自控制的更新:

Deployment.png
Deployment与replicaSet的关系.png

能控制更新节奏和更新逻辑: 允许最多(少)存在几个pod和同时更新几个pod

更新时做readiness特别重要 !!! 因为未ready的不能算更新好.

使用Deployment示例

kubectl explain deploy
apiVersion: apps/v1
kind: Deployment
metadata:
    name: myapp-deploy
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels: 
            app: myapp
            release: canary
    template:
        metadata:
            labels:
                app: myapp
                release: canary
        spec:
          containers:
            - name: myapp-container
                image: nginx:1.14-alpine
                imagePullPolicy: IfNotPresent
                ports:
                - name: http
                    containerPort: 80
                - name: https
                    containerPort: 443
kubectl apply -f deploy-demo.yml # 声明式创建(即能创建, 亦能更新)

kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
myapp-deploy   2/2     2            2           11s

kubectl get rs # 可以发现有rs被创建, 说明Deployment是基于repolicaSet的
NAME                     DESIRED   CURRENT   READY   AGE
myapp-deploy-fc645b99f   2         2         2       21s
    # myapp-deploy-fc645b99f <==> Deployment_name-模板(即deploy-demo.yml)的哈希值

动态扩展

  • Deployment在实现更新应用时, 可直接编辑记配置文件实现:
# 1. 编辑配置文件deploy-demo.yml, 将replicas值改为3

# 2. 再次应用配置文件deploy-demo.yml
kubectl apply -f deploy-demp.yml # apply可以使用多次

# 3. 每次版本变化都会显示在Annotations的值中
kubectl describe deploy myapp-deploy

滚动更新与回退

# 1. 编辑配置文件deploy-demo.yml, 将image的值改为nginx:1.15-alpine

# 2. 再次应用
kubectl apply -f deploy-demp.yml

# 3. 查看滚动更新时状态信息
kubectl get pods -l app=myapp -w

# 4. 显示历史版本信息, 可用于版本回退 (旧版本模板会被保留, 随时等待回退)
kubectl get rs -o wide

# 5. 查看滚动历史
kubectl rollout history deployment myapp-deploy

# 5.5. 若新版有问题, 可回退到上一版本
kubectl rollout undo deployment myapp-deploy

# 6. 也可使用打补丁的方式更新
kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
    # -p选项后使用JSON格式数组指明打的补丁, 键需要用引号引起来

更复杂的更新

# 方法一: 打补丁
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

# 方法二: 直接交互式编辑
kubectl edit deploy myapp-deploy
  • 可以做到更新版本时只更新其中一个, 然后暂停更新 ==> 金丝雀发布:
# 1. 
kubectl set image deployment myapp-deploy myapp-container=nginx:1.15-alpine && kubectl rollout pause deployment myapp-deploy

# 2. 监视更新过程
kubectl get pods -l app=myapp -w
kubectl rollout status deployment myapp-deploy

# 3. 若更新没问题, 可以继续更新
kubectl rollout resume deployment myapp-deploy

# 4. 此时也可以看到版本迭代
kubectl get rs -o wide

# 5. 可回滚到指定版本
kubectl rollout undo deployment myapp-deploy --to-revision=1

DaementSet

使用ds示例

kubectl explain ds
apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis
    namespace: default
spec:
    replicas: 1
    selector:
        matchLabels:
            app: redis
            role: logstore
    template:
        metadata:
            labels:
                app: redis
                role: logstore
        spec:
            containers:
            - name: redis
                image: redis:4.0-alpine
                imagePullPolicy: IfNotPresent
                ports:
                - name: redis
                    containerPort: 6379
                    protocol: TCP
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
    name: filebeat-ds
    namespace: default
spec:
    selector:
        matchLabels:
            app: filebeat
            release: stable
    template:
        metadata:
            label:
                app: filebeat
                release: stable
        spec:
            containers:
            - name: filebeat-container
                image: filebeat:5.6.5-alpine
                imagePullPolicy: IfNotPresent
                env: # 可以在容器创建时传入环境变量
                - name: REDIS_HOST
                    value: redis.default.svc.cluster.local # 各pod之间通过service的主机名互相调用, 通信
                - name: REDIS_LOG_LEVEL
                    value: info
kubectl apply -f ds-demo.yml
  • DaemonSet也支持滚动更新: kubectl set image -h
kubectl set image ds filebeat-ds filebeat:5.6.6-alpine 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容