kubeernetes

pod

最小应用部署单元 即应用
pod 需要定义什么 ( 带* 为必填项)

元数据 *
	pod名称 *
	所属namespaces *
	标签  可用于 svc 识别 *
	注释信息 *
规格 *
	调度
	-  容器名称 containers *
		使用镜像  *
		镜像拉取方式 *
		执行参数
		启动参数
		挂载卷使用 对应到容器 目录
		开放端口
		环境变量
		资源配额
		健康检查
	指定挂载卷 硬盘资源
	容忍
	dns策略
	主机模式
	重启策略
pod yaml 范例
apiVersion: v1
kind: Pod
metadata:
  name: test-pod						# pod名称                                       
  namespaces: default					# 所属命名空间
  labels:								# pod 标签列表
    app: test							# 添加标签 (key-value)
    ……
  annotations:                          # 注释 列表
    app: test							# 添加注释                                      (key-value)
    ……
spec:									# 规格
  nodeSelector:							# 表示将该Pod调度到包含这个label的node上
    nodelabel: node2					# 调度node的标签
  containers:                           # 容器规格
  - name: test                          # 容器名称(pod可有多个容器)     (string)	# 以下为这个containers 的配置
    image: nginx                        # 使用镜像源                    (镜像源)
    imagePullPoilcy: {always| Never | ifNotPresent}
										 #镜像拉取方式(always Never ifNotPresent)
# 启动命令 ----------------------------------------
    command:                            # dockers启动后执行命令
    - /bin/sh
    - c
    - sleep 3600                        # 执行命令
# 启动参数 ----------------------------------------
    args:                               # 容器启动 参数列表
    - ["HOSTNAME", "KUBERNETES_PORT"]   # 容器启动参数
    workingdir: /                       # 容器工作目录 linux 目录
# 容器挂载 ----------------------------------------
    volumeMounts:                       # 挂载存储配置
    - name: disk1                       # 挂载存储卷名称
      mountPath:                        # 存储卷挂载位置 绝对路径
      readonly: {true|false}    		# 是否只读 {true|false}
# 开放端口 ----------------------------------------
    ports:                              # 容器需要暴漏的端口号列表
    - name: http                        # port名称
      containerPort: 80         		# 监听端口号使用podip可以访问 int
      hostPort: 80                      # 容器将服务映射到宿主机端口 #端口号 int
      protocol: {tcp|udp}       		# 端口协议                              # {tcp | udp}
    - name ……
# 环境变量 ----------------------------------------
    env:
    - name: path						# 环境变量名称 string
      value: xxx						# 环境变量值 string
#---
    - name: configmap                   # 可使用configmap传入变量
      valueFrom:
        configMapKeyRef:
          name: test-cm         		# 使用 test-cm configmap
          key: test-cm-testvkey 		#使用test-cm 中的test-cm-testvkey值
# 资源限制 ----------------------------------------
    resources:							# 使用资源限制  (limits 大于 requests)
#---
      limits:							# 封顶资源限制
        cpu: "1"						# CPU 限制1 核
        memory: 1Gi						# 内存限制 512M  #单位Gi Mi
#----------------------------------------
      requests:							# 请求资源
        cpu: "1"						# CPU 限制0.5 核
        memory: 512M					# 内存限制 512M  #单位Gi Mi
# 健康检查 ----------------------------------------
    readlinessProbe:					# 健康检查 *
#----
      exec:								# 命令脚本方式
        command:
        - cat
        - /tmp/health                   # 命令执行返回结果为失败判定为不健康
#----
      tcpSocket:						# 端口健康检测方式
        port: 80						# 检测tcp80端口 如果为开启 为不健康
#----
      httpGet:							 # http请求方式
        path: /
        port: 80						# http请求 容器地址:port+path 返回状态码结果200~399 为健康
#----
      initialDelaySeconds:              # 初始检测延迟秒数
      timeoutSeconds: 1         		# 超时秒数 返回结果超时认为不健康
      periodSeconds: 10                 # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
# 挂在目录 ----------------------------------------
volumes:                                # 设定存储卷 三种模式
#---
  - name: tmp                   		# 存储卷名称(emptydir模式)临时目录
    emptyDir: {}						# 使用临时存储  容器 重启会数据清空
#---
  - name: host_path						# 存储卷名称 (hostpath模式)宿主机文件存储
    hostPath:							# 使用宿主机文件模式 挂载目录=宿主机目录
      path: "/disk1"					# 挂在宿主机目录地址
#---
  - name: nfs							# nfs模式 使用nfs服务器 存储资源
    nfs:
      server: 192.168.1.1               #指定nfs url
    persistenVolumeClaim:
      claimName: pvc1					# 已经申请好了的PVC
#---
  - name: cm 							# 存储卷名称 (configmap模式)
    configMap:							# 使用configmap模式
    items:
    - key:                              # 使用configmap key
      path:                             # 挂载路径
  dnsPolicy: {default|clusterFirst|clusterFirstwithHostNet|node 
  										# 查304页
  hostnetwork: {true|false}				# 网络模式
  restartPolicy: {Always|Never}			# 重启策略
# 容忍 ----------------------------------------
  tolerations:
  - key: "节点污点key"
    operator: "Equal"
    value: "节点污点value"
    effect: "NoExecute"
    tolerationSeconds: 3600

控制器

  • 控制器: kubernetes控制器 由 deployment statefulset replicaset cronjob daemonset 这几种对象组成 是用于创建和管理pod的k8s对象
replicaset
  • 概念: 早期k8s 用来控制pod 的一个对象 现在已经不在直接使用,作为deployment 版本控制的一个组件
deployment daemon
  • 概念: deployment 是一个pod 控制器 可以由设定好的 pod模板创建pod 并保证 可用 pod 副本数维持载一定数量
    创建pod 为 {deployment名称-rs号-随机码}
  • 特点: deployment 创建或修改时会生成一个新的 replicaset副本集 然后将旧的副本集 的副本数量 由滚动升级策略设置规则进行减少 新副本集数量增加 从而达到滚动更新的目的

k8s deployment 需要定义什么

deployment 名称
所属namespaces
标签
注释
副本数
滚动升级策略
调度规则
pod模板
deployment yaml范例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-tets		# 名称
  namespace: default		# 命名空间
  generation: 1				# 保存历史副本数
  labels:					# 标签
    app: nginx
  annotations:				# 注释
    app: nginx
  replicas: 3  				# 副本数
  strategy:  				# 滚动升级
    rollingUpdate:
      maxSurge: 1			# 滚动升级时会先启动1个pod
      maxUnavailable: 1		# 滚动升级时允许的最大Unavailable的pod个数
   selector:				# 调度规则
    matchLabels:			# 必须有此标签
      app: test
  template:					# pod 模板 上面pod定义的模板

statefulset
  • 概念: 与deployment其他规则类似 但是一个有状态应用的部署方式
    statefulset 是与deployment 相对的 有状态应用部署方式 不同点在于 statefulset 会逐个启动pod 且启动pod 名称格式为 {statefulset名称-n}
    当前一个pod 没有启动完全 后一个pod 不会启动
    statefulset 需要定义与deployment类似 1.7版本以后可设置滚动更新策略
    statefulset 可以定义持久化存储 可以直接写在yaml 文件中 定义pvc 持久化
    statefulset 除了 存储卷与deployment 定义方法不同其余基本一直
daemonset
  • 概念: 确保集群内所有Node节点上都运行一个 Pod,当新加入的node节点也会自动跑daemonset设置的pod
  • 可以通过 打污点 设置调度规则的方式 限制daemonset pod 在某些节点上运行
  • 默认是删除式更新rollingUpdate
cronjob
  • 概念: cronjobn用来管理job的控制器
    在给定的时间点运行一次Job
    周期性的在给定的时间点运行

k8s Cronjob 需要定义什么

cronjob对象名称
命名空间
规则
	运行时间
	调度规则
	job模板
cronjob yaml范例
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:

service

  • service 作用是对 相同功能pod提供统一入口地址 并且将请求负载分发到后端各个容器上 本身也是一个负载均衡 并不具有计算功能
  • service 并不是一个pod 原理是通过 kube-proxy 进行负载转发
    server 只能通过端口测试后端 ,本身service IP 不能ping 通
  • service 有自动发现机制 能识别到 所有selector 标签pod
service yaml 范例
apiVersion: v1							#版本
kind: Service							# 对象类型
metadata:								# 元数据
  name: servicename                     # 名称
  namespace: default                   # 命名空间
  labels:								# 标签
    - app: web
  annotations:							# 注释
    - app: web
spec:									# 规格
  selector:								# 符合调度pod 标签范围
    app: webpod
  type: clusterIP|NodePort|LoadBalancer	# 模式
  clusterIP: 192.168.1.1				# clusterIP地址
  sessionAffinity: None					# 是否支持 session会话保持 需后期研究
# 暴漏端口 ----------------------------------
  ports:								# 需要暴漏端口列表 (可暴漏多个)
#---
  - name: web-server                    # 端口名称      (区分 posts)
    protocol: tcp|udp                   # 端口协议
    port: 80                                    # 需要监听端口
    targetPort: 80                              # pod 端口号
    nodePort: 80                                # 当type=NodePort 时 映射物理机端口号

ingress

  • 概念: k8s 本身创建的一个nginx应用,使用http 七层路由机制 进行前端负载 .解决将不同url 请求到不同服务的需求
  • 由 ingress controller 和 ingress 策略配置 组成
  • ingress 策略
    已pod 形式运行 如果ingress 发生变化自动更新转发规则
    可在 ingress中annotations 对ingress Controller 进行相关配置
ingress Controller
  • 概念: ingress-controller 就是一个nginx pod 做了 nginx 反向代理 , 根据规则将请求 转发到 对应service
  • 需要初始化创建
ingress yaml 详解
apiVersion: exensions/v1beta1           # 使用 exensions/v1beta1
kind: Ingress							# 声明对象ingress
metadata:								# 元数据
  name: test-ingress					# ingress对象名称
  annotation:							# 注解
spec:
  rules:
  - host: test.com						# 解析来自那个域名的请求
    http:
      paths:
      - path: /							# url
        backend:
          serviceName: api-service		# 请求后端server name
          servicePort: 8081				# server端口
  tls:									# 添加https证书
    - host: test.com					# 需要添加https 证书的域名
    secretName: tls-secret				# 证书密钥

configmap

创建configmap 以文件方式
文件名为key 文件内容为 value 方式创建

kubectl create configmap {cm-name} --from-file={url}

以指定键值对 方式

Kubectl create configmap {cm-name} –from-literal={key}={value}

k8s 常用命令

基础查询

#查看异常 pod
kubectl get pod --all-namespaces -owide |grep -vE "(Run|Com)"

#查看pod 详细信息
kubectl describe pod -n {命名空间}  {podname} 

#查看pod 指定容器日志 常用于查看init:0/1状态下 initcontainers 启动日志
#指定容器name 通过查看yaml 查看 contrainers 下name 查看
kubectl log {pod名称} -c {指定容器name} -n {命名空间}



#通过标签查询对象
Kubectl get {对象} --show-labels -l app=nginx,test=test

#查看重启次数过高的前10个pod
#重启 需要根据 后面的时间判断 重启频率 判断是否正常
Kubectl get pod –all-namespaces -owide |sort -nr -k 5 |head


#查看服务近期日志
journalctl -u {etcd|kubelet|docker} -f  

高级使用

# 删除资源
Kubectl delete pod {podname} -n {namespaces} --force --grace-period=0
        #强制删除  针对卡在 Terminating 的pod 使用强制删除命令

# 更新资源
kubectl set image deployment/{nginx-deployment} {nginx}={nginx:1.9.1}
        #更新镜像使用版本
        # {nginx-deployment}=deployment名称
        # {nginx}=deployment 中需要更新的contrainers 名称
        # {nginx:1.9.1}=需要替换的版本

# 快速回滚
kubectl rollout undo {deployment}/{nginx-deployment}
        #回滚到上个版本
kubectl rollout history {deployment}/{nginx-deployment}
        #查看历史版本
kubectl rollout undo {deployment}/{nginx-deployment} --to-revision={2}
        # {deployment}=需要回滚的资源
        # {nginx-deployment}=资源对象名称
        # {2} = 需要回滚到 的版本  正常使用时不带括号

创建命令

# 使用yaml 创建资源
Kubectl apply -f  {yaml}.yaml

节点操作命令

# 查看最新token  用于加入新的node节点
kubeadm token create

# 设为node为不可调度状态
kubectl cordon node1
# 将pod赶到其他节点且变成不可调度状态
kubectl drain node1
# 解除node不可调度状态
kubectl uncordon node1

# 删除节点
kubectl delete node {nodename}
# 让node 脱离调度范围  pod不会自动停止  需要管理员手动停止({spce:{……}} 无需修改)
kubectl patch node {nodename} -p '{"spec":{"unschedulable":"true"}}'
# 恢复调度
kubectl patch node {nodename} -p'{"spec":{"unschedulable":"false"}}'

#添加标签
kubectl label {pod|node} {name} app=xxx
# 修改标签
kubectl label {pod|node} {name} app=yyy --overwrite
# 删除标签
kubectl lable {pod|node} {name} app-

# 清除master 污点机制
kubectl taint node master.k8s node-role.kubernetes.io/master-          
# 给node节点打污点
kubectl taint node {node name} key=value:{NoSchedule|NoExecute|PreferNoSchedule}
# 恢复master污点机制
kubectl taint node {nodename} node-role.kubernetes.io/master=:NoSchedule

# NoSchedule:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响
# NoExecute:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能调度过来,老的pod也会被驱逐
# PreferNoSchedule:pod会尝试将pod分配到该节点

备份当前yaml文件

kubectl get {deploy|rc|pod|cm|svc|ingress}  {资源名称} -n {namespaces} -o yaml --export > {备份名称}.yaml

kubectl replace -f xx.yaml    重建资源

变更

改变副本数
kubectl scale deployment {deployment} --replicas=2

给pod 添加新标签
kubectl label pod {podname} -n {namespaces}  newlabel=xxx
删除标签
kubectl label pod {podname} -n {namespaces}  newlabel-
修改标签
kubectl label pod {podname} -n {namespaces} newlabel=master --overwrite
修改kubectl get node 显示ROLSE 标签
kubectl label node {nodename} node-role.kubernetes.io/{ROLSE标签}=" "
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐