k8s学习(一)
k8s学习(一)
基于《Kubernetes in Action》
集群架构:
控制面板(master)
kubernetes API 服务器:负责通信
Scheculer : 调度应用
Controller Manager
etcd : 分布式键值数据库
工作节点
容器类型
Kubelet : 与API服务器进行通信,并管理所在节点的容器
kube-proxy : 组件之间的负载均衡网络流量
pods基本操作
创建节点
`kubectl run [name] –image=[容器名] –port=[端口号]
显示信息
kubectl get pods (-o wide)
--show-labels
: 显示标签-L [列名1, 列名2...]
: 你想看的属性以列展开kubectl describe pod [pods_name]
: 详细信息端口转发:
kubectl port-forward kubia-manual 8888:8080
将机器的本地端口8888转发到kubia-manual pod的端口8080
打印日志
kubectl logs [节点名] -c [节点上的容器名]
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添加/更改标签:
添加:
kubectl label node [node_name] [tag_name]=[val]
kubectl label po kubia-manual-v2 env=debug --overwrite
更改已有标签需要--overwrite
过滤器:过滤包含特定值的标签
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)
通过逗号隔开可以指定多条件匹配
将pod调度到特定节点
在
spec
字段中添加nodeSelector
,指定标签即标签值,则调度器将pod调度到满足该条件的工作节点eg: 调度到
gpu=true
的节点1
2
3spec:
nodeSelector:
gpu: "true"注解(键值对),描述pods信息
kubectl annotate pod [pod_name] xxxx/xxx="xxx"
可利用namespace对资源进行分组,不同命名空间可以包含同名资源
创建namespace
yaml文件指定
kind
字段为namespace
kubectl create namespace [name]
删除pods
kubectl delete po [podname1] [podname2] ...
-l [filter-condition]
: 标签选择器批量条件删除kubectl delete ns [name]
: 删除整个命名空间即所有的podkubectl delete po -all
: 删除所有指定的资源实例,但是如果存在ReplicationController,则它为了维持副本数量,将一直不断创建新的podkubectl delete po all -all
: 基本删除所有资源
Pod存活指针
存活指针:检测容器是否还在运行
- http Get指针
eg: 在yaml文件中增加:
1
2
3
4
5
6
7
livenessProbe:
httpGet:
path: /
port: 8080
initalDaleySeconds: 15TCP指针
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 |
|
operator:
In: Label的值必须与values中的一个匹配
NotIn: 与任何values都不匹配
Exists/DoesNotExist: pod(不得)包含有指定名称的标签,values属性不得指明
DaemonSet:
在指定条件的每一个节点都运行一个pod,例如对所有含 disk=ssd
的节点都运行一个硬盘监控的节点。它可以绕过Scheduler,所以甚至可以部署到那些满足条件但被Scheduler认为不可调度的节点。
也是通过 nodeSeletor
字段来指定
Job资源:
pod在内部进程成功结束后,不重启容器,而一旦任务完成该pod就被认为是完成状态。但如果是异常退出的话,Job一般会重启该容器保障其任务完成。
创建Job eg:
1 |
|
CronJob :
定期或者指定间隔重复运行,在UNIX类操作系统中被称为cron任务
在CronJob指定schedule
和 jobTemplate
属性,后者就是上面job的 spec
部分。
schedule
的时间表安排为
分钟 小时 每月的第几天 月 星期几
eg: schedule: "0 3 * * 0"
表示每个星期天的3AM 0分运行
startingDeadlineSeconds: 15
: pod最迟必须在预定时间后的15s开始运行