涨薪技术|Kubernetes(k8s)之Pod端口设置及资源配额

01端口设置

使用以下命令可以可以查看到到ports的子选项

复制代码
[root@k8s-master01 ~]# kubectl explain pod.spec.containers.portsKIND: PodVERSION: v1RESOURCE: ports <[]Object>FIELDS:name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的containerPort<integer> # 容器要监听的端口(0<x<65536)hostPort <integer> # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略)hostIP <string> # 要将外部端口绑定到的主机IP(一般省略)protocol <string> # 端口协议。必须是UDP、TCP或SCTP。默认为"TCP"

在k8s中主要有四例port,分别为:containerPort、port、nodePort、targetPort。

  • port:是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service,也就是说,port是集群内,service之间的访问;

  • nodePort:是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service;

  • targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器;

  • containerPort:是pod内部容器的端口,targetPort映射到containerPort;

所以说外部流量是先经过nodeport进入到service,由targetPort进入到pod里面,再由containerPort进入到容器里面去。

02资源配额

也就是我们 Pod 在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod 调度时使用的资源是 2C4G,那么在调度对应的 node 节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。

容器中的程序要运行,肯定是要占用一定资源,比如 cpu 和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes 提供了对内存和cpu 的资源进行配额的机制,这种机制主要通过 resources 选项实现,他有两个子选项:

  • limits:用于限制运行时容器的最大占用资源,当容器占用资源超过 limits 时会被终止,并进行重启;

  • requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动可以通过上面两个选项设置资源的上下限;

接下来,编写一个测试案例,创建 pod-resources.yaml​​​​​​​

复制代码
apiVersion: v1kind: Podmetadata:name: pod-resourcesnamespace: testspec:containers:- name: nginximage: nginx:1.14resources: # 资源配额limits: # 限制资源(上限)cpu: "2" # CPU限制,单位是core数memory: "10Gi" # 内存限制requests: # 请求资源(下限)cpu: "1" # CPU限制,单位是core数memory: "10Mi" # 内存限制

在这对 cpu 和 memory 的单位做一个说明:

  • cpu:core 数,可以为整数或小数

  • memory:内存大小,可以使用 Gi、Mi、G、M 等形式

    运行Pod[root@dce-10-6-215-215 ~]# kubectl apply -f pod-resources.yamlpod/pod-resources created# 查看发现 pod 运行正常[root@dce-10-6-215-215 ~]# kubectl get pod pod-resources -n zouzouNAME READY STATUS RESTARTS AGEpod-resources 1/1 Running 0 39s# 接下来,停止 Pod[root@dce-10-6-215-215 ~]# kubectl delete -f pod-resources.yamlpod "pod-resources" deleted# 编辑 pod,修改 resources.requests.memory 的值为 10Gi[root@dce-10-6-215-215 ~]# vim pod-resources.yaml# 再次启动 pod[root@dce-10-6-215-215 ~]# kubectl create -f pod-resources.yamlpod/pod-resources created# 查看 Pod 状态,发现 Pod 启动失败[root@dce-10-6-215-215 ~]# kubectl get pod pod-resources -n test -o wideNAME READY STATUS RESTARTS AGEpod-resources 0/1 Pending 0 20s# 查看pod详情会发现,如下提示[root@dce-10-6-215-215 ~]# kubectl describe pod pod-resources -n testType Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling 21s (x3 over 95s) default-scheduler 0/3 nodes areavailable: 1 node(s) had taint {tag: cs},that the pod didn't tolerate, 2 Insufficient cpu.

相关推荐
珂玥c6 小时前
k8s集群网络插件caclico切换为flannel
云原生·容器·kubernetes
测试员周周6 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
Zhu7586 小时前
【问题处理】minIO(AIStor)在k8s部署后,API访问失败的问题,TLS
云原生·容器·kubernetes
临街的小孩7 小时前
Docker 容器内运行 ROS Noetic 图形界面(rqt_image_view)极简教程总结
运维·docker·容器
Altruiste9 小时前
minikube 搭clickhouse 集群
clickhouse·kubernetes
古城小栈10 小时前
通过 Kind 快速构建 k8s 集群
云原生·kubernetes·kind
Apache RocketMQ10 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
smileNicky11 小时前
Docker 部署 SpringBoot 项目超详细教程
spring boot·docker·容器
珂玥c12 小时前
kubeadm方式部署 k8s 1.21
云原生·容器·kubernetes
小义_13 小时前
【Kubernetes】(十九)监控与升级
云原生·容器·kubernetes