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
两种方式
- 命令行
- 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
字段,并且容器镜像的标签是:latest
,imagePullPolicy
会自动设置为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中的容器共享所有的资源
在pod内,有一个叫pasue的容器,这是属于底层,他会承载网络,但是我们使用者其实是看不到的。
pod的重启策略
在yaml文件里面有这样一行参数,管理着pod的重启策略
restartPolicy: Always
三种参数
Always
:只要容器终止就自动重启容器。OnFailure
:只有在容器错误退出(退出状态非零)时才重新启动容器。Never
:不会自动重启已终止的容器。