本文已参与「新人创作礼」活动,一起开启掘金创作之路。
kubernetes基本命令
[root@master ~]# kubectl get ns #查看所有名称空间
[root@master ~]# kubectl get pods -n kube-system #查看kube-system空间的pod
[root@master ~]# kubctl get deployment #查看系统中创建的deployment
[root@master ~]# kubectl get nodes #查看node状态
[root@master ~]# kubectl get nodes -o wide #查看更多详细node信息
[root@master ~]# kubectl get nodes master node1 -o wide #单独制定一个或者多个,空格隔开
[root@master ~]# kubectl get pod -A #查看所有pod
[root@master ~]# kubectl get pods --show-lables #显示pod时,并显示标签
[root@master ~]# kubectl get service #查看service信息,-A详细信息,service缩写svc
[root@master ~]# kubectl get namespace
[root@master ~]# kubectl describe node node1 #查看API对象细节信息
[root@master ~]# kubectl cluster-info #集群状态信息
[root@master ~]# kubectl get cs #查看各组件信息,监控状态
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
[root@master ~]# kubectl explain pod/service
[root@master ~]# kubectl delete ns (名字) #删除
[root@master ~]# kubectl delete -f *.yaml(文件名字) #删除
[root@master ~]# kubectl api-versions #api查询
[root@master ~]# kubectl describe pods nginx #查看pod里面的错误信息
[root@master ~]# kubectl label pods --show-labels #查看标签
[root@master ~]# kubectl label pods nginx release=app #打一个标签
[root@master ~]# kubectl get pods -l app=myapp -w #显示滚动更新
[root@master ~]# kubectl get rs -o wide #显示滚动历史版本
K8s名称空间
#编写yaml文件
vim namespace.yml
---
apiVersion: V1
Kind: Namespace
metadata:
name: ns-monitor
labels:
name: test
#大部分资源的配置清单:
apiVersion: group/version # kubectl api-version查看支持的apiVersion
kind: 资源类别
metadata: 元数据
name
namespace
labels
annotations
spec: 期望状态,disired state
status: 当前状态,current state,本字段由kubernetes集群维护;
[root@master ~]# kubectl apply -f namespace.yml #创建
[root@master ~]# kubectl get namespace #查看名称空间
[root@master ~]# kebectl create ns testns
[root@master ~]# vim pod.yml
---
apiVersion: v1 #api版本,支持pod的版本
kind: Pod #Pod,定义类型注意语法开头大写
metadata: #元数据
name: website #这是pod的名字
labels:
app: website #自定义,但是不能是纯数字
spec: #指定的意思
containers: #定义容器
- name: test-website #容器的名字,可以自定义
image: daocloud.io/library/nginx #镜像
ports:
- containerPort: 80 #容器暴露的端口
生命周期的介绍
Pending:此状态表示Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中(准备状态)。但这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。
Running:此状态表示Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正在运行中。
Succeeded:此状态表示 Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。
Failed:此状态表示 Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的 Events 和日志。
Unknown:这是一个异常状态(未知状态),表示 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题
其他状态
CrashLoopBackOff: 容器退出,kubelet正在将它重启
InvalidImageName: 无法解析镜像名称
ImageInspectError: 无法校验镜像
ErrImageNeverPull: 策略禁止拉取镜像
ImagePullBackOff: 正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull: 通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError: 启动容器失败
PostStartHookError: 执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady: 容器没有准备完毕
ContainerCreating:容器创建中
PodInitializing:pod 初始化中
DockerDaemonNotReady:docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
pod的创建,进入,删除
#通过pod名称,进入Pod对应的容器内部
[root@kub-k8s-master prome]# kubectl exec -it website /bin/bash
root@website:/#
#删除pod
[root@kub-k8s-master prome]# kubectl delete pod pod名1 pod名2 //单个或多个删除
[root@kub-k8s-master prome]# kubectl delete pod --all //批量删除
举例:
[root@kub-k8s-master prome]# kubectl delete pod website
pod "website" deleted
[root@kub-k8s-master prome]# kubectl delete -f pod.yaml
pod "website" deleted
#创建pod
[root@kub-k8s-master prome]# kubectl apply -f pod.yaml #指定创建pod的yml文件名
[root@k8s-master prome]# kubectl apply -f pod.yaml --validate 想看报错信息,加上--validate参数
#重新启动基于yaml文件的应用(这里并不是重新启动服务)
# kubectl delete -f XXX.yaml #删除
# kubectl apply -f XXX.yaml #创建
create与apply的区别:
create创建的应用如果需要修改yml文件,必须先指定yml文件删除,在创建新的pod。
如果是apply创建的应用可以直接修改yml文件,继续apply创建,不用先删掉。
创建nginx的pod
#nodeName:是一个供用户将 Pod 与 Node 进行绑定的字段,用法:
[root@master ~]# vim nginx.yml
---
apiVersion: v1 #api版本,支持pod的版本
kind: Pod #Pod,定义类型注意语法开头大写
metadata: #元数据
name: website #这是pod的名字
labels:
app: website #自定义,但是不能是纯数字
spec: #指定的意思
nodeName: node2 #是一个供用户将Pod与Node进行绑定的字段
containers: #定义容器
- name: test-website #容器的名字,可以自定义
image: daocloud.io/library/nginx #镜像
ports:
- containerPort: 80 #容器暴露的端口
[root@master ~]# kubectl apply -f pod.yml
pod/website created
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
website 1/1 Running 0 3m13s 192.168.2.2 node2 <none> <none>
[root@master prome]# kubectl describe node node1 #查看node1的详细信息
Name: node1
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node1
kubernetes.io/os=linux
......
#"nodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段",通过指定标签来指定
#选择labels中的一个唯一标签来制定。替换nodeName:node2的位置
nodeSelector: #指定标签
kubernetes.io/hostname: node1
POD 的恢复策略
Pod 的恢复策略:
可以通过设置 restartPolicy,改变 Pod 的恢复策略。一共有3种:
1. Always: 在任何情况下,只要容器不在运行状态,就自动重启容器。
2. OnFailure: 只在容器异常时才自动重启容器。
3. Never: 从来不重启容器。
实际使用时,需要根据应用运行的特性,合理设置这三种恢复策略。
探针
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: dafault
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30;rm -f /tmp/healthy;sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 1
periodSeconds: 3
#探针的三种模式
exec:
httpGet:
port: 80
path: /index.html
tcpsocket:
periodSeconds #默认探测间隔时长10s
initialDelaySeconds #启动后延迟探测时间,默认启动就探测
默认连续三次失败,才是真的失败
pod控制器
#replicas: 自动支持扩缩容,始终保持定义数量。1、用户期望的pod数,2、标签选择器,管理pod的副本,3、标签选择器选择的数量,少于或者多于,pod的资源模板来完成pod的新建。
#Deployment:支持滚动更新,回滚--目前来说最好的控制器
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
滚动更新,并暂停
[root@master ~]# kubectl set image deployment myapp=deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp=deploy #滚动更新,并暂停
[root@master ~]# kubectl get pods -l app=myapp -w #持续显示更新状态
[root@master ~]# kubectl rollout status deployment myapp-deploy #显示更新状态
[root@master ~]# kubectl get rs -o wide #显示版本
[root@master ~]# kubectl rollout history deployment myapp-deploy #显示历史版本
[root@master ~]# kubectl rollout undo deployment myapp-deploy --to-revision=1 #制定回退版本,默认为上一个版本
\