kubernetes基本命令

200 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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   #制定回退版本,默认为上一个版本

\