kubernetes 控制器详解【持续完善中】
资源创建详解
一:Pod及常用参数
1.简介
2.模板
3.删除pod
示例流程如下:
- 用户发送删除pod的命令,默认宽限期是30秒;
- 在Pod超过该宽限期后API server就会更新Pod的状态为“dead”;
- 在客户端命令行上显示的Pod状态为“terminating”;
- 跟第三步同时,当kubelet发现pod被标记为“terminating”状态时,开始停止pod进程:
- 如果在pod中定义了preStop hook,在停止pod前会被调用。如果在宽限期过后,preStop hook依然在运行,第二步会再增加2秒的宽限期;
- 向Pod中的进程发送TERM信号;
- 跟第三步同时,该Pod将从该service的端点列表中删除,不再是replication controller的一部分。关闭的慢的pod将继续处理load balancer转发的流量;
- 过了宽限期后,将向Pod中依然运行的进程发送SIGKILL信号而杀掉进程。
- Kublete会在API server中完成Pod的的删除,通过将优雅周期设置为0(立即删除)。Pod在API中消失,并且在客户端也不可见。
3.1.默认删除
默认删除,会按照上线的流程,等待宽限期30s
kubectl delete POD --namespace=xxx
3.2.强制删除
设置宽限期为0,会立即删除,没有宽限期
kubectl delete POD --namespace=xxx --force --grace-period=0
4.设置Pod主机名
template.spec.hostname:pod_name      设置pod的主机名
5.镜像拉取策略(ImagePullPolicy)
ImagePullPolicy:
- Always: 不管镜像是否存在,都会拉取
- Never:不管镜像是否存在,都不会拉取
- IfNotPresent:只有当镜像不存在的时候才会进行拉取
注意:
- 默认为IfNotPresent,但:latest标签的镜像默认为Always。
- 拉取镜像时docker会进行校验,如果镜像中的MD5码没有变,则不会拉取镜像数据。
- 生产环境中应该尽量避免使用:latest标签,而开发环境中可以借助:latest标签自动拉取最新的镜像。
二:RC
1.简介
2.模板
apiVersion: v1
kind: ReplicationController	# 定义资源类型
metadata:
  name: zabbix-db
  namespace: zabbix
spec:
  replicas: 1
  selector:
    app: zabbix-db
  template:
    metadata:
      name: zabbix-db
      labels:
        app: zabbix-db
    spec:
      terminationGracePeriodSeconds: 30 # 容器平滑退出时间,默认30s
      hostname: zabbix-db # 设置容器的主机名
      containers:
      - name: zabbix-db
        image: mysql:5.7.22
        env:
        - name: MYSQL_DATABASE
          value: zabbix
        - name: MYSQL_USER
          value: zabbix
        - name: MYSQL_PASSWORD
          value: zabbix
        - name: MYSQL_ROOT_PASSWORD
          value: Abc123@
        ports:
        - containerPort: 3306
        volumeMounts:
        - mountPath: /var/lib/mysql
          readOnly: false
          name: zabbix-database
      volumes:
      - name: zabbix-database
        nfs:
          server: 172.30.80.222
          path: "/data/zabbix/zabbix_db/mysql"
三:Deployment
1.简介
 Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。比于RC,Deployment直接使用kubectl edit deployment/deploymentName 或者kubectl set方法就可以直接升级(原理是Pod的template发生变化,例如更新label、更新镜像版本等操作会触发Deployment的滚动升级)。
2.模板
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  minReadySeconds: 30	# 滚动升级时,容器准备就绪时间最少为30s
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:	# 当type为RollingUpdate时,才会进行设置
      maxSurge: 25%	# 当定义为25%时,容器会先新建百分之25的pod,然后开始滚动升级
      maxUnavailable: 25%	# 每次升级的百分比,也可以是绝对数(5),默认值25%
    type: RollingUpdate	# 滚动升级方式,有Recreate:立马关闭所有pod进行升级,RollingUpdate:采用百分比的方式滚动升级
  template:		# 模板
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        resources:	# 资源限制
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        env:	# 设置变量
        - name: DB_SERVER_HOST
          value: zabbix-db-server
        - name: MYSQL_DATABASE
          value: zabbix
        - name: MYSQL_USER
          value: zabbix
        - name: MYSQL_PASSWORD
          value: zabbix
        - name: MYSQL_ROOT_PASSWORD
          value: Abc123@
        - name: ZBX_HISTORYSTORAGEURL
          value: http://192.168.2.171:9200
        - name: ZBX_HISTORYSTORAGETYPES
          value: uint,dbl,str,log,text
        ports:
        - containerPort: 80
       	livenessProbe:	#livenessProbe是K8S认为该pod是存活的,不存在则需要kill掉,然后再新启动一个,以达到RS指定的个数。
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:	#readinessProbe是K8S认为该pod是启动成功的,这里根据每个应用的特性,自己去判断,可以执行command,也可以进行httpGet。
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
          successThreshold: 1
        restartPolicy: Always	# 启动失败时,会重试启动
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  sessionAffinity: ClientIP
  selector:
    app: nginx
  ports:
    # 将容器的80端口映射到master主机的8888端口
    - port: 80	# pod端口
      nodePort: 8888	# 宿主机上的端口
四:HPA
1.简介
 Horizontal Pod Autoscaler根据观察到的CPU利用率自动调整复制控制器,部署或副本集中的容器数量(或者,通过 自定义指标 支持,根据其他一些应用程序提供的指标)。请注意,Horizontal Pod Autoscaling不适用于无法缩放的对象,例如DaemonSet。
2.模板
创建一个pod,必须添加资源请求和限制参数
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  minReadySeconds: 30
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        resources:
          requests:		# 在使用HPA自动扩展时,必须使用资源请求和资源限制
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  sessionAffinity: ClientIP
  selector:
    app: nginx
  ports:
    # 将容器的80端口映射到master主机的8888端口
    - port: 80
      nodePort: 8888
创建HPA
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler	# 指定对象类型
metadata:
  name: nginx-hpa	# 名字
  labels:	# 标签
    app: hpa
    version: v0.0.1
spec:
  scaleTargetRef:
    apiVersion: v1
    kind: Deployment
    name: nginx	# 创建Deployment时,指定的名字
  minReplicas: 1	# 最小pod
  maxReplicas: 10	# 最大pod
  targetCPUUtilizationPercentage: 70	# CPU用到70%,自动扩展一个pod
查看
# kubectl get hpa
NAME        REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx   0% / 70%   1         10        1          4d
查看详情
# kubectl describe hpa/nginx-hpa
Name:                                                  nginx-hpa
Namespace:                                             default
Labels:                                                app=hpa
                                                       version=v0.0.1
Annotations:                                           <none>
CreationTimestamp:                                     Thu, 02 Aug 2018 16:39:55 +0800
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  0% (0) / 70%
Min replicas:                                          1
Max replicas:                                          10
Conditions:
  Type            Status  Reason            Message
  ----            ------  ------            -------
  AbleToScale     True    ReadyForNewScale  the last scale time was sufficiently old as to warrant a new scale
  ScalingActive   True    ValidMetricFound  the HPA was able to succesfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  True    TooFewReplicas    the desired replica count was less than the minimum replica count
Events:           <none>
五:StatefulSet
1.简介
2.模板
2.1.基础环境介绍
| StatefulSet Name | Service Name | |
|---|---|---|
apiVersion: v1
kind: Service
metadata:
  name: zoo01
  labels:
    app: zoo01
spec:
  ports:
  - port: 2888
    name: leader-listen
  - port: 3888
    name: leader-vote
  clusterIP: None
  selector:
    app: zoo01
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: zoo01
  labels:
    app: zoo01
spec:
  serviceName: "zoo01-service"
  replicas: 1
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: zoo01
    spec:
      terminationGracePeriodSeconds: 30
      hostname: zoo01
      containers:
      - name: zoo01
        image: zookeeper:3.5
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        env:
          - name: ZOO_MY_ID
            value: "1"
          - name: ZOO_SERVERS
            value: "server.1=zoo01:2888:3888 server.2=zoo02:2888:3888 server.3=zoo03:2888:3888"
        ports:
          - containerPort: 2181
          - containerPort: 2888
          - containerPort: 3888
      restartPolicy: Always
六:PV和PVC
PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv
  namespace: dev
spec:
  capacity:
    storage: 10Gi	# 大小
  accessModes:
    - ReadWriteOnce	# 读写模式
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:	# 挂载选项
    - hard
    - nfsvers=4.1
  nfs:	# nfs服务器地址
    path: /data/gitlab
    server: 172.30.80.222
PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gitlab-pvc
  namespace: dev
  labels:
    type: nfs
spec:
  accessModes:
    - ReadWriteOnce	# PV和PVC的绑定关系,主要依靠读写模式和存储大小
  storageClassName: slow
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      name: gitlab-pv
Pod
八:扩展
8.1.Pod调度到指定的Node
介绍:
 Pod.spec.nodeSelector通过kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后调度Pod到目标节点,该匹配规则属于强制约束。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: zabbix-server
  namespace: zabbix
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zabbix-server
  template:
    metadata:
      name: zabbix-server
      labels:
        app: zabbix-server
    spec:
      nodeSelector:	# 基于node的lable进行调度
        kubernetes.io/hostname: 172.30.80.220	# 指定主机的lable标签
      containers:
      - name: zabbix-server
        image: zabbix/zabbix-server-mysql:latest
        env:
        - name: DB_SERVER_HOST
          value: zabbix-db-server
        - name: MYSQL_DATABASE
          value: zabbix
        - name: MYSQL_USER
          value: zabbix
        - name: MYSQL_PASSWORD
          value: zabbix
        - name: MYSQL_ROOT_PASSWORD
          value: Abc123@
        - name: ZBX_HISTORYSTORAGEURL
          value: http://192.168.2.171:9200
        - name: ZBX_HISTORYSTORAGETYPES
          value: uint,dbl,str,log,text
        ports:
        - containerPort: 10051
kubernetes 控制器详解【持续完善中】的更多相关文章
- PHP编译参数configure配置详解(持续更新中)
		编译参数-使用 ./configure -h在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释 编译参数-说明 --prefix=/opt/php //指定 php 安装目录--with-a ... 
- 2018年最新Java面试题及答案整理(持续完善中…)
		2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ... 
- SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解
		SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC 6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ... 
- 详解 Go 语言中的 time.Duration 类型
		swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ... 
- 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
		详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html 实例: ... 
- 详解jquery插件中(function ( $, window, document, undefined )的作用。
		1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ... 
- linux 命令学习(持续完善中...)
		linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ... 
- zz详解深度学习中的Normalization,BN/LN/WN
		详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ... 
- [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
		[转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ... 
随机推荐
- nextjs:如何将静态资源发布到 CDN
			nextjs 是基于 react 的服务端同构指出框架,在使用的过程中也多多少少遇到过几个问题,其中最大的问题就是静态资源的发布了. 1. 如何基于文件内容进行 hash 命名 Next.js use ... 
- 讲真,MySQL索引优化看这篇文章就够了
			本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ... 
- oracle 分区表(子分区)收缩笔记
			思路1.首先移动子分区到别的表空间.2.收缩数据文件.3.再把子分区移回原表空间. ---------------------------------------------生成发送报告移动子分区语句 ... 
- Orleans 知多少 | 3. Hello Orleans
			1. 引言 是的,Orleans v3.0.0 已经发布了,并已经完全支持 .NET Core 3.0. 所以,Orleans 系列是时候继续了,抱歉,让大家久等了. 万丈高楼平地起,这一节我们就先来 ... 
- 玩转ArduinoJson库 V5版本
			1.前言 一直以来,博主的事例代码中都一直使用到JSON数据格式.而很多初学者一直对JSON格式有很大疑惑,所以博主特意分出一篇博文来重点讲解Arduino平台下的JSON库--Arduino ... 
- 解决js计算0.1+0.2 !==0.3
			经常做用js数据运算的同学应该了解,在js中,0.1+0.2不会等于0.3,而是等于: 我一开始发现这个bug的时候也觉得很奇怪,那怎么去解决这个bug,让0.1+0.2 最后能得到0.3呢? 方法一 ... 
- JAVA NIO udp 实现 群转发
			场景很简单,就是多个客户端通过udp,连接到服务器(其实是无连接的,就是服务器保存了客户端的ip信息).然后通过udp协议先服务器发送消息,然后服务器在通过udp转发在各个客服端. 这个是不是 观察者 ... 
- day05整理
			目录 一.上节课回顾 (一)数据类型 (1)数字类型 (2)字符串类型str (3)列表类型list (4)字典类型dict (二)jieba模块 (三)wordcloud模块 二.文本处理 (一)什 ... 
- UnityWebRequest_ZT
			using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ... 
- float使用0xFF
			1. float f = 0xFFFFFFFF; 这一句完全是错误的用法,它不会使f变量内存变为4个0xFF,因为0xFFFFFFFF根本就不是有效的float数值,编译器无从处理,如果用printf ... 
