1. 陈述式管理

1.1 管理命名空间资源

1.1.1 查看命名空间

  1. ~]# kubectl get namespace
  2. NAME STATUS AGE
  3. default Active 2d17h
  4. kube-node-lease Active 2d17h
  5. kube-public Active 2d17h
  6. kube-system Active 2d17h
  7. # 简称(namespace)
  8. ~]# kubectl get ns

1.1.2 查看命名空间内的资源

~]# kubectl get all # (默认default命名空间)
~]# kubectl get all -n default
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         1         6d

NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
svc/kubernetes   10.254.0.1       <none>        443/TCP          7d
svc/mysql        10.254.192.194   <pending>     3306:31174/TCP   6d

NAME             READY     STATUS    RESTARTS   AGE
po/mysql-52b90   1/1       Running   0          6d

1.1.3 创建命名空间

~]# kubectl create namespace app
namespace "app" created

# 作用一样
~]# kubectl create ns app
namespace "app" created

1.1.4 删除命名空间

[root@bogon ~]# kubectl delete namespace app
namespace "app" deleted

1.2 管理Deployment资源

1.2.1 创建deployment

# -n 参数为指定命名空间
kubectl create deployment nginx-dp --image=harbor.od.com/public/nginx:v1.7.9 -n kube-public

# 查看命名空间中的pods
kubectl get pods -n kube-public -o wide

1.2.2 查看deployment资源

  • 简单查看 ```shell kubectl get deploy -n kube-public

[root@hdss7-22 ~]# kubectl get deployment # (查看默认命名空间) No resources found in default namespace.

[root@hdss7-22 ~]# kubectl get deployment -n kube-public NAME READY UP-TO-DATE AVAILABLE AGE nginx-dp 1/1 1 1 18m


- 扩展查看
```shell
[root@hdss7-22 ~]# kubectl get deployment -n kube-public -o wide
NAME       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                              SELECTOR
nginx-dp   1/1     1            1           20m   nginx        harbor.od.com/public/nginx:v1.7.9   app=nginx-dp
  • 详细查看
    [root@hdss7-22 ~]# kubectl describe deployment nginx-dp -n kube-public
    Name:                   nginx-dp
    Namespace:              kube-public
    CreationTimestamp:      Tue, 30 Jun 2020 04:50:43 -0400
    Labels:                 app=nginx-dp
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=nginx-dp
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
    Labels:  app=nginx-dp
    Containers:
     nginx:
      Image:        harbor.od.com/public/nginx:v1.7.9
      Port:         <none>
      Host Port:    <none>
      Environment:  <none>
      Mounts:       <none>
    Volumes:        <none>
    Conditions:
    Type           Status  Reason
    ----           ------  ------
    Available      True    MinimumReplicasAvailable
    Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   nginx-dp-664d646b58 (1/1 replicas created)
    Events:
    Type    Reason             Age   From                   Message
    ----    ------             ----  ----                   -------
    Normal  ScalingReplicaSet  22m   deployment-controller  Scaled up replica set nginx-dp-664d646b58 to 1
    

    1.2.3 查看pod资源

    [root@hdss7-22 ~]# kubectl get pods -n kube-public
    NAME                        READY   STATUS    RESTARTS   AGE
    nginx-dp-664d646b58-2894s   1/1     Running   0          66m
    

    1.2.4 进入pod资源

    ```shell

    和docker exec 一样,进入容器内部

    [root@hdss7-21 ~]# kubectl exec -it nginx-dp-664d646b58-2894s /bin/bash -n kube-public root@nginx-dp-664d646b58-2894s:/#

[root@hdss7-22 ~]# docker exec -it dac212407297 /bin/bash root@nginx-dp-664d646b58-2894s:/# hostname nginx-dp-664d646b58-2894s

<a name="46mCX"></a>
### 1.2.5 删除pod资源(重启)
```shell
[root@hdss7-22 ~]# kubectl delete pod nginx-dp-664d646b58-2894s -n kube-public
pod "nginx-dp-664d646b58-2894s" deleted

# 已经自动创建了一个新的 (name发生了变化)
[root@hdss7-22 ~]# kubectl get pod -n kube-public
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dp-664d646b58-j7j2w   1/1     Running   0          64s

watch -n 1 'kubectl describe deployment nginx-dp -n kube-public' |grep -C 5 Event 可以使用watch监听 变化 强制删除:—force —grace-period=0

1.2.6 删除deployment

pod控制器

# 删除pod控制器
kubectl delete deployment nginx-dp -n kube-public

# 进行查看
[root@hdss7-21 ~]# kubectl get deployment -n kube-public
[root@hdss7-21 ~]# kubectl get pods -n kube-public

1.3 管理Service服务

1.3.1 创建service

[root@hdss7-21 ~]# kubectl expose deployment nginx-dp --port=80 -n kube-public
service/nginx-dp exposed

#  ClusterIP   192.168.202.253 就是统一接入点
[root@hdss7-21 ~]# kubectl get all -n kube-public
NAME                            READY   STATUS    RESTARTS   AGE
pod/nginx-dp-664d646b58-ktxmb   1/1     Running   0          2m58s

NAME               TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
service/nginx-dp   ClusterIP   192.168.202.253   <none>        80/TCP    30s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-dp   1/1     1            1           2m58s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-dp-664d646b58   1         1         1       2m58s

# 测试服务 正常访问
[root@hdss7-22 ~]# curl -I 192.168.202.253
HTTP/1.1 200 OK
Server: nginx/1.7.9
Date: Tue, 30 Jun 2020 10:40:28 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Dec 2014 16:25:09 GMT
Connection: keep-alive
ETag: "54999765-264"
Accept-Ranges: bytes


# 复制一份pod
[root@hdss7-22 ~]# kubectl scale deployment nginx-dp --replicas=2 -n kube-public

1.3.2 查看service信息

[root@hdss7-22 ~]# kubectl describe svc nginx-dp -n kube-public
Name:              nginx-dp
Namespace:         kube-public
Labels:            app=nginx-dp
Annotations:       <none>
Selector:          app=nginx-dp
Type:              ClusterIP
IP:                192.168.202.253
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         172.7.22.3:80
Session Affinity:  None
Events:            <none>

1.4 kubectl总结

意思总结为: kubectl是一种命令行工具, 他的真实作用就是实现:

命令参数的方法调用apiserver,中间经过apiserver的规则,将命令和参数转换为apiserver的信息(例如json),已供apiserver使用 kubectl --help 中文文档:http://docs.kubernetes.org.cn

缺点:命令冗余 复杂 难以记忆 特定场景下,不能实现需求

2. 声明式管理

声明式管理方法依赖于—资源管理配置清单(yaml/json)

2.1 查看资源配置清单

~]# kubectl get pods nginx-dp-664d646b58-ktxmb -o yaml -n kube-public
~]# kubectl get service nginx-dp -o yaml -n kube-public

2.2 解释资源配置清单

~]# kubectl explain service.metadata

2.3 创建资源配置清单

vim nginx-ds-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-ds
  labels:
    name: nginx-ds
spec:
  ports:
  - port: 880          #这里的端口和clusterIP(10.97.114.36)对应,即10.97.114.36:80,供内部访问。
    targetPort: 80  #端口一定要和container暴露出来的端口对应,nodejs暴露出来的端口是8081,所以这里也应是8081
    protocol: TCP
  selector:
    app: nginx-ds          #这里选择器一定要选择容器的标签,之前写name:kube-node是错的。
  type: ClusterIP

2.4 应用资源配置清单

kubectl create -f nginx-ds-svc.yaml

# 作用一样 推荐使用apply
kubectl apply -f nginx-ds-svc.yaml

2.5 修改资源配置清单并应用

  • 离线修改 ```shell

    修改 nginx-ds-svc.yaml 文件,并使用:kubectl apply -f nginx-ds-svc.yaml 使之生效

    vim nginx-ds-svc.yaml

kubectl apply -f nginx-ds-svc.yaml


- 在线修改
```shell
# 直接使用kubectl edit service nginx-ds 在线编辑资源配置清单并保存生效
kubectl edit service nginx-ds

2.6 删除资源配置清单

  • 陈述式删除

    kubectl delete service nginx-ds -n kube-public
    
  • 声明式删除

    kubectl delete -f nginx-ds-svc.yaml
    

    3. Pod

    3.1 apiversion/kind

    apiVersion: v1
    kind: Pod
    

    3.2 metadata

    metadata
      name        <string>            # 在一个名称空间内不能重复
      namespace   <string>            # 指定名称空间,默认defalut
      labels      <map[string]string> # 标签
      annotations <map[string]string> # 注释,不能作为被筛选
    

    3.3 spec

    spec
      containers  <[]Object> -required-   # 必选参数
          name    <string> -required-     # 指定容器名称,不可更新
          image   <string> -required-     # 指定镜像
          imagePullPolicy <string>        # 指定镜像拉取方式
              # Always: 始终从registory拉取镜像。如果镜像标签为latest,则默认值为Always
              # Never: 仅使用本地镜像
              # IfNotPresent: 本地不存在镜像时才去registory拉取。默认值
          env     <[]Object>              # 指定环境变量,使用 $(var) 引用,参考: configmap中模板
          command <[]string>              # 以数组方式指定容器运行指令,替代docker的ENTRYPOINT指令
          args    <[]string>              # 以数组方式指定容器运行参数,替代docker的CMD指令
          ports   <[]Object>              # 指定容器暴露的端口
              containerPort <integer> -required-  # 容器的监听端口
              name    <string>            # 为端口取名,该名称可以在service种被引用
              protocol  <string>          # 指定协议,默认TCP
              hostIP    <string>          # 绑定到宿主机的某个IP
              hostPort  <integer>         # 绑定到宿主机的端口
          readinessProbe <Object>         # 就绪性探测,确认就绪后提供服务
              initialDelaySeconds <integer>   # 容器启动后到开始就绪性探测中间的等待秒数
              periodSeconds <integer>     # 两次探测的间隔多少秒,默认值为10
              successThreshold <integer>  # 连续多少次检测成功认为容器正常,默认值为1。不支持修改
              failureThreshold <integer>  # 连续多少次检测成功认为容器异常,默认值为3
              timeoutSeconds   <integer>  # 探测请求超时时间
              exec    <Object>            # 通过执行特定命令来探测容器健康状态
                  command <[]string>      # 执行命令,返回值为0表示健康,不自持shell模式
              tcpSocket <Object>          # 检测TCP套接字
                  host <string>           # 指定检测地址,默认pod的IP
                  port <string> -required-# 指定检测端口
              httpGet <Object>            # 以HTTP请求方式检测
                  host    <string>        # 指定检测地址,默认pod的IP
                  httpHeaders <[]Object>  # 设置请求头
                  path    <string>        # 设置请求的location
                  port <string> -required-# 指定检测端口
                  scheme <string>         # 指定协议,默认HTTP
          livenessProbe   <Object>        # 存活性探测,确认pod是否具备对外服务的能力
              # 该对象中字段和readinessProbe一致
          lifecycle       <Object>        # 生命周期
              postStart   <Object>        # pod启动后钩子,执行指令或者检测失败则退出容器或者重启容器
                  exec    <Object>        # 执行指令,参考readinessProbe.exec
                  httpGet <Object>        # 执行HTTP,参考readinessProbe.httpGet
                  tcpSocket <Object>      # 检测TCP套接字,参考readinessProbe.tcpSocket
              preStop     <Object>        # pod停止前钩子,停止前执行清理工作
                  # 该对象中字段和postStart一致
      hostname    <string>                # 指定pod主机名
      nodeName    <string>                # 调度到指定的node节点
      nodeSelector    <map[string]string> # 指定预选的node节点
      hostIPC <boolean>                   # 使用宿主机的IPC名称空间,默认false
      hostNetwork <boolean>               # 使用宿主机的网络名称空间,默认false
      serviceAccountName  <string>        # Pod运行时的服务账号
      imagePullSecrets    <[]Object>      # 当拉取私密仓库镜像时,需要指定的密码密钥信息
          name            <string>        # secrets 对象名
    

    3.4 k8s和image中的命令

    image.png

    3.5 就绪性探测和存活性探测

  • 就绪性探测失败不会重启pod,只是让pod不处于ready状态。存活性探测失败会触发pod重启。

  • 就绪性探测和存活性探测会持续进行下去,直到pod终止。