目录
Pod概述
pod网络
pod存储
pod和容器对比
创建pod的方式
pod运行方式分类
Pod的创建
Pod的创建过程
通过kubectl run来创建pod
通过yaml文件创建,yaml文件简单写法
Pod简单操作
Pod的标签labels
Pod的资源配额resource
测试
Pod概述
Kubernetes
Pod | Kubernetes
Pod是Kubernetes中的最小调度单元,k8s都是以pod的方式运行服务的
一个pod可以指定镜像,封装一个或多个容器
pod需要调度到工作节点运行,节点的选择由scheduler调度器实现
pod定义时,会定义init容器、应用容器与业务容器
init用以对主容器做初始化操作,查看服务是否正常
pod网络
kubectl get pods -n kube-system -owide #查看kube-system命名空间中的pod
部分控制节点组件是和管理节点共享ip地址,除此之外的pod都是唯一地址,通过calico网络插件分配
启动Pod时,会先启动⼀个pause 的容器,然后将后续的所有容器都link到这个pause 的容器,以实网络络共享。
同一个pod内的容器会在共享环境中运行,共享同一个IP和端口
pod存储
通过挂在存储卷,可以让所有容器访问共享卷,允许共享数据
pod和容器对比
pod是容器组成的集合,可以作为一个或多个容器的载体,以pod为单位进行调度
创建pod的方式
1.使用yaml文件来创建
2.使用kubectl run创建pod
pod运行方式分类
1、自主式pod:直接定义一个pod资源
kubectl apply -f pod-tomcat.yaml
kubectl get pods -o wide
kubectl delete pods tomcat-test
2、控制器管理的Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。 控制器管理的Pod可以确保Pod始终维持在指定的副本数运行。可以防止误删除
以下是一个举例的yaml文件
apiVersion: apps/v1
kind: Deployment #使用deployment资源控制器
metadata:
name: nginx-test
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx
replicas: 2 #副本数2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: my-nginx
image: xianchao/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Pod的创建
Pod的创建过程
kubectl会寻找环境变量kubeconfig
如果没有这个环境变量,会找/root/.kube/config文件
可以通过kubectl config view查看/root/.kube/config内容
kubectl config view
apiVersion: v1
clusters: #集群
- cluster:
certificate-authority-data: DATA+OMITTED
server: <https://192.168.8.160:6443> #集群控制节点server地址
name: kubernetes
contexts: #当前环境
- context:
cluster: kubernetes #有一个集群kubernetes
user: kubernetes-admin #系统用户
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes #用kubernetes-admin访问kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin #k8s的系统用户,可以访问api-server
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
pod创建过程
1.kubectl apply -f nginx-deploy.yaml
找config文件,基于config文件访问指定的集群,找到api-server,把信息给api-server
2.api-server把kubectl的参数或者yaml的参数,写入etcd
api-server把pod信息给scheduler调度器,调度器进行调度,并且把调度节点的信息写到etcd
3.api-server调用kubelet,kubelet调用容器运行时docker/container
4.容器运行时把pod信息返回给api-server,写入etcd
通过kubectl run来创建pod
kubectl run --help
Usage:
kubectl run NAME --image=image [--env="key=value"] [--port=port]
[--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND]
[args...] [options]
kubectl run tomcat --image=ws/tomcat --image-pull-policy='IfNotPresent' \\
--port=8080
通过yaml文件创建,yaml文件简单写法
#yaml的帮助命令
kubectl explain pod
#查看metadata下的字段可写的选项
kubectl explain pod.metadata
#底下还有网址,可以找到更多信息
yaml的格式:每个字段都比上级字段多空两格,加短横-可以表示以下同级
#first-pod
vim first-pod
apiVersion: v1 #api版本-v1
kind: Pod #类型为Pod,必须大写
metadata: #类型是object,对象类型,说明底下还有另外字段
annotations: #是注释,用以说明,没有实质意义,<map[string]string> 形式为键值对且都是字符串
worker: "ws"
labels: #标签,字符串键值对
app: tomcat
name: ws-tomcat #pod的名字,最好带有功能描述
namespace: default #ns,命名空间归属,不同环境的资源放入不同的ns内,kubectl get ns
spec: #对象类型,有另外字段
activeDeadlineSeconds: #pod存活的最长时间段,可选
containers: #kubectl explain pod.spec.containers,带有required就是必选
- name: tomcat #容器名
image: docker.io/library/tomcat #镜像名称
imagePullPolicy: IfNotPresent #镜像拉取策略
#Always只在公网上拉取
#IfNotPresent先本地,再公网
#Never只用本地
ports: #kubectl explain pod.spec.containers.ports
- containerPort: 8080
hostPort: #映射到物理机的端口
hostIP: #映射到物理机的IP
#应用
kubectl apply -f pod-first.yaml
#pod/ws-tomcat created
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-test-5b48846ff4-7n4f6 1/1 Running 0 122m
nginx-test-5b48846ff4-mq5tm 1/1 Running 0 122m
ws-tomcat 1/1 Running 0 50s
Pod简单操作
#进入pod
kubectl exec -it ws-tomcat -- /bin/bash
#进入pod中的指定容器,-c指定容器
kubectl exec -it ws-tomcat -c tomcat -- /bin/bash
#看所有pod
kubectl get pod
#看所有pod带IP
kubectl get pod -owide
#在k8s集群内都可以访问pod,同网段的非k8s集群主机就不行
master1 2 node1 2都可以访问pod
#指定podIP与端口就能访问到容器的指定端口
curl 10.10.234.68:8080
#指定pod的label查找
kubectl get pod -l app=tomcat
#查看pod日志
kubectl logs ws-tomcat
#查看pod详细信息
kubectl describe pods ws-tomcat
#删除pod
kubectl delete pods ws-tomcat
kubectl delete -f pod-first.yaml
#pod可以通过kubectl apply -f进行pod的动态更新
kubectl apply -f pod-first.yaml
#展示默认命名空间下pod的标签
kubectl get pods --show-labels
Pod的标签labels
标签label是一个键值对,能够通过标判断对象的特点,可以一开始创建pod的时候打标签,也可以创建之后打,大部分资源都可以打标签
#通过也可以yaml文件创建labels
#命令行打标签
kubectl label pods ws-tomcat user=ws
#查看默认命名空间下的pod的标签
kubectl get pods --show-labels
#指定pod查看标签
kubectl get pods ws --show-labels
#查找key是user的pod
kubectl get pods -l user
NAME READY STATUS RESTARTS AGE
ws-tomcat 1/1 Running 0 5m
#查找key是user,值是ws的pod
kubectl get pods -l user=ws
#查找key是userd的pod,显示标签
kubectl get pods -L user
NAME READY STATUS RESTARTS AGE USER
nginx-test-5b48846ff4-7n4f6 1/1 Running 1 (68m ago) 28h
nginx-test-5b48846ff4-mq5tm 1/1 Running 1 (68m ago) 28h
tomcat-test 1/1 Running 0 7m3s
ws-tomcat 1/1 Running 0 6m49s ws
#查找所有ns下所有pod的标签
kubectl get pods --all-namespaces --show-labels
Pod的资源配额resource
命名空间(Namespace)是Kubernetes中用于隔离和组织资源的一种机制。它可以将集群中的资源划分为逻辑上独立的单元,使不同的团队、项目或应用程序可以在同一个集群中共享底层基础设施,同时保持彼此之间的隔离性。
通过使用命名空间,将不同的资源(如Pod、Service、Deployment等)组织在一起,并为它们提供唯一的名称。这样可以避免资源名称的冲突,并提供更好的资源管理和权限控制。
下面的内容将以pod为例演示ns资源配额的方式
配额指令与yaml文档写法通过kubectl explain的多级帮助目录都可以找到,也可以在k8s官网对应界面找到
#创建命名空间,名为ws
kubectl create ns ws
#查看命名空间
kubectl get ns
NAME STATUS AGE
default Active 18h
kube-node-lease Active 18h
kube-public Active 18h
kube-system Active 18h
ws Active 7s
#创建命名空间资源配额,可以限制pod资源的总和
#帮助文件
kubectl explain resourcequota
kubectl explain resourcequota.metadata
kubectl explain resourcequota.spec
#创建限制yaml文件
vim ns-quota.yaml
apiVersion: v1
KIND: ResourceQuota
metadata:
name: cpu-quota
namespace: ws #指定要进行限制的ns
spec: #<https://kubernetes.io/docs/concepts/policy/resource-quotas/>
hard:
limits.cpu: "4" #最多用4核
limits.memory: 4Gi #最多用4G
requests.cpu: "2" #需要至少2核
requests.memory: 2Gi #需要至少2G
kubectl apply -f ns-quota.yaml
#查看资源配额
kubectl get resourcequota -n ws
NAME AGE REQUEST LIMIT
cpu-quota 75s requests.cpu: 0/2 limits.cpu: 0/4
测试
创建一个带有resource的pod
vim test.yaml
apiVersion: v1
kind: Pod
metadata:
name: test #指定pod名为test
namespace: ws #指定该pod位于ws的ns
spec:
containers:
- name: ws-tomcat2
ports:
- containerPort: 8080
image: tomcat
imagePullPolicy: IfNotPresent
resources:
requests: #指所制定的pod必须要有如下的配置,才能成功调度
memory: 100Mi #至少要有100M内存
cpu: "500m" #500毫核即0.5核,至少要有0.5核CPU
limits: #最多能占用的资源
memory: 2Gi #最多占用2G内存
cpu: "2" #最多占用2核CPU
kubectl apply -f test.yaml
kubectl get resourcequota -n ws #状态正常
NAME AGE REQUEST LIMIT
cpu-quota 33m requests.cpu: 500m/2, requests.memory: 100Mi/2Gi limits.cpu: 2/4, limits.memory: 2Gi/4Gi
修改文件
修改limits:
memory: 6Gi
kubectl apply -f test.yaml
#报错