文章目录
K8s基础管理
Pod概述
- Pod是K8s中最小的管理元素
- 一个Pod包涵1个或多个容器(共享网络,共享存储)
- Pod支持横向扩展和复制
Pod生命周期
- Pod对象自从其创建开始至其终止退出的时间范围称为其生命周期。在这段时间中,Pod会处于多种不同的状态,并执行一些操作,其中,创建主容器(main container)为必需的操作,其他可选的操作还包括运行初始化容器(init container)、容器启动后钩子(post start hook)、容器的存活性探测(liveness probe)、就绪性探测(readiness probe)以及容器终止前钩子(pre stop hook)等,这些操作是否执行则取决Pod的定义
Pod phase(相位)
PodStatus 对象 | 说明 |
---|---|
Pending | 容器创建过程中,但它尚未被调度完成 |
Running | 所有容器都已经被kubelet创建成功 |
Succeeded | 所有容器都已经成功终止了并不会被重启 |
Failed | Pod中的所有容器中至少有一个容器退出是非0状态 |
Unknown | 无法正常获取到Pod对象的状态信息 |
Pod创建过程
- 客户端提交创建请求,可以通过API server的Restful API ,也可以使用kubectl命令行工具。支持的数据类型有JSON和YAML
- API Server处理用户请求,存储Pod数据到etcd数据库
- 调度器通过API Server在Scheduler调度器查看未绑定的Pod
- 经过调度预选(Scheduler调度器用一组规则过滤掉不符合要求的主机),调度优选(对调度预选后的主机进行算法打分),最后选择打分最高的主机,进行binding操作,并记录到etcd中
- kubelet根据调度结果执行Pod创建操作,创建成功后,Scheduler会调用API Server的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。
- 运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,就调用Docker API创建并启动pod内的容器。
Deployment
- Deployment / RC(Replication Controll)/ RS (ReplicaSet)都是资源控制器
- Deployment 为Pod和ReplicaSet 提供了一个声明定义方法 用来替代RC
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
资源对象文件
- 资源对象文件一般由用户根据需求编写
- 格式可以是json、yaml
- kubectl get 资源对象 资源名称 -o 格式 来查询一个资源对象文件
kubectl get deployment apache -o yaml
Pod资源文件格式
--- #资源定义起始标志
apiVersion: v1 #当前格式的版本
kind: Pod #当前创建资源的类型
metadata: #当前资源的元数据
name: pod-example #当前资源的名称(Pod)
labels: #当前资源的卷标
app: myos #卷标,可被引用
spec: #当前资源的详细定义
containers: #容器定义
- name: myos #容器名称,多容器在一个Pod中名称不能重复
image: 192.168.1.100:5000/myos:v1804 #启动容器的镜像地址
stdin: true #交互式 即-i后台服务不需要
tty: true #分配终端,即-t 后台服务不需要
restartPolicy: Always #资源重启策略[Always,OnFailure,Never]
#Always是默认策略
使用
kubectl apply -f pod-example.yaml #使用上面资源文件
pod/pod-example created
kubectl get pod #查看
NAME READY STATUS RESTARTS AGE
pod-example 1/1 Running 0 11s
kubectl delete -f pod-example.yaml #删除
pod "pod-example" deleted
deployment格式
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-example #当前资源(deployment)的名字
spec: #当前资源的详细定义
selector: #资源匹配选择器,主要确定资源的方式
matchLabels: #匹配卷标
app:myapp #具体匹配的东西,labels里面定义的 键值
replicas: 1 #POD副本数量
template: #资源模板(需要包含至少一个POD的定义)
...... #以下为POD的定义
K8s系统命名空间
查看命名空间的命令
kubectl get namesapce
NAME STATUS AGE
default Active 47h
kube-node-lease Active 47h
kube-public Active 47h
kube-system Active 47h
- default 默认的命名空间,不声明命名空间的POD都在这里
- kube-node-lease为高可用提供心跳监视的命名空间
- kube-public 公共数据,所有用户都可以读取它
- kube-system 系统服务对象所使用的命名空间
查看命名空间中的资源对象
kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
coredns-f6bfd8d46-5kbv2 1/1 Running 3 47h
coredns-f6bfd8d46-dgh77 1/1 Running 3 47h
etcd-master 1/1 Running 3 47h
Kubernetes基础管理
kubectl命令
语法格式: kubectl [command] [TYPE] [NAME] [flags]\
- command:子命令 create 、get 、 describe、 delete
- type: 资源类型,可以表示为单数,复数或缩写形式
- name: 资源的名称,如果省略,则显示所有资源信息
- flags: 指定可选标志,或附加的参数
命令格式 | 命令说明 |
---|---|
kubectl run 资源名称 -参数 --image=镜像名称:标签 | 创建资源对象,-i交互,-t终端 |
kubectl get 查询资源 可选参数 -o wide 显示主机信息 | 常用查询的资源 node | deployment | pod |
kubectl exec -it 容器id 执行的命令 | 同docker exec ,进入容器 |
kubectl describe 资源类型 资源名称 | 查询资源的详细信息 |
kubectl attach | 同docker attach 指令,连接容器 |
kubectl logs 容器id | 查看容器控制台的标准输出 |
kubectl delete 资源类型 资源名称 | 删除指定的资源 |
kubectl create | apply -f 资源文件 | 执行指定的资源文件 |
- 命令使用
#执行指定资源文件 配置网络插件
kubectl apply -f kube-flannel.yml
kubectl get nodes #查看信息
NAME STATUS ROLES AGE VERSION #网络插件安装完成
master Ready master 42h v1.17.6
node-0001 Ready <none> 41h v1.17.6
node-0002 Ready <none> 41h v1.17.6
node-0003 Ready <none> 41h v1.17.6
kubectl -n kube-system get pods #查看 kube-system 是K8s项目预留的系统Pod的工作空间
#不是Linux的Namespace 只是K8s划分不同工作空间的单位
NAME READY STATUS RESTARTS AGE
coredns-f6bfd8d46-5kbv2 1/1 Running 3 42h
coredns-f6bfd8d46-dgh77 1/1 Running 3 42h
etcd-master 1/1 Running 3 42h
kube-apiserver-master 1/1 Running 3 42h
kube-controller-manager-master 1/1 Running 3 42h
kube-flannel-ds-amd64-65bhp 1/1 Running 3 41h
kube-flannel-ds-amd64-9q9d4 1/1 Running 5 41h
kube-flannel-ds-amd64-cbnjf 1/1 Running 3 41h
kube-flannel-ds-amd64-fs76r 1/1 Running 6 41h
kube-proxy-dndvj 1/1 Running 7 41h
kube-proxy-dq6pz 1/1 Running 7 41h
kube-proxy-r89h7 1/1 Running 7 42h
kube-proxy-vwhhl 1/1 Running 7 41h
kube-scheduler-master 1/1 Running 3 42h
#describe查看详细信息
kubectl -n kube-system describe pod kube-flannel-ds-amd64-65bhp
Name: kube-flannel-ds-amd64-65bhp
Namespace: kube-system
.....
Events: #关注Events 可以查看操作信息 Debug的重要依据 出现问题第一时间查看这个
......
#run 启动容器
kubectl run testos -it --image=192.168.1.100:5000/myos:v1804
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
[root@testos-6d7c98965-88njw /]# ps #成功进入了
PID TTY TIME CMD
1 pts/0 00:00:00 bash
21 pts/0 00:00:00 ps
exit 退出
#直接启动服务
kubectl run web-test --image=192.168.1.100:5000/myos:httpd
Session ended, resume using 'kubectl attach testos-6d7c98965-88njw -c testos -i -t' command when the pod is running
#查看节点
kubectl get pod -o wide #get node 也可以加-o wide 多打印信息
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
t... 1/1 Running 1 4m4s 10.244.1.2 node-0001 <none> <none>
w... 1/1 Running 0 12s 10.244.2.4 node-0002 <none> <none>
curl http://10.244.2.4/info.php #尝试访问
<pre>
Array
(
[REMOTE_ADDR] => 10.244.0.0
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.29.0
[REQUEST_URI] => /info.php
)
php_host: web-test-7bf98b9576-6zqnk
1229
#容器启动了
#exec 进入容器 -- 后面跟shell命令 不然无法识别shell命令参数
kubectl exec -it testos-6d7c98965-88njw -- /bin/bash
[root@testos-6d7c98965-88njw /]# exit
#attach 进入容器
kubectl attach -it testos-6d7c98965-88njw
[root@testos-6d7c98965-88njw /]# exit #退出
kubectl get pods -o wide #查看pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
t.. 1/1 Running 2 24m 10.244.1.2 node-0001 <none> <none>
w.. 1/1 Running 0 21m 10.244.2.4 node-0002 <none> <none>
#testos的RESTARTS变成2了 attach退出关闭了一次
#查看终端日志
kubectl logs testos-6d7c98965-88njw
#删除资源,直接删除POD会自动重建
kubectl delete pod web-test-7bf98b9576-6zqnk
pod "web-test-7bf98b9576-6zqnk" deleted #pod删除
kubectl get pod -o wide #再次查看pod 发现还在 重新创建了
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
t... 1/1 Running 3 161m 10.244.1.2 node-0001 <none> <none>
w... 1/1 Running 0 83s 10.244.2.5 node-0002 <none> <none>
#删除资源
kubectl delete deployments testos #deployments删除
deployment.apps "testos" deleted
kubectl get pod -o wide #再次查看
# t..的状态变成Terminating
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
t... 1/1 Terminating 3 166m 10.244.1.2 node-0001 <none> <none>
w... 1/1 Running 0 6m19s 10.244.2.5 node-0002 <none> <none>
#再次查看
kubectl get pod -o wide #会发现t...的pod没了
K8s集群中,latest标签是不会缓存的,所以需要修改标签来缓存
简单web集群案例
vim web-example.yaml
===========================
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-example
spec: #详细设置
selector:
matchLabels:
app: my-apache #匹配卷标
replicas: 3 #3副本
template: #资源模板 POD定义
metadata:
labels:
app: my-apache #卷标
spec:
containers: #容器信息
- name: myos
image: 192.168.1.100:5000/myos:httpd
ports:
- protocol: TCP
containerPort: 80
restartPolicy: Always
===============================
kubectl apply -f web-example.yaml
deployment.apps/apache-example created
kubectl get deployment.apps #查看
NAME READY UP-TO-DATE AVAILABLE AGE
apache-example 3/3 3 3 105s
kubectl get pod #
NAME READY STATUS RESTARTS AGE
apache-example-7765fb6c7b-c6wcp 1/1 Running 0 13s
apache-example-7765fb6c7b-n45ph 1/1 Running 0 13s
apache-example-7765fb6c7b-xxt6t 1/1 Running 0 13s
集群调度
- 扩容与缩减
#接上面web集群案例
kubectl scale deployment apache-example --replicas=1 #缩减到1
deployment.apps/apache-example scaled
kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
apache-example 1/1 1 1 9m47s #缩减为1了