kubeernetes 详解
kubeerneteskubeernetesK8s 概念图解容器 对象需求K8S 各个对象解释K8s 概念图解pod最小应用部署单元 即应用pod 需要定义什么元数据pod名称所属namespaces标签可用于 svc 识别注释信息规格调度容器名称 containers使用镜像镜像拉取方式执行参数环境变量资源配额健康检查挂载卷使用 对应到容器 目录指定挂载卷dns策略hostnetworkrest
·
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标签}=" "
更多推荐
已为社区贡献3条内容
所有评论(0)