其实怎么使用优雅删除,kubernetes已经在基层做好建设。Kubectl delete:根据 resource名或label删除resource。例如:
kubectl delete po rc-nginx-btv4j kubectl delete po -lapp=nginx-2
当Kubernetes通知node执行docker stop命令,docker会先向容器中PID为1的进程发送 系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的
超时时间(Pod中的terminationGracePeriodSeconds参数值,默认30s),会继续发送 SIGKILL的系统信号强行kill掉进程。
您可以使用--grace-period=<seconds>来覆盖的默认值。
kubectl delete po rc-nginx-btv4j --grace-period=60
要强制删除资源,需指定--force flag,且设置周期为0。如果执行强制删除Pod,则调 度程序会在节点释放这些Pod之前将新的Pod放在这些节点上,并使之前Pod立即被逐 出。
如下示例表示将强制立马删除pod:
kubectl delete po rc-nginx-btv4j --grace-period=0 --force
须知
执行delete命令时不会检查资源版本,如果在执行delete操作时有人进行了更新操作,
那么更新操作将连同资源一起被删除。
5.7 容器网络带宽限制
背景
同一个节点上的容器会共用主机网络带宽,对容器的网络带宽进行限制,可以有效避 免容器之间相互干扰,提升容器间的网络稳定性。
适用场景
所有工作负载类型均支持。
约束与限制
● v1.13.10及以上版本且网络模式为容器隧道网络的集群支持此功能。
● v1.17版本的集群暂不支持此功能。
操作步骤
步骤1 编辑工作负载yaml文件。
vi deployment.yaml
根据需要在spec.template.metadata.annotations中设置工作负载实例的网络带宽,
限制容器的网络流量,网络带宽限制字段详解请参见表5-1。
未设置默认不限制。
示例如下:
apiVersion: apps/v1 kind: Deployment metadata:
name: nginx spec:
replicas: 1
selector:
kubernetes.io/ingress-bandwidth: 100M # 出方向网络带宽
kubernetes.io/ingress-bandwidth 工作负载实例入方向网络带宽
取值范围:1k-1P,带宽如果设置大于 32G,实际带宽将等于32G
可选
kubernetes.io/egress-bandwidth 工作负载实例出方向网络带宽
取值范围:1k-1P,带宽如果设置大于 32G,实际带宽将等于32G
可选
步骤2 创建工作负载。
kubectl create -f deployment.yaml 命令行终端显示如下类似信息:
deployment.apps/nginx created
----结束
5.8 使用 hostAliases 配置 Pod /etc/hosts
使用场景
DNS配置或其他选项不合理时,可以向pod的“/etc/hosts”文件中添加条目,使用 hostAliases在pod级别覆盖对主机名的解析。
操作步骤
步骤1 使用kubectl连接集群。
步骤2 创建hostaliases-pod.yaml文件。
vi hostaliases-pod.yaml
Yaml中加粗字段为镜像及镜像版本,可根据实际需求进行修改:
apiVersion: v1 kind: Pod metadata:
name: hostaliases-pod spec:
hostAliases:
- ip: 127.0.0.1 containers:
- name: cat-hosts imagePullSecrets:
- name: default-secret
表5-2 pod 字段说明
参数名 是否必选 参数解释
apiVersion 是 api版本号。
kind 是 创建的对象类别。
metadata 是 资源对象的元数据定义。
name 是 Pod的名称。
spec 是 spec是集合类的元素类型,pod的主体
部分都在spec中给出。具体请参见表 5-3。
表5-3 spec 数据结构说明
参数名 是否必选 参数解释
hostAliases 是 主机别名。
containers 是 具体请参见表5-4。
表5-4 containers 数据结构说明
参数名 是否必选 参数解释
name 是 容器名称。
参数名 是否必选 参数解释
image 是 容器镜像名称。
lifecycle 否 生命周期。
步骤3 创建pod。
kubectl create -f hostaliases-pod.yaml 命令行终端显示如下信息表明pod已创建。
pod/hostaliases-pod created
步骤4 查看pod状态。
kubectl get pod hostaliases-pod
pod状态显示为Running,表示pod已创建成功。
NAME READY STATUS RESTARTS AGE hostaliases-pod 1/1 Running 0 16m
步骤5 查看配置的hostAliases是否正常,执行如下命令:
docker ps |grep hostaliases-pod docker exec -ti 容器ID /bin/sh
----结束
5.9 CCE 容器中域名解析的最佳实践
本文档重点介绍在CCE容器中如何配置域名解析。
服务
● 在创建相应的后端工作负载(Deployment或ReplicaSet),以及在需要访问它的 任何工作负载之前创建服务。 当Kubernetes启动容器时,它提供指向启动容器时
正在运行的所有服务的环境变量。 例如,如果存在名为foo的服务,则所有容器 将在其初始环境中获得以下变量。
FOO_SERVICE_HOST=<the host the Service is running on>
FOO_SERVICE_PORT=<the port the Service is running on>
这确实意味着在顺序上的要求 - 必须在Pod本身被创建之前创建Pod想要访问的任 何Service, 否则环境变量将不会生效。DNS没有此限制。
● 一个可选(当前CCE集群为必选)的集群插件是DNS服务器。DNS服务器为新的 Services监视Kubernetes API,并为每个Services创建一组DNS记录。 如果在整个 集群中启用了DNS,则所有Pods应该能够自动对Services进行名称解析。
● 除非绝对必要,否则不要为Pod指定hostPort。 将Pod绑定到hostPort时,它会限 制Pod可以调度的位置数,因为每个<hostIP, hostPort, protocol>组合必须是唯一 的。 如果您没有明确指定hostIP和protocol,Kubernetes将使用0.0.0.0作为默认 hostIP和TCP作为默认protocol。
如果您只需要访问端口以进行调试,则可以使用apiserver proxy或kubectl port-forward。
如果您明确需要在节点上公开Pod的端口,请在使用hostPort之前考虑使用NodePort 服务。
● 避免使用hostNetwork,原因与hostPort相同。
● 当您不需要kube-proxy负载均衡时,使用无头服务headless-services(ClusterIP被 设置为None)以便于服务发现。