第三章 Kubernetes进阶之kubectl管理命令

  一. kubectl管理命令概要

    • 基础命令
      • create 通过文件名或标准输入创建资源
      • expose 将一个新的资源公开为新的service
      • run 在集群中运行一个特定的镜像(创建一个容器)
      • set 在对象上设置特定的功能
      • get 显示一个或多个资源
      • edit 使用默认的编辑器编辑资源
      • delete 通过文件名、标准输入、资源名称、或标签选择器来删除资源
    • 部署命令
      • rollout 管理资源的发布
      • rolling-update 对给定的复制控制器滚动更新
      • scale 扩容或缩容pod数量,Deployment、ReplicaSet、RC、或Job
      • autoscale 创建一个自动选择扩容并设置pod数量
    • 集群管理命令
      • certficate 修改证书资源
      • cluster-info 显示集群信息
      • top 显示资源(cpu/memory/storage)使用。需要部署Heapster运行
      • cordon 标记节点可以调度
      • uncordon 标记节点不可调度 (节点维护情况下使用)
      • drain 驱逐节点上的应用,准备下线(比如机器故障、更换等停机)
      • taint 修改节点taint标记
    • 故障诊断和调试命令
      • describe 显示特性资源或资源组详细信息
      • log 在一个pod中打印一个容器日志,如果pod只有一个容器日志,容器名称是可选的
      • attach 附加到一个运行的容器
      • exec 执行命令到容器
      • port-forward 转发一个或多个本地端口到pod
      • porxy 运行一个porxy到kubernetes api server
      • cp 拷贝文件或目录到容器中
      • auth 检查授权
    • 高级命令
      • apply 通过文件名或标准输入对资源应用配置
      • patch 通过补丁修改、更新资源字段
      • replace 通过文件名或标准输入替换一个资源
      • covert 不同api版本之间转换配置文件
    • 设置命令
      • lable 更新资源上的标签
      • annotate 更新资源上的注释
      • completion 用于实现kubectl工具自动补全
    • 其他命令
      • api-versions 打印受支持的api版本
      • config 修改kubernetes文件(用于访问api,比如配置认证信息等)
      • help 所有帮助命令
      • plugin 运行一个命令行插件
      • version 打印客户端和服务版本信息

  二. kubectl工具管理资源生命周期

  k8s创建资源会自动调用后端node,部署是使用镜像进行部署

  1,创建

#指定名称为nginx 副本数为3 使用镜像为nginx:1.14 端口是80这里的80端口代表的镜像nginx默认的端口80
kubectl run nginx --replicas=3 --image=nginx:1.14 --port=80

   使用run创建deployment会出现以下警告信息

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

  意思是参数--generator=deployment/apps.v1会在将来版本移除,使用kubectl run --generator=run-pod/v1或者kubectl create替代

  使用以上命令创建pod

kubectl run nginx --image=nginx:1.14 --replicas=3 --port=80  --generator=run-pod/v1

  注意:使用该命令创建pod但是不会创建deployment

   针对pod使用以下命令创建对应service

 kubectl expose pod nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service

  参数解释

#创建一个service
#pod nginx 该service对应的pod名称是nginx
#--port=80 k8s中服务之间访问的端口
#--type=NodePort发布类型是NodePort即外部可以访问的端口,会随机生成一个3000以上的端口
#--target-port容器的端口(最根本的端口人口),与制作容器时暴露的端口一致,例如docker.io官方的nginx暴露是80端口
#--name指定service的的名称

  删除以上创建的pod和service继续,没有deployment不需要删除

kubectl delete pod nginx
kubectl delete svc nginx-service

  

  查看创建的pod,正在创建3个副本容器

# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-7bc87ddb4d-47lrr   0/1     ContainerCreating   0          55s
nginx-7bc87ddb4d-4q9nr   0/1     ContainerCreating   0          55s
nginx-7bc87ddb4d-sz8hl   0/1     ContainerCreating   0          55s

   创建成功后状态为running

# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7bc87ddb4d-47lrr   1/1     Running   0          6m
nginx-7bc87ddb4d-4q9nr   1/1     Running   0          6m
nginx-7bc87ddb4d-sz8hl   1/1     Running   0          6m

   实际创建了一个包含三个副本的deployment

# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           6m49s

   2,发布

  创建好的应用需要创建service暴露应用

#创建一个service
#deployment nginx 该service对应的deployment名称是nginx
#--port=80 k8s中服务之间访问的端口
#--type=NodePort发布类型是NodePort即外部可以访问的端口,会随机生成一个3000以上的端口
#--target-port容器的端口(最根本的端口人口),与制作容器时暴露的端口一致,例如docker.io官方的nginx暴露是80端口
#--name指定service的的名称
kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service

   查看,对外暴露了端口为30232

# kubectl get service
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.10.10.1    <none>        443/TCP        3d4h
nginx-service   NodePort    10.10.10.48   <none>        80:30232/TCP   9m8s

   访问 任意node的ip加对应的端口

 

   查看nginx日志

kubectl logs nginx-7bc87ddb4d-sz8hl

   如果查看日志出现错误提示

Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log nginx-7bc87ddb4d-sz8hl)

   解决办法

  绑定一个cluster-admin的权限

kubectl create clusterrolebinding system:anonymous   --clusterrole=cluster-admin   --user=system:anonymous

   3,更新项目

  项目已经部署需要更新

kubectl set image deployment/nginx nginx=nginx:1.15

   会下载镜像滚动更新

  更新完毕查看nginx版本变成1.15了

kubectl describe pod nginx-6f7d58d4cc-9bj74

 

 

   4,回滚

  查看发布过的版本

# kubectl rollout history deployment/nginx
deployment.extensions/nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

   其中最后一个版本即为现在正在运行的版本,比如这里的版本2

  回滚到上一个版本

 kubectl rollout undo deployment/nginx

   指定版本回滚,假如想回滚到版本1

 kubectl rollout undo deploy/nginx --to-revision=1

  回滚后再查看,已经回滚到1版本现在运行的版本是3

# kubectl rollout history deploy/nginx
deployment.extensions/nginx 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

  

 

   5,删除

  项目下线删除

#删除deployment
kubectl delete deployment/nginx
#删除service
kubectl delete svc/nginx-service

  三. kubectl工具远程连接集群

  一般管理k8s集群在master进行管理,把管理工具kubectl拷贝至其他主机无法管理集群,本地没有监听的端口8080

# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

   生产admin证书

# cat admin-csr.json 
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

 

 

   在k8s证书目录下执行生成配置文件,这里连接的IP使用的是VIP 192.168.1.60

kubectl config set-cluster kubernetes \
> --server=https://192.168.1.60:6443 \
> --embed-certs=true \
> --certificate-authority=ca.pem \
> --kubeconfig=config

Cluster "kubernetes" set.

# kubectl config set-credentials cluster-admin \
> --certificate-authority=ca.pem \
> --embed-certs=true \
> --client-key=admin-key.pem \
> --client-certificate=admin.pem \
> --kubeconfig=config

User "cluster-admin" set.

kubectl config set-context default --cluster=kubernetes --user=cluster-admin --kubeconfig=config 

Context "default" created.


kubectl config use-context default --kubeconfig=config 

Switched to context "default".

   生成config配置文件

 

   把该配置文件config拷贝至其他主机例如node即可以加配置文件运行kubectl命令

# kubectl --kubeconfig=config get node
NAME           STATUS   ROLES    AGE     VERSION
192.168.1.65   Ready    <none>   3d22h   v1.13.4
192.168.1.66   Ready    <none>   3d22h   v1.13.4

   把配置文件放在以下目录即可以不加配置文件即可使用

/root/.kube

 

posted @ 2020-03-02 18:10  minseo  阅读(705)  评论(0编辑  收藏  举报