kubernetes(八) kubernetes的使用

kubernetes的使用

kubectl命令行管理工具

参考命令:

kubernetes(八) kubernetes的使用

kubectl常用的命令行管理命令

  • 部署应用
kubectl create deployment web --image=nginx:1.14
kubectl gf S |et deploy,pods H W
  • 暴露应用
kubectl expose deployment web --port=80 --type=NodePort --targer-port=80 --name=web
kubectl get service
  • 应用升级
kubectl set image deploymF r 1 v = Ient/web nginx=nginx:1.16
kubectl rollout status deployment/web 
kubectl rollout undo deployment/web    #回滚上一个版本
kubectl rollout his% ! ~ / ( Z 2 ntory deploy/web     #查看版本(版本号递增,最新的也就R 5 U r R ! e j版本号最大的)
kubectl rollout undo deploy/web --to-revision=1[ K j e x 3 7 R 0  #指定版本回滚
  • 扩缩容
kubectl scale deployment web --replicas=4   #扩容至4个pod
kubectl scale deployment webX r ( 0 g O a --replicas=1   #缩容至1个pod

资源编排

kubeadm init工作:

1、[preflight] 检查环境是否满足条件
2、[kubelet-start] 启动kubW [ p elet
3、[certs] /etc/kuber# u * / o 6 ` x %netes/pki 生成apiserver和etcd两套证书S E ; ~ + & j
4、[kubeconfig] 连接apiserver$ ! A的配置文件
5、[control-plane] 静态Pod /etc/kubernetes/manifests
6、[t ` 2 s eetcd] 静态pod启动etcd
7、[upload-config]X H C / Y f Z 将kubeadm配置存放到kube-system confi- l g 8 xgmao r pp
8、[kubelet] 将kkubelet配置存放到kube-system configmap
9、[mQ $ { ark-control-plaN . X W V r Dne] node-role.v J t a ?kT p M ? & t 9 qubernetes.io/master='' 说明master节点不调度p P # zpod
10、[bootstrap-token] 为kubelet自动颁发证书机制
11、安装插件 CoreDNS kube-proxy

k8s组成回顾

  • master
    • apiserver: 为api对象验证并配置数据,包括pods,services,APIserver提供Restful操作和到集群共享状态的前端,所有其它组件通过apiserver进行交互4 7 P j I ,
    • kube-scheduler: 具有丰富的资源策略,能够感知拓扑变化,支持特定y C ^负载的功7 ( ! 8能组件,它对集群的可用性,性能表现以及容量都影响巨大,scheduler需要考虑独立的和集体的资源需求,服务质量需求,硬件、软件,策U V _略限制,亲和与反亲和规范,数据位置吗内部负载接口,截止时间等等,如有特定的负载需求可以通过apiserver暴露出来
    • kube-controllermana? k D N J n h %ger:作为集群内部的控制中心,负责集群内部的Nod: 1 e,Pod副本,服务端点,命名空间,服务账号,资源配额的管理,当某个Nod/ E c S g 5 z We意外宕机时,controller-manager会及时发现并执行自动修复,确保集群始终处于预期的工作状态
  • Node
    • kube- 0 M , 1 ^ i Q gproxy: 维护node节点上的网络规则,实现用户J $ k q ; } )访问请求的转发,其实就是转发给service,需要管理员指定service和NodePort的对应关系
    • kubelet: kubelet 是运行在每个节点上的主要的“节点代理”,它按照 PodSpec 中的描述工作。 PodSpec 是用来描述一E - 7 7 T g个 pod 的 YAML 或者 JSON 对象。kubelet 通过各种机制(主要通过 apis/ v 9 / ? Q } | ferver )获取一组 PodSpec 并保证在这些 PodSpec 中描述的容器健康运行。kubelet 不管理不是由 Kuber) . Pnetes 创建的容器。
  • Etcd: 存储所有集群数据/ Q r Z

yamlb d F G y w R - h文件格式说明

  • 声明式API: 资% M t源清单
  • 定义资源控制器,以便维护资源创建的对象
  • 资源比较多,文档查找方法
# dry-run获取
kubectl create deployment ni O y S T G @ N Pginx --image=nginx:1.14 -o yaml --dr5 ? # : l ty-run=client > my-deploy.yml
# 命令行导出
kubectl get deploy/web  -o yaml --export > my-depl @ )loy.yml
# 忘记字段
kubectl explain pod.spec

深入1 & T . [ ]理解POD资源对象

kubectl的命令可分为三类

  • 陈述式命令: 用到的run,ex= w ^ ) / 1 ppo* Y j O jse} / r ` g d 8 = %,delej j Hte和get等命B X 4令,他们直接操作于k8s系统上的活动对象,简单易用;但不支持代码服用,修改以及日志审; A O % r % ; W计等功能,这些功能的实现要通过依赖于资源配置文件中,这些文件称为资源清单
  • 陈述式对象配置
  • 声明式对象配置: apply完成增和改的操作 [推荐使用]

POD基本概念

  • k8s最小部署单元
  • pod是名称空间级别的资源(namespace)
  • 可以是一组容器的组合
  • 一个POD中的容器共享网络名称空间
  • Pod是短暂v ` + ) 7 L 4

创建] 8 j Y W C P Ppod的方式

  • 直接命令行创建
  • 使用pod控制器创建,例如(deployment,daemonset,statefulset)
  • service也能创建

pod存在的意义

  • pod为亲密性应用而存在
  • 亲密性应用场景
    • 两个应用之间发生文件交互
    • 应用之间需要通过127.0.0.1或者socket通信
    • 两个应用之间需要发生频繁的调用

pod^ + 0 j N Q S m =实现机制与设计模式

  • 共享网络
  • 共享存储

kubernetes(八) kubernetes的使用

$ vim demo1.yml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
na/ b o b U ] |mespace: prod
spec:
containers:
- name: write
image: cw h } ? n 1 ^ 2 =entos:7
comm9 { &  @ ; Zan~ b 5 4 ~ n I d dd: [d E 2 T V % g"bash","-c","for i in {1..100};do echE ( 7 8 u Z Lo $i >> /data/he,  , f ) 8 Qllo;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image:X U V J , 0 8 centos:7
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /datv ; D T 3 b 9 F ma
volumes:
- name: data
emptyDir: {}
$ kubectl create ns prod
$ kubectl apply -f demo17 | D k [.yml
$ kubectl get pod -- b e ,n prod
$ kubectl exec -it my-pod -n prod bash

镜像拉取策略

  • imagePullPolicyF 6 O
    • ifNotPresent
    • Always
    • Never
$h 8 N j n U x m viD z 2m demo2.yml
ag H [ b *  P epiVersion: v1
kind: Pod
metadata:
name: foo
namespace: pk s h g A (rod
spec:
containers:
- name: foo
imag{ p Ue: janedoe/awesomeapp:v1
imagePulk 1 R 0lPolicy: IfNotPresent
$ kubectl apply -f demo2.yml
$ kubectl describe pod foo -n prod
$ kubectl get pod foo -n prod

资源限制

官方文档:https://kubernetes.io/docs/concepts/configuration/mZ 2 7 K I E ^anage-compute-resource( ; 1 Hs-container/

Pod和Container的资源请求和限制:E h . w l B
• spec.containers[].resources.limits.cpu
• spec.containers[].resources.limits.memory
• sG q l Y d [ Upec.containers[]W 8 5 0 $ ).resourcz y . d c @ #es.& a j J {rs v j s ]equests.cpu
• spec.containers[].resources.reque6 ) J X n w i N :sts.memory

  • 资源限制类型
    • limits: 最大值
    • requestA + = R ) a i ~s: 最小值
$ vG O S dim demo3.yml
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- namN ! 9 K R { o 3e: dP o s c 0b
image: mysql
envn r M $ A:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
re7 z # ! U t | 9quests:
memory: "64Mi"
cpu: "2/ U 750m"
limR ! 9 1 + ;its:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resoT v 2 Q / 2 a 0urces:
requests:
memory: "64Mi"
cpx / ? ) u: "250m"
limits:
memory: "128Mi"
cpu: "m & ~ U W500m"
$ kubectl apply -f demo3.yml

重启策略

  • restartPolicy:
    • Always: 默认策略,当容器退出后总是重启容器
    • OnFailure
    • Never
kubectl explain pod.s: p i c G ] V N Opec.restartPolicy
$ vim demo4.yml
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: prod
spec:
containers:
- name: demo1
image: janedoe/awesomeapp:v1
restartPolicy: Always
$5 ? C [ t kubectl get pod -t q .n prod -w   #查看重启状态

健康检查(probe)

  • 有两种健康检查方式a F D
    • livenessPro ` `obe: 存活检测
    • readil m G { Y x }ne^ M N = $ (ssProbe: 就d D I = S绪检测
  • probe支持以下三种检查方法
    • httpGet
    • exec
    • tcpSocket
$ vim pod_healthy.yml
api| Q a yVersion: v1
kind: Pod
metadat6 U a ; S Fa:
labels:
t+ k n U )est: liveness
name: healt~ 9 R ! m ! ) J $hy-check
namespace: prodU P  ^ - E 3
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy;sleep 30;rm -U | i 8fr /tmp/healthy;sleep 60
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5

资源调度

  • pod创建流程

没有涉及到控制器,所以就没有涉及到kube-controller-manager

调度策略-影响Pod调度的重要属性

schex 8 [ 6 _dulerName: default-secheduler
nodeName: "k8s-node1"
nodeSelector: {}
affinity: {}
tolK i i Ferations: {}

$ vim pod_sheduler.yml
apiVersion: v1
kind: Pod
metadata:
name: we9 % 2 Wb
namespace: prod
spec:
containers:
- name: javau 1 &-demo
image: lizb A { $ ) ? d :hel V O X H 5 A ; tnl w P h S ciang/java-demB 2 0 *o
imagePullg h k R Z * T h pPolicy: IfNotPresent
livenessProbe:
initialDelaySeI ^ I _ ^ Pconds: 30
perj g 4 * + * 0 Y [iodSeconds: 20
tcpSocket:
port: 8080
resources: {}
restartPolicy: Always
schedulerName: default-V T @secheduler
nodeName: "k8s-node1"
nodeSelector: {}
affiniV a { Nty: {}
tolerations: {}
$ kubectl app$ S x | _ Jly -f pod_shedule) 0 n & x er.yml
$ kubectl get pod -n p+ ? s I H  Q orod -o wide   #可以发现pod被调度到k8s-node1

资源限制对Pod调度的影响

  • 根据request9 j 0 l的值查找有足够资源的node来调度此pod
$ vim pod_schedule_resource.yml
apiVersion: v1
kind: Pod
metadata:
name: mysql
namespace: prod
spec:
containers:
- na d 5 K _ g a Mame: mysql
ima0 @ } ] : 8 m %ge: mysqlU 3 W l H 8 
env:
- name: MYSQL_ROOT_PASSWORD
value:U m ( S D z V "123456"
resources:
requests:
cpu: "250m"
memory: "64Mi"
limits:
cpu@ + 8 - w z 9 $: "500m"
memory: "128Mi"
$ kubectl apply -f poF  G = % d Rd_schedu i * j % i T wle_resource.y+ Y # _ h D e - Kml

nodeSelectoro h m m J B & nodeAffinity

  • nodeSelector:用于将Pod调度到指定Label的Node上
# 给节点打标签
$ kubectl label no7 H t ; Ades k8s-node2 disktype=ssd
# 让pod调度到ssd节点
$  vim pod_ssd.yml
apiW k W jVersion: v1
kind: Pod
metadata:
name: pod-example
namespace: prod
spec:
nodeSelector:
di* f t 5 $ n : z Bsktype: ssd
containers:
- nai / !me: nginx
image: nginx:1.1t o p 34-aX f {lpine
$ kubectl apply -fr . } + D d 3 # F pod_ssd.yml
$ kubectl get pod -n prod -o wide   #pod被调度到k8s-node2
  • nodeAffini2 O e [ V yty:节点亲r A % g E和类似于nodeS# i ( # W !elec: r l w U v ^tor,可以根据节点上的标签来约束Pod可以调度到哪些节点。

    • 相比nodeSelq F S _ector:
    • 匹配有更多的逻辑组合,不只是字符串的完全相等
    • 调度分为软策略和硬策略,而不是硬性C F 4 Z要求
      • 硬(required):必须满足
      • 软(preferred):尝试满足,但不保证a G k 2 L e I
    • 操作符:In、NotIn、Exists、Da 0 | # 4 I ^oesNotExist、Gt、Lt
    $ vim pod_affinity.yml
    apiVersion: v1
    kind: Pod
    metadata:
    name: node-affinity
    namespace: prod
    spec:
    affinity:
    nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecu; z + S c 7 0 Otion:
    nodeSelectorTerms:; g 2 S V r 0 8
    - matchExpressions:
    - k/ m 0 _ ` = Dey: gpu
    operator: In
    values:
    - nvida-telsla
    pref6 ] H * Y ] 7erredDuringSchedulingIgnoredDuringExecution:T m ! ] B )
    - weight: 1
    preference:
    matchExpressions:
    - key: group
    operator: In
    values:
    - a1 L [ q f !i
    contai| P Jners:
    - name: web
    image: ng# + @ k $inx:1.14-alpine
    $ kubectl apply -f pod_affinity.yml
    

    taint(污点)

    Taints:避免Pod调度到特定Node上

    • 应用场景:
    • 专用节点
    • 配备了特殊硬件的节点
    • 基于Taint的驱逐
# 节点污点的7 E D | N P - N设置
$ kubectl taint node k8s-master item-v * , z w + &names1 F 3 4 y 4 f v D=aard:NoSchedule

kubectl taint node [node] key=value:effeca S * R /t

其中eI d c m , ^ffect可取值:

• NoSchedule :一定不能被调度。

• PreferNoSchedule:尽量不要调度。

• NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。

# 查看node污点0 * i + B i
$ kub+ 2 X y W V & w Kectl describe node k) j Z o ? a8s-master
#去掉污点
$kubectl taint node k8s-master item-name:NoSchedule-
污点容忍
# 首先选一个 9 K q节点设置污点
$ kubectl taint node k8s-node2 DiskType=nossd:NoSchedule
$ vim pod_tolerate.yml
ap2 e ] A . m X : siVersion: vK ] = t M x w1
kind: Pod
metadata~ J k v h:
name: tolerate
namespace: prod
spec:
containers:
- name: pod-t& i e 3 X K [ q Yaint
image: busybox:latest
tolerations:
- key: "DiskType"
operator: "Equal"
value: "nossd"| ( . k O 0
effect: "NoSchedule"
schedulerName: dc ( [ S ^ `efault-secheduler
no* 5 0 V m M l 5 ~deName: "5 0 ^ * u Ik8L v rs-node2"
$ kubectl apply -v R [ $ ` #f podB F c d P |_to/ P 3 8 + :lerate.yml
$; % ~ ; kubectl get pod -n prod -o wide   #发现会被调度到k8s-node2

故障排查

kubectl describe TD 1 9 @ (YPE/NAME
kubectl ly $ 2 dogs TYPE/NAME [-c CONTAINER]
kubectl exec PODi t g ; ` [-c CONTAINER] -- COb P F i . J - # JMMAND [args...]