Contents

常用的k8s命令

1. yaml 文件

1.1 创建

$ kubectl create -f 我的配置文件

1.2 修改

更新 yaml 文件:

$ kubectl replace -f nginx-deployment.yaml

声明式的表达方式,使用 apply 命令:

$ kubectl apply -f nginx-deployment.yaml

2. Pod

2.1 查询

获取 pod 的信息

kubectl get pods -n ${namespace}

**根据 pod 的标签过滤 **

kubectl get pods -l app=nginx

注意的是,在命令行中,所有 key-value 格式的参数,都使用“=”而非“:”表示。

获取 pod 的描述信息

$ kubectl describe pod <pod-name>

2.2 登录

进入到 Pod 中:

$ kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash

2.3 删除

删除 Pod:

$ kubectl delete -f nginx-deployment.yaml

2.4. 更新

通过修改yaml文件更新pod

...    
    spec:
      containers:
      - name: nginx
        image: nginx:1.8 #这里被从1.7.9修改为1.8
        ports:
      - containerPort: 80

执行 kubectl replace 命令

$ kubectl replace -f nginx-deployment.yaml

这里更推荐用 kubectl apply 命令,来统一进行 Kubernetes 对象的创建和更新操作


# 修改nginx-deployment.yaml的内容

$ kubectl apply -f nginx-deployment.yaml

2.5 创建一个临时的Pod

$ kubectl run -i --tty --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh 

通过这条命令,我们启动了一个一次性的 Pod,因为–rm 意味着 Pod 退出后就会被删除掉。

3. 日志

3.1. kube-apiserver 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假设控制平面以 Kubernetes 静态 Pod 的形式来运行。如果 kube-apiserver 是用 systemd 管理的,则需要登录到 master 节点上,然后使用 journalctl -u kube-apiserver 查看其日志。

3.2. kube-controller-manager 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假设控制平面以 Kubernetes 静态 Pod 的形式来运行。如果 kube-controller-manager 是用 systemd 管理的,则需要登录到 master 节点上,然后使用 journalctl -u kube-controller-manager 查看其日志。

3.3. kube-scheduler 日志

PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假设控制平面以 Kubernetes 静态 Pod 的形式来运行。如果 kube-scheduler 是用 systemd 管理的,则需要登录到 master 节点上,然后使用 journalctl -u kube-scheduler 查看其日志。

3.4. kubelet 日志

journalctl -l -u kubelet

3.5. Pod 日志

查看指定Pod的日志

kubectl logs <pod-name> -n <namespace>

# 类似 tail -f 的日志
kubectl logs -f <pod-name> -n <namespace>

例子:

# Return snapshot logs from pod nginx with only one container
kubectl logs nginx

# Return snapshot logs from pod nginx with multi containers
kubectl logs nginx --all-containers=true

# Return snapshot logs from all containers in pods defined by label app=nginx
kubectl logs -lapp=nginx --all-containers=true

# Return snapshot of previous terminated ruby container logs from pod web-1
kubectl logs -p -c ruby web-1

# Begin streaming the logs of the ruby container in pod web-1
kubectl logs -f -c ruby web-1

# Begin streaming the logs from all containers in pods defined by label app=nginx
kubectl logs -f -lapp=nginx --all-containers=true

# Display only the most recent 20 lines of output in pod nginx
kubectl logs --tail=20 nginx

# Show all logs from pod nginx written in the last hour
kubectl logs --since=1h nginx

# Show logs from a kubelet with an expired serving certificate
kubectl logs --insecure-skip-tls-verify-backend nginx

# Return snapshot logs from first container of a job named hello
kubectl logs job/hello

# Return snapshot logs from container nginx-1 of a deployment named nginx
kubectl logs deployment/nginx -c nginx-1

4. 污点

一旦某个节点被加上了一个 Taint,即被“打上了污点”,那么所有 Pod 就都不能在这个节点上运行,因为 Kubernetes 的 Pod 都有“洁癖”。

除非,有个别的 Pod 声明自己能“容忍”这个“污点”,即声明了 Toleration,它才可以在这个节点上运行。

为节点打污点(Taint)的命令是:

$ kubectl taint nodes node1 foo=bar:NoSchedule

这时,该 node1 节点上就会增加一个键值对格式的 Taint,即:foo=bar:NoSchedule。其中值里面的 NoSchedule,意味着这个 Taint 只会在调度新 Pod 时产生作用,而不会影响已经在 node1 上运行的 Pod,哪怕它们没有 Toleration。

那么 Pod 又如何声明 Toleration 呢?

我们只要在 Pod 的.yaml 文件中的 spec 部分,加入 tolerations 字段即可:

apiVersion: v1
kind: Pod
...
spec:
  tolerations:
  - key: "foo"
    operator: "Equal"
    value: "bar"
    effect: "NoSchedule"

这个 Toleration 的含义是,这个 Pod 能“容忍”所有键值对为 foo=bar 的 Taint( operator: “Equal”,“等于”操作)。

通常,master 节点上会自带一个污点:

$ kubectl describe node master

Name:               master
Roles:              master
Taints:             node-role.kubernetes.io/master:NoSchedule

可以看到,Master 节点默认被加上了node-role.kubernetes.io/master:NoSchedule这样一个“污点”,其中“键”是node-role.kubernetes.io/master,而没有提供“值”。

此时,你就需要像下面这样用“Exists”操作符(operator: “Exists”,“存在”即可)来说明,该 Pod 能够容忍所有以 foo 为键的 Taint,才能让这个 Pod 运行在该 Master 节点上:

apiVersion: v1
kind: Pod
...
spec:
  tolerations:
  - key: "foo"
    operator: "Exists"
    effect: "NoSchedule"

当然,如果你就是想要一个单节点的 Kubernetes,删除这个 Taint 才是正确的选择:

$ kubectl taint nodes --all node-role.kubernetes.io/master-

如上所示,我们在“node-role.kubernetes.io/master”这个键后面加上了一个短横线“-”,这个格式就意味着移除所有以“node-role.kubernetes.io/master”为键的 Taint。

5. ProjectedVolume

5.1 Secret

5.1.1. 创建

kubectl create secret generic user --from-file=./username.txt

5.1.2 查询

kubectl get secrets

5.2. ConfigMap

5.2.1. 创建

$ kubectl create configmap <configmap-na,e> --from-file=<file-name>

5.22. 查询

kubectl get configmaps <configmap-name> -o yaml