Kubernetes命令

k = kubectl

2. 开始使用Kubernetes和Docker

  • busybox是一个单一可执行文件,包含多种标准的UNIX命令行工具,如:echo,ls, gzip等,除了包含echo命令的busybox命令,也可以使用如Fedora,Ubuntu等功能完备的镜像

    使用docker run命令然后指定需要运行的镜像的名字,以及需要执行的命令(可选)

    docker run busybox echo "Hello World"
    
  • 运行镜像

    docker run <image>
    docker run <image>:<tag>
    
  • 构建镜像

    docker build -t <image-name> .
    
  • docker images
    
  • 运行镜像

    docker run --name <container-name> -p 8080:8080 -d <image-name>
    
  • docker ps
    
  • docker ps只会展示容器的基本信息,使用docker inspect获得更多信息

    docker inspect <container-name>
    
  • 容器内部执行shell

    docker exec -it <container-name> bash
    
  • 停止容器

    docker stop <container-name>
    
  • 删除容器

    docker rm <container-name>
    
  • 使用附加标签标注镜像

    docker tag <old-image-name> <new-image-name>
    

    多了一个镜像(new-container-name),实际上两个是同一个镜像,只不过是同一个镜像的两个标签

  • 向dockerHub推送镜像

    docker push <image-name>
    
  • 展示集群信息

    k cluster-info
    
  • 在GKE上创建一个三节点集群

    gcloud container clusters create kubia --num-nodes 3 --machine-type f1-micro
    
  • k get nodes
    
  • 登入某一个节点内部,查看节点上运行了什么

    gcloud compute ssh <node-name>
    
  • 查看对象的更多信息

    k describe node <node-name>
    
  • k get pods
    k get pods -a (或 --show-all)
    
  • 部署一个应用

  • k run kubia --image=luksa/kubia --port=8080 --generator=run/v1   --创建rc
    k run kubia --image=luksa/kubia --port=8080 --generator=run-pod/v1  --command  -- sleep infinity   --直接创建一个pod
      
    image:指定要运行的容器镜像
    port:应用正在监听8080端口
    generator: 告诉k8s创建一个rc而不是deployment
    
  • 创建一个服务对象

    k expose rc kubia --type=LoadBalance --name kubia-http
    
  • k get service/svc
    
  • 增加期望的副本数

    k scale rc kubia --replicas=3
    
  • 列出pod时显示podIP和所在节点

    k get pods -o wide
    

3. 运行于kubernetes中的容器

  • 得到一个资源的yaml描述文件

    k get pods <pod-name> -o yaml/json
    
  • 从yaml文件创建资源

    k create -f --.yaml
    
  • 查看容器日志,进入pod运行以下命令

    docker logs <container id>
    
  • 或者直接

    k logs <pod name>
    
  • 获取多容器pod日志,通过-c指定容器

    k logs <pod name> -c <container name>
    
  • 如果想要在不通过service的情况下于某个特定的pod通信,k8s允许我们配置端口转发到该pod,例如以下命令将本地端口8888转发到kubia-manual pod的8080端口

    k port-forward kubia-manual 8888->8080
    
  • 查看pod时列出标签

    k get pod --show-labels
    
  • 如果只对某些标签感兴趣,用-L指定

    k get pods -L creation_method, env
    

    只要求列出creation_methosenv两个标签的值

  • 为现有pod添加标签

    k label po <pod name> newlabel=value  (node同样)
    
  • 修改pod的标签

    k label po <pod name> env=debug --overwrite
    
  • 标签选择器

    k get pods -L env=debug  (L可以小写)
    pod可以与标签选择器如下匹配:
    a. env!=debug  --选择带有env标签,并且值不等于debug的pod
    b. k get po -l '!env'  --列出没有env标签的pod,确保使用单引号来圈引!env,这样bash shell才不会    解释感叹号(感叹号在bash中有特殊含义,表示事件指示器)
    c. env in (prod,debug)  --选择带有env标签且值为prod或debug的pod
    d. env notin (prod,debug)  --选择带有env标签,但其值不是prod或debug的pod
    
  • 添加和修改注解

    k annotate pod <pod-name> mycompany.com/someannotation="foo bar"
    
  • k get ns
    
  • k get po --namespace kube-system   --特定命名空间的pod
    
  • 创建命名空间

    k create namespace custom-namespace
    
  • 创建资源时指定命名空间

    k create -f ~~.yaml -n namespace-name
    
  • 按名称删除pod

    k delete po kubia-gpu
    
  • 使用标签选择器删除pod

    k delete po -l creation_method=manual
    
  • 删除整个命名空间

    k delete ns custom-namespace
    
  • 删除命名空间中的所有pod,但保留命名空间

    k delete po --all
    
  • 删除命名空间中的所有资源

    k delete all --all
    
  • 想看上一个容器是因为什么终止的

    k logs mypod --previous
    

4. 副本机制和其他控制器:部署托管的pod

  • 编辑rc

    k edit rc kubia
    
  • 删除rc时,通过–cascade=false保持pod的运行

    k delete rc kubia --cascade=false
    
  • k get rs
    
  • replicaSet与标签选择器

    selector:
      matchLabels: 
        app: kubia
    ...
    或
    selector:
      matchExpressions:
        - key: app         --必须包含该标签
          operation: In
          values: 
            - kubia      --标签的值必须是kubia
    ...
    
    选择器的运算符
    In: Label的值必须与其中一个指定的values匹配
    NotIn:Label的值与任何指定的values不匹配
    Exists: pod必须包含一个指定名称的标签(值不重要),使用此运算符时,不应指定values字段
    DoesNotExists: pod不得包含有指定名称的标签,values属性不得指定
    如果指定了多个表达式,则所有这些表达式都必须为true才能使选择器与pod匹配
    。如果同时指定matchLabels和matchExpressions,则所有标签都必须匹配,并且所有表达式必须计算为true以使该pod与选择器匹配
    
  • k delete rs kubia
    
  • k get ds/DaemonSet
    
  • job

  • k get jobs
    
  • apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-test
    spec: 
      completions: 5   --必须确保5个job成功完成
      parallelism: 2   --最多两个pod可以并行运行
    
  • Job的缩放

    job的缩放是针对parallelism的
    k scale job job-test --replicas 3   --现在有三个pod在运行了
    

5. 服务:让客户端发现pod并与之通信

  • 在运行的容器中远程执行命令

    k exec kubia-7nog1 -- curl -s http://10.111.249.153
    --:双横杠代表着kubectl命令项的结束,在两个横杠之后的内容是指在pod内部需要执行的命令,如果需要执行的命令并没有以横杠开始的参数,横杠也不是必需的,-s用来告诉kubectl需要连接一个不同的API服务器而不是默认的
    k exec --v=9 kubia-7nog1  ...   ---查看执行过程
    
  • k get endpoints
    
  • k get ingresses
    
  • k apply -f ~~.yaml    --更新资源
    
  • 使用pod执行DNS查找

    k exec <pod-name> nslookup <service-headless-name>
    

7.configMap和Secret:配置应用程序

  • 创建一个简单的字面量条目

    k create configmap <configmap-name> --from-literal=sleep-interval=25
    
    多条目
    k create configmap <configmap-name> --from-literal=foo=bar --from-literal=bar=baz  
        --from-literal=one=two
    
  • 从文件内容创建configmap条目

    k create configmap my-config --from-file=config-file.conf
    

    运行上述命令时,kubectl会在当前目录下查找config-file.conf文件,并将文件内容存储在configmap中以config-file.conf为键名的条件下。当然也可以手动指定键名

    k create configmap my-config --from-file=customkey=config-file.conf
    

    多次使用--from-file可以增加多个文件条目

  • 从文件夹创建configMap

    k create configmap my-config --from-file=/path/to/dir
    

    这种情况下,kubectl会为文件夹中的每个文件单独创建条目,仅限于那些文件名可作为合法ConfigMap键名的文件

9. Deployment:声明式的升级应用

  • 滚动升级

    k rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v2
    
  • 查看部署状态

    k rollout status deployment kubia
    
  • 利用k patch修改单个或少量资源

    k patch deployment kubia -p '{"spec":{"minReadySeconds":10}}'
    
  • 使用kubectl set image命令更改任何包含容器资源的镜像

    k set image deployment kubia nodejs=luksa/kubia:v2
    执行完这个命令,kubia deployment的pod模板内的镜像会被更改为luksa/kubia:v2
    
  • 将原有对象替换为YAML/JSON文件中定义的新对象,与apply相反,运行这个命令前要求对象必须存在,否则会打印错误

    k replace -f kubia-deployment-v2.yaml
    
  • 回滚升级deployment会回滚到上一个版本

    k rollout undo deployment kubia
    
  • 显示升级版本

    k rollout history deployment kubia
    
  • 回滚到一个特定的版本

    k rollout undo deployment kubia --to-revision=1
    
  • 暂停滚动升级

    kubectl rollout pause deployment kubia
    
  • 回复滚动升级

    kubectl rollout resume deployment kubia
    

节点和网络安全

  • 当部署pod时,可以通过--watch标志,每当创建,修改,删除pod时就会通知

    kubectl get pods --watch
    
  • 也可以让kubectl打印出整个监听事件的YAML文件

    kubectl get pods -o yaml --watch
    
  • 查看ServiceAccount资源

    kubectl get sa/serviceaccount
    
  • 查看挂载进pod容器内的token

    进入多容器的pod时用 -c 指定容器
    kubectl exec -it curl-custom-sa -c main cat /var/run..../tokens
    
  • 创建bar命名空间中的一个角色

    k create role service-reader --verb=get --verb=list --resource=services -n bar
    
  • 创建一个rolebinding资源实现角色绑定到主体

    创建一个rolebinding资源,将service-reader角色绑定到命名空间foo中的default serviceaccount

    k create rolebinding test --role=service-reader --serviceaccount=foo:default -n foo
    
  • 创建一个集群角色

    k create clusterrole pv-reader --verb=get,list --resource=persistentvolumes
    
  • 创建一个集群角色绑定

    k create clusterrolebinding pv-test --clusterrole=pv-reader 
    --serviceaccount=foo:default
    

  • 创建一个clusterrole绑定podsecuritypolicy

    k create clusterrole psp-privileged --verb=use --resource=podsecuritypolicies 
    --resource-name=privileged
    
  • 创建一个clusterrolebinding

    k create clusterrolebinding psp-test --clusterrole=psp-privileged --user=test
    
  • 创建PodDisruptionBudget(PDB)资源,确保pod总有三个实例在运行

    k create pdb kubia-pdb --selector=app=kubia --min-available=3
    

高级调度

  • 添加自定义污点

    k taint node node1.k8s node-type=production:NoSchdule
    
    添加一个taint,key为node-type,value为production,效果为NoSchdule
    
  • kubectl cp

    假如有一个pod叫foo-pod,它只有一个容器,并且这个容器有个文件叫做/var/log/foo.log,那么可以使用下面的命令将这个文件传送到本地机器
    kubectl cp foo-pod:/var/log/foo.log foo.log
    

    将文件从本地传送到pod

    kubectl cp localfile foo-pod:/etc/remotefile
    

    如果有多个容器,用-c指定

在多个集群中使用kubectl

  • 添加或修改一个集群

    kubectl config set-cluster my-other-cluster --server=https://k8s.example.com:6443 
    --certificate-authority=path/to/the/cafile
    
    这会添加一个API服务器地址位于https://k8s.example.com:6443,名为my-other-cluster的集群,如果指定的名称已存在,则会覆盖
    
  • 为API服务器添加一个使用用户名和密码认证的用户

    k config set-credentials foo --username=foo --password=pass
    
    若要使用基于token的认证方式
    
    k config set-credentials foo --token=mysecrettokenXFDJIQ1234
    
  • 上下文中定义了哪个用户使用哪个集群,同时也可以定义kubectl应该使用的命名空间,以下命令用于创建新的上下文,并将集群与你创建的用户联系在一起

    k config set-context some-context --cluster=my-other-cluster --user=foo 
    --namespace=bar
    
    这会创建一个名为some-context的上下文,使用my-other-cluster集群和foo用户凭据,默认命名空间为bar
    
  • 获取当前上下文

    k config current-context
    
  • 修改命名空间

    k config set-context some-context --namespace=another-namespace
    
  • 切换上下文

    kubectl config use-context my-other-context
    
  • 列出上下文

    kubectl config get-contexts
    
  • 列出集群

    kubectl config get-clusters
    
  • 删除上下文

    kubectl config delete-context my-unused-context
    
  • 删除集群

    kubectl config delete-cluster my-old-cluster
    

    参考《Kubernetes in action》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值