k8s学习(一)

基于《Kubernetes in Action》

源码仓库


集群架构:

  • 控制面板(master)

    • kubernetes API 服务器:负责通信

    • Scheculer : 调度应用

    • Controller Manager

    • etcd : 分布式键值数据库

  • 工作节点

    • 容器类型

    • Kubelet : 与API服务器进行通信,并管理所在节点的容器

    • kube-proxy : 组件之间的负载均衡网络流量


pods基本操作


  1. 创建节点

    `kubectl run [name] –image=[容器名] –port=[端口号]

  2. 显示信息

    kubectl get pods (-o wide)

    --show-labels : 显示标签

    -L [列名1, 列名2...] : 你想看的属性以列展开

    kubectl describe pod [pods_name] : 详细信息

  3. 端口转发:

    kubectl port-forward kubia-manual 8888:8080

    将机器的本地端口8888转发到kubia-manual pod的端口8080

  4. 打印日志

    kubectl logs [节点名] -c [节点上的容器名]

  5. yaml或者json文件创建pod

    kubectl create -f [filename]

    yaml基本格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    apiVersion: v1
    kind: Pod
    metadata:
    name: kubia-manual-v2
    labels:
    creation_method: manual
    env: prod
    spec:
    containers:
    - name: kubia
    image: kubia-container
    ports:
    - name: tcp
    containerPort: 8080

  6. 添加/更改标签:

    添加: kubectl label node [node_name] [tag_name]=[val]

    kubectl label po kubia-manual-v2 env=debug --overwrite 更改已有标签需要--overwrite

  7. 过滤器:过滤包含特定值的标签

    kubectl get po -l [tag_name]

    • -l [tag_name] : 包含该标签的pod

    • -l '![tag_name]' : 不包含的pod

    • [tag_name](!)=val : 包含该标签但值(不)等于val的pod

    • [tag_name] (not)in (val1, val2)

    通过逗号隔开可以指定多条件匹配

  8. 将pod调度到特定节点

    spec 字段中添加nodeSelector,指定标签即标签值,则调度器将pod调度到满足该条件的工作节点

    eg: 调度到gpu=true的节点

    1
    2
    3
    spec:
    nodeSelector:
    gpu: "true"
  9. 注解(键值对),描述pods信息

    kubectl annotate pod [pod_name] xxxx/xxx="xxx"

  10. 可利用namespace对资源进行分组,不同命名空间可以包含同名资源

    创建namespace

    • yaml文件指定kind字段为namespace

    • kubectl create namespace [name]

  11. 删除pods

    kubectl delete po [podname1] [podname2] ...

    -l [filter-condition] : 标签选择器批量条件删除

    kubectl delete ns [name] : 删除整个命名空间即所有的pod

    kubectl delete po -all : 删除所有指定的资源实例,但是如果存在ReplicationController,则它为了维持副本数量,将一直不断创建新的pod

    kubectl delete po all -all : 基本删除所有资源

Pod存活指针

  • 存活指针:检测容器是否还在运行

    • http Get指针

    eg: 在yaml文件中增加:

    1
    2
    3
    4
    5
    6
    7

    livenessProbe:
    httpGet:
    path: /
    port: 8080
    initalDaleySeconds: 15

    • TCP指针

    • Exec指针


ReplicationController(RC)

已被RS替代


组成:

  • label selector

  • replica count : 副本个数,指定运行的pod数量

  • pod template : 用于创建新的pod副本

    创建rc的yaml文件eg:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: kubia
    spec:
    replicas: 3
    selector: # 可以不指定selector让其从template中提取
    app: kubia
    template:
    metadata:
    labels:
    app: kubia
    spec:
    containers:
    - name: kubia
    image: luksa/kubia
    ports:
    - containerPort: 8080

    更改pod模板只会影响之后创建的pod

    kubectl edit rc [rc_name]

    打开rc的yaml配置,可以在其中更改pod模板

水平缩放

修改副本数量:

kubectl scale rc [rc_name] --replicas=[num]

删除rc:

kubectl delete rc [rc_name]

后面加 --cascade=false 保留托管的pods

ReplicaSet比ReplicaController更高级,可以进行多条件匹配,后者不能。

可以matchExpressions字段指定更丰富的匹配条件,eg:

1
2
3
4
5
6
7
8

selector:
matchExpressions:
- key: app
operator: In
values:
- kubia

  • operator:

    • In: Label的值必须与values中的一个匹配

    • NotIn: 与任何values都不匹配

    • Exists/DoesNotExist: pod(不得)包含有指定名称的标签,values属性不得指明

DaemonSet

在指定条件的每一个节点都运行一个pod,例如对所有含 disk=ssd 的节点都运行一个硬盘监控的节点。它可以绕过Scheduler,所以甚至可以部署到那些满足条件但被Scheduler认为不可调度的节点。

也是通过 nodeSeletor 字段来指定

Job资源

pod在内部进程成功结束后,不重启容器,而一旦任务完成该pod就被认为是完成状态。但如果是异常退出的话,Job一般会重启该容器保障其任务完成。

创建Job eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

apiVersion: batch/v1
kind: Job
metadata:
name: multi-completion-batch-job
spec:
completions: 5 # 执行任务数
parallelism: 2 # 可并行执行的pod数
template:
metadata:
labels:
app: batch-job
spec:
restartPolicy: OnFailure # 默认为Always但这里不能指定,还一个属性为Nerver
containers:
- name: main
image: luksa/batch-job

CronJob :

定期或者指定间隔重复运行,在UNIX类操作系统中被称为cron任务

在CronJob指定schedulejobTemplate 属性,后者就是上面job的 spec部分。

schedule的时间表安排为

分钟 小时 每月的第几天 月 星期几

eg: schedule: "0 3 * * 0"

表示每个星期天的3AM 0分运行

startingDeadlineSeconds: 15 : pod最迟必须在预定时间后的15s开始运行