1. 陈述式管理
1.1 管理命名空间资源
1.1.1 查看命名空间
~]# kubectl get namespaceNAME STATUS AGEdefault Active 2d17hkube-node-lease Active 2d17hkube-public Active 2d17hkube-system Active 2d17h# 简称(namespace)~]# 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 11.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 66m1.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.yaml3. Pod
3.1 apiversion/kind
apiVersion: v1 kind: Pod3.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中的命令
3.5 就绪性探测和存活性探测
就绪性探测失败不会重启pod,只是让pod不处于ready状态。存活性探测失败会触发pod重启。
- 就绪性探测和存活性探测会持续进行下去,直到pod终止。
