kubectl命令
用于控制k8s集群的命令行工具
kubectl [command] 子命令
[TYPE]资源类型
[NAME] 资源名称
[flags]指定可选标志
不区分单复数
kubectl get node/nodes -o wide #显示详细信息
命名空间
系统命名空间
default 默认的命名空间
kube-node-lease 提供心跳监视的命名空间
kube-public 公共数据
kube-system 系统服务对象所使用的的命名空间
[root@master ~]# kubectl -n kube-system get pod #验证集群是否正常 NAME READY STATUS RESTARTS AGE coredns-f6bfd8d46-67trx 1/1 Running 1 19h coredns-f6bfd8d46-cx6j4 1/1 Running 1 19h etcd-master 1/1 Running 2 19h kube-apiserver-master 1/1 Running 2 19h kube-controller-manager-master 1/1 Running 1 19h kube-flannel-ds-amd64-27tml 1/1 Running 1 15h kube-flannel-ds-amd64-92fmd 1/1 Running 2 15h kube-flannel-ds-amd64-wxqs2 1/1 Running 1 15h kube-flannel-ds-amd64-xtcf2 1/1 Running 2 15h kube-proxy-fqxwc 1/1 Running 3 17h kube-proxy-frlsr 1/1 Running 3 17h kube-proxy-g8rh2 1/1 Running 3 17h kube-proxy-l2hdw 1/1 Running 3 19h kube-scheduler-master 1/1 Running 1 19h
常用排错命令
kubectl get 查看容器状态
kubectl describe 资源类型 资源名称
kubectl logs 查看容器报错日志 ( 看W 、E )
如果有异常
1、查看服务详细信息
2、看Events以后的内容
node节点不响应解决方法:
首先看flannel是否存在,查看kube-fannel.yml文件
k8s创建容器
1、通过资源文件管理集群
2、kubectl run 创建容器 #功能单一 ,
kubectl run 资源名称-i -t --images =私有仓库镜像名称:标签 #i,t交互式
[root@master ~]# kubectl run testos -it --image=192.168.1.100:5000/myos:v1804 #创建容器 [root@testos-6d7c98965-jprtl /]# ifconfig #查看IP,可以连外网 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.2.2 netmask 255.255.255.0 broadcast 0.0.0.0
测试
[root@testos-6d7c98965-jprtl /]# ping 192.168.1.252 PING 192.168.1.252 (192.168.1.252) 56(84) bytes of data. 64 bytes from 192.168.1.252: icmp_seq=1 ttl=63 time=1.60 ms
[root@testos-6d7c98965-jprtl /]# exit #退出,容器会关闭 会自动重启
exit
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE testos-6d7c98965-jprtl 1/1 Running 1 4m11s
Session ended, resume using 'kubectl attach testos-6d7c98965-jprtl -c testos -i -t' command when the pod is running [root@master ~]# ping 10.244.2.2 PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data. 64 bytes from 10.244.2.2: icmp_seq=1 ttl=63 time=0.364 ms
删除资源
kubectl delete get查到的资源都能用此命令删除
k8s对容器管理机制
pod与控制器
树形结构
自维护
[root@master ~]# kubectl get deployments.apps #一级控制器
NAME READY UP-TO-DATE AVAILABLE AGE testos 1/1 1 1 14m
[root@master ~]# kubectl get replicasets.apps #二级控制器
NAME DESIRED CURRENT READY AGE testos-6d7c98965 1 1 1 14m
[root@master ~]# kubectl get pod #容器
NAME READY STATUS RESTARTS AGE testos-6d7c98965-jprtl 1/1 Running 1 4m11s
replicasets.apps 当容器异常,会自动重启容器
deployment.apps #删除deployment.apps,才能删除容器,默认等30秒再删除
pod原理
是k8s最小的管理元素
可以理解成多个linux命名空间的联合
pod管理资源 本质是容器 (pause)
pause 是进程 多个进程的聚合单位
容器创建过程
pod生命周期
pod启动过程:
启动之前首先初始化init container------>启动主pod---->触发脚本post start hook ----> 主容器运行 liveness 存活探测 readliness就绪型探测---> 结束前 备份日志 默认不做任何操作
pod phase
--pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命进程中以下几个相位(phase)之一
Pending 容器创建过程中,但尚未被调度完成
Running 所有容器都已经被kubelet创建完成
Succeeded 所有容器都已经成功终止并不会被重启
Failed Pod 中的所有容器中至少有一个容器退出是非0状态
Unknown 无法正常获取到pod对象的状态信息
pod相位状态
第一次状态都写成pending,然后调度分配,运行成功,如果失败,重启在运行直到成功
pod特点
生命周期短暂
不会自愈 ,如果运行故障没有调度器,就会被删除
控制器提供副本管理,滚动升级,集群级别的自愈能力
kubectl exec 进入一个正在运行的容器
kubectl exec -i -t -- i--交互,t--终端
-- 含义是选项终止符,之后的内容不是选项,多个选项时使用
k8s资源文件
资源对象文件:
在RC中定义如何启动,运行,启动级副本等功能的YAML文件
用途:
创建,删除,管理资源对象
pod资源文件
kubectl api-versions #查看资源对象版本
[root@master config]# vim mypod.yaml
kind: Pod #类型
apiVersion: v1 #版本
metadata: #元数据
name: mypod #名字
spec: #详细定义
containers: #容器定义
-name: mylinux #容器名称
image: 192.168.1.100:5000/myos:v1804 #使用镜像
stdin: true #相当于i,交互式
tty: true #相当于t ,终端
[root@master ~]# kubectl apply -f mypod.yaml pod/mypod created
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 11s testos-6d7c98965-jprtl 1/1 Running 1 5h7m
带控制器deploy的资源文件
pod和控制器之间靠标签关联
kubectl explain 帮助信息
规则:
大驼峰首字母大写,小驼峰首字母小写
键值对:key (小驼峰): vlaue(大驼峰)
[root@master ~]# vim myapache.yaml
kind: Deployment #当前创建资源类型
apiVersion: apps/v1 #当前格式的版本
metadata: #当前资源元数据
name: myapache #deployment的名字
annotations: kubernetes.io/change-cause: httpd.v1 spec: #当前资源的详细定义
selector: #资源匹配选择器
matchLabels: #匹配卷标
myapp: httpd #名称
replicas: 1 #pod副本数量
template: #资源模板
metadata: #元数据
labels: #标签
myapp: httpd #定义标签,在其他地方被引用
spec: #容器详细定义
containers: #容器定义
- name: webcluster #容器名称 image: 192.168.1.100:5000/myos:httpd #镜像地址 stdin: false #标准输入,默认false tty: false #终端,默认false ports: #定义端口 - protocol: TCP #服务使用协议 containerPort: 80 #监听端口号 restartPolicy: Always #重启策略
[root@master ~]# kubectl apply -f myapache.yaml deployment.apps/myapache created [root@master ~]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE myapache 1/1 1 1 12s testos 1/1 1 1 5h8m
kubectl run aaa -- dry-run -o yaml #假装运行,输出资源文件
集群管理
扩容与缩减
[root@master ~]# kubectl get deployments.apps #创建集群
NAME READY UP-TO-DATE AVAILABLE AGE myapache 1/1 1 1 43m testos 1/1 1 1 5h51m [root@master ~]# kubectl scale deployment myapache --replicas=3 #集群扩容 deployment.apps/myapache scaled
[root@master ~]# kubectl get deployments.apps #查看集群
NAME READY UP-TO-DATE AVAILABLE AGE myapache 2/3 3 2 43m testos 1/1 1 1 5h52m [root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE myapache-7d689bf8f-6rbgp 1/1 Running 0 44m myapache-7d689bf8f-9qqj6 1/1 Running 0 37s myapache-7d689bf8f-trgg2 1/1 Running 0 37s mypod 1/1 Running 0 45m testos-6d7c98965-jprtl 1/1 Running 1 5h52m
集群滚动和更新
重建式更新
滚动式更新
undo 回滚
history 查看历史版本
[root@master config]# kubectl rollout history deployment myapache #查看历史版本 deployment.apps/myapache REVISION CHANGE-CAUSE 1 <none>
[root@master ~]# curl http://10.244.2.4 #测试
this is apache
[root@master ~]# kubectl edit deployments.apps myapache deployment.apps/myapache edited
[root@master ~]# curl http://10.244.2.4 #测试,
Nginx this is nginx
[root@master ~]# kubectl rollout history deployment myapache deployment.apps/myapache REVISION CHANGE-CAUSE 1 <none> 2 <none>
[root@master ~]# kubectl rollout undo deployment myapache --to-revision=1 #回滚
deployment.apps/myapache rolled back
[root@master ~]# curl http://10.244.3.4 this is apache
集群调度
如果添加了选择标签,无法使用该主机,则状态一直为pending
nodeSelector标签 为目标主机打上特定标签,不同标签之间用逗号分隔
写在配置文件中用YAML格式
[root@master ~]# vim myapache.yaml #在配置文件中添加
spec: nodeName: node-0001 # 新增一行
[root@master ~]# kubectl delete -f myapache.yaml #删除myapache容器
deployment.apps "myapache" deleted
[root@master ~]# kubectl get nodes --show-labels #查看标签
[root@master ~]# vim myapache.yaml #修改配置文件
spec: nodeSelector: # 新添加 disktype: ssd # 新添加
[root@master ~]# kubectl scale deployment myapache --replicas=3 #测试
[root@master ~]# kubectl get pod -o wide #查看
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mypod 1/1 Running 0 122m 10.244.2.3 node-0003 <none> <none> testos-6d7c98965-jprtl 1/1 Running 1 7h10m 10.244.2.2 node-0003 <none> <none>
[root@master ~]# kubectl delete -f myapache.yaml
[root@master ~]# kubectl label nodes node-0002 node-0003 disktype- #删除标签
node/node-0002 labeled node/node-0003 labeled
[root@master ~]# kubectl get nodes --show-labels #查看标签
NAME STATUS ROLES AGE VERSION LABELS master Ready master 10h v1.17.6 kubernetes.io/hostname=master ... ... node-0001 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0001 ... ... node-0002 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0002 ... ... node-0003 Ready <none> 10h v1.17.6 kubernetes.io/hostname=node-0003 ... ...