参考书籍:《Kubernetes权威指南第4版从Docker到Kubernetes实践全接触》
文章目录
一、Pod概念
Pod是k8s的最小单位,里面包含一组容器,其中一个为Pause容器,也称为“根容器”。
Pod里面的多个业务容器共享Pause容器的网络和Volume卷。
Pod是短暂的。
每个Pod都有一个唯一的IP地址,称之为Pod IP。在K8S集群中,一个Pod里的容器与另外主机上的Pod容器能够直接通信
二、定义一个Pod
2.1. YAML文件tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
labels:
name: tomcat
namespace: cka
spec:
containers:
- name: tomcat
image: kubeguide/tomcat-app:v1
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
2.2. 相关解释
apiVersion: v1 #核心API
kind #指明资源类型,此处为Pod
metadata #元数据,用于描述当前资源类型。
metadata.name #Pod的名称为tomcat
metadata.labels.name #定义该Pod有一个名为name=tomcat的标签
metadata.namespace #指定该Pod属于哪个命名空间
spec #定义Pod里面的容器组
spec.containers #定义容器组
containers.name #容器的名字为tomcat
containers.image #容器使用的镜像为kubeguide/tomcat-app:v1
containers.imagePullPolicy #IfNotPresent表示如果本地存在就不去镜像仓库拉取,不存在则拉取
containers.resources #定义容器的资源配额
resources.requests #定义请求的资源,现只支持CPU和内存,此处申请0.25个CPU和64MiB内存,
# 该值必须小于或者等于limits设置的值
resources.limits #资源最多申请0.5个CPU和128MiB内存
containers.ports #定义端口
ports.containerPort #容器应用监听的端口为8080
containers.env #往容器注入环境变量,以KV键值对的形式。此处注入了MYSQL_SERVICE_HOST='mysql'的环境变量
kubectl apply -f tomcat.yaml #创建Pod
2.3. 验证
kubectl get pod --show-labels
Pod的名字为tomcat,且有一个name=tomcat的标签
kubectl describe pod tomcat
容器名为tomcat,使用的镜像为kubeguide/tomcat-app:v1,监听的端口为8080
资源限额及环境变量
表示该镜像已经在本地有了
kubectl exec -it tomcat bash #登陆到Pod的第一个容器,由于这里只有一个业务容器,默认就是tomcat容器
环境变量已成功注入
kubectl get pod -o wide
Pod IP为10.244.1.9
在集群任意主机通过curl 10.244.1.9:8080可以访问
三、静态Pod
概念
静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。不能通过API Server进行管理,无法与RC、Deployment或者
DaemonSet进行关联,并且kubelet无法对它们进行健康检查。
静态Pod总是由kubelet创建,并且总在kubelet所在的Node上运行。
kubeadm搭建的K8s集群,静态Pod的默认配置目录为**/etc/kubernetes/manifests/**,kubelet会定期扫描静态Pod的配置目录,根据目录下的yaml启动或者删除Pod。
可以看到以下这些系统组件均是以静态Pod的形式启动的
静态Pod的配置目录可以通过/var/lib/kubelet/config.yaml
设置,修改staticPodPath的值,然后重启Kubelet即可
创建一个静态Pod
在/etc/kubernetes/manifests/创建如下yaml文件
apiVersion: v1
kind: Pod
metadata:
name: static-pod
labels:
name: static-pod
spec:
containers:
- name: static-pod
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
静态Pod名字后面会带上当前节点的名字
用kubectl删除该Pod,kubectl delete pod static-pod-k8smaster,发现并不能删除,那该怎么删除呢?
直接删除静态Pod的yaml文件即可