K8s基本命令的使用【消除命令使用困难症,快准狠】

命令

查看node节点

kubectl get node

查看pod节点

kubectl get pod -n kube-system    # 需要使用-n指定要查看的命名空间

查看命名空间

kubectl get ns

切换命名空间

[root@master ~]# kubectl config set-context --current --namespace  kube-system
Context "kubernetes-admin@kubernetes" modified.
[root@master ~]# kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   kube-system

当我们切换了自己所处的命名空间后,我们再次使用查看pod的命令,如果我们想要查看当前命名空间的pod,便不用接任何参数

kubectl get pod

查看命名空间详细信息

kubectl describe namespaces kube-system
Name:         kube-system
Labels:       kubernetes.io/metadata.name=kube-system
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

在命名空间中,有一个quota的概念,这个概念要牵扯到yaml文件,所以这里不过多赘述。

创建命令空间

kubectl create  namespace  test1

查看自己位于哪个集群

kubectl config get-contents
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   

表示用户 kubernetes-admin 在集群 kubernetes 中操作

当命名空间为空时,kubectl 会默认操作 default 命名空间。

创建pod

两种方式

  1. 命令行
  2. yaml

命令行

kubectl run pod1 --image nginx 

他会从网上拉取一个nginx,但由于网络问题,他会拉取失败

[root@master ~]# kubectl get pod
NAME   READY   STATUS             RESTARTS   AGE
pod1   0/1     ImagePullBackOff   0          84s

所以我们删除这个pod

删除pod

kubectl delete pod pod1

批量删除

kubectl delete pod --all

拉取一个镜像,然后指定拉取的镜像创建

crictl pull uhub.service.ucloud.cn/variety/nginx:999

拉取完毕后,使用该镜像再跑一个容器

kubectl run pod1 --image uhub.service.ucloud.cn/variety/nginx:999

如果,你发现创建这个镜像的时候,他没有立马变成Running状态,查看pod的详细情况

[root@master ~]# kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          81s   10.244.166.131   node1   <none>           <none>

因为我刚刚是在master节点上拉取的镜像,但是pod创建在node1节点,可node1节点没有master的nginx镜像,所以他根据指定的地址从网上拉取了这个镜像再创建的。

镜像拉取策略

--image-pull-policy

镜像的拉取策略有三种

Always:不管本地有没有,都会联网检查

IfNotPresent:如果本地有,那么使用本地,如果没有,那么联网下载

Never: 不管本地有没有镜像,都不联网,只使用本地

默认拉取策略:

  • 如果你省略了 imagePullPolicy 字段,并且你为容器镜像指定了摘要, 那么 imagePullPolicy 会自动设置为 IfNotPresent

  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latestimagePullPolicy 会自动设置为 Always

  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always

  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent

yaml文件

--dry-run   # 主要用于测试

三个参数值

--dry-run=server

--dry-run=server:--dry-run主要用于测试当前命令语句,不会真正的在集群里面去执行操作。如果server,当前语句要发送给kube-api组件,这个语句需要拿到后端去模拟运行,后端服务端会生成很多很多参数的。这些参数很多我们用不到。

--dry-run=client	

--dry-run=client:语句就不会发送到后端kube-api,而是直接在客户端本地运行,生成的参数就会少很多,也方便我们去编辑。

--dry-run=none

--dry-run=none: 直接创建pod

使用-o  yaml 生成yaml文件

示例:

[root@master ~]# kubectl run pod3 --image uhub.service.ucloud.cn/variety/nginx:999 --image-pull-policy IfNotPresent  --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod3
  name: pod3
spec:
  containers:
  - image: uhub.service.ucloud.cn/variety/nginx:999
    imagePullPolicy: IfNotPresent
    name: pod3
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

生成一个nginx.yaml文件

kubectl run pod3 --image uhub.service.ucloud.cn/variety/nginx:999 --image-pull-policy IfNotPresent  --dry-run=client -o yaml > nginx.yaml

使用yaml文件创建pod

kubectl create -f nginx.yaml
kubectl apply -f nginx.yaml

二者有何不同?

create用于该资源是首次创建的时候,一旦资源存在,再次使用create直接报错。

apply不管资源是不是首次创建,都可以使用,可以使用apply重复执行。

进入容器

kubectl exec  -ti pod3 -- bash

一个pod如何运行两个容器

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod3
  name: pod3    # pod名
spec:
  containers:
  - image: uhub.service.ucloud.cn/variety/nginx:999
    imagePullPolicy: IfNotPresent
    name: c1    # 容器名
    resources: {}
  - image: uhub.service.ucloud.cn/variety/nginx:999
    imagePullPolicy: IfNotPresent
    name: c2    # 容器名
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
                             

单纯的复制一遍,可以运行吗?

不可以,我们运行的nginx镜像使用端口会冲突,那么如何操作?加个CMD

例如

kubectl run pod3 --image uhub.service.ucloud.cn/variety/nginx:999 --image-pull-policy IfNotPresent  --dry-run=client -o yaml -- sh -c 'sleep 600'  > nginx1.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod3
  name: pod3
spec:
  containers:
  - args:    # 这里的命令将会默认覆盖nginx镜像自带的命令
    - sh
    - -c
    - sleep 600
    image: uhub.service.ucloud.cn/variety/nginx:999
    imagePullPolicy: IfNotPresent
    name: pod3
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

所以当我们想要在一个pod里面创建两个容器的时候,就要为相同镜像指定不同的命令

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod3
  name: pod3
spec:
  containers:
  - args:
    - sh
    - -c
    - sleep 600
    image: uhub.service.ucloud.cn/variety/nginx:999 # 这个容器使用的是sleep
    imagePullPolicy: IfNotPresent
    name: c1
    resources: {}
  - image: uhub.service.ucloud.cn/variety/nginx:999  # 这个容器使用默认CMD
    imagePullPolicy: IfNotPresent
    name: c2
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

那么当一个pod里有两个容器的时候,我进入pod,进入的是哪个容器呢?

默认是第一个容器,可以用命令指定进入哪一个

[root@master ~]# kubectl exec -ti pod3 -- bash
Defaulted container "c1" out of: c1, c2
kubectl exec -ti pod3 -c c2   -- bash

-c 容器名

[!IMPORTANT]

在华为的官方ppt中有这样一句话

一个Pod中包含至少两个容器,其中一个(pause)用来承载Pod的网络,剩余容器用来承载真正的业务,Pod中的容器共享所有的资源

image-20241226172047868

在pod内,有一个叫pasue的容器,这是属于底层,他会承载网络,但是我们使用者其实是看不到的。

pod的重启策略

在yaml文件里面有这样一行参数,管理着pod的重启策略

restartPolicy: Always

三种参数

  • Always:只要容器终止就自动重启容器。
  • OnFailure:只有在容器错误退出(退出状态非零)时才重新启动容器。
  • Never:不会自动重启已终止的容器。
posted @ 2025-04-24 15:33  super派大星  阅读(30)  评论(0)    收藏  举报