Pod
- 一、Pod基本概念
- 二、Pod的使用方式
- pause容器(pod的基础容器)核心功能
- pause容器使得Pod中所有容器可以共享两种资源:网络和存储
- 网络
- 存储
- 三、Pod分类
- 自主式Pod/静态pod
- 控制器管理的Pod
- 四、三种容器
- 五、镜像拉取策略(image PullPolicy)
- 1.IfNotPresent
- 2.Always
- 3.Never
一、Pod基本概念
Pod是k8s中最小的资源管理组件
Pod是最小化运行容器化应用的资源对象
一个Pod代表着集群中运行的一个进程
k8s中大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的
二、Pod的使用方式
一个pod中运行一个容器。k8s管理的是pod二不是直接管理容器
一个pod中同时运行多个容器。他们之间共享资源。这些在同一个pod中的容器可以互相成为一个service单位,比如一个容器共享文件,另一个"sidecar"容器来更新这些文件。pod将这些容器的存储资源作为一个实体来管理。
pod资源中针对各种容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(父容器)pause就是为了管理pod容器间的共享操作。父容器需要能够精确知道如何去创建共享运行环境的容器。还能管理这些容器的生命周期。为了实现这个父容器的构想,k8s中,用pause容器来作为一个Pod中所有容器的父容器。
pause容器(pod的基础容器)核心功能
一、提供整个Pod的Linux命令命名空间的基础
二、启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程),并收回僵尸进程
给pod中的所有应用容器提供网络(共享IP)和存储(共享存储)资源的共享,作为pid=1的进程(init)
pause容器使得Pod中所有容器可以共享两种资源:网络和存储
网络
每个pod都会被分配一个唯一的IP地址。pod中所有容器共享网络空间,包括IP地址和端口。pod内部的容器可以使用localhost互相通信。
Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)
存储
每个pod都有一个特殊的被称为“基础容器”的pause容器。Pod中的所有容器都可以访问共享的Volume。Volume也可以用来持久化pod中的存储资源,以防容器重启后文件丢失。
三、Pod分类
自主式Pod/静态pod
不能自我修复,如果运行的node故障,或是调度器本身故障;pod所在node缺少资源或pod处于维护状态,pod也会被驱逐而且副本数量也会因为达不到期望值而创建型的pod
控制器管理的Pod
被控制管理的pod,有自愈能力,一旦挂了,会重新拉起,而且副本数量会因为达不到期望值而创建新的pod
四、三种容器
pause容器:给pod中的所有应用容器提供网络(共享IP)和存储(共享存储)资源的共享,作为pid=1的进程(init进程),管理整个pod中容器组的生命周期
初始化容器(init容器):阻塞或者延迟应用的容器的启动,可以为应用容器事先提供号运行环境和工具。多个init容器时是串行启动的,每个init容器必须在下一个init容器启动前完成启动和退出
五、镜像拉取策略(image PullPolicy)
1.IfNotPresent
在镜像已经存在的情况下,kubelet将不再去拉取镜像,仅当本地缺失时才从仓库中拉取,默认的镜像拉取策略
2.Always
每次创建pod都会重新拉取,仅使用本地镜像
3.Never
pod不会主动拉取镜像,仅使用本地镜像
注意:对于标签为:latest的镜像,其默认的镜像获取策略即为always,而对于其他镜像,其默认策略为ifnotpresent
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
image: $PRIVATE_IMAGE_NAME
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
EOF
//master01 上操作
kubectl edit deployment/nginx-deployment
......
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.4
imagePullPolicy: IfNotPresent #镜像拉取策略为 IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always #Pod的重启策略为 Always,默认值
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
......
//创建测试案例
mkdir /opt/demo
cd /opt/demo
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
kubectl create -f pod1.yaml
kubectl get pods -o wide
pod-test1 0/1 CrashLoopBackOff 4 3m33s
//此时 Pod 的状态异常,原因是 echo 执行完进程终止,容器生命周期也就结束了
kubectl describe pod pod-test1
......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m10s default-scheduler Successfully assigned default/pod-test1 to 192.168.80.11
Normal Pulled 46s (x4 over 119s) kubelet, 192.168.80.11 Successfully pulled image "nginx"
Normal Created 46s (x4 over 119s) kubelet, 192.168.80.11 Created container
Normal Started 46s (x4 over 119s) kubelet, 192.168.80.11 Started container
Warning BackOff 19s (x7 over 107s) kubelet, 192.168.80.11 Back-off restarting failed container
Normal Pulling 5s (x5 over 2m8s) kubelet, 192.168.80.11 pulling image "nginx"
//可以发现 Pod 中的容器在生命周期结束后,由于 Pod 的重启策略为 Always,容器再次重启了,并且又重新开始拉取镜像
//修改 pod1.yaml 文件
cd /opt/demo
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test1
spec:
containers:
- name: nginx
image: nginx:1.14 #修改 nginx 镜像版本
imagePullPolicy: Always
#command: [ "echo", "SUCCESS" ] #删除
//删除原有的资源
kubectl delete -f pod1.yaml
//更新资源
kubectl apply -f pod1.yaml
//查看 Pod 状态
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod-test1 1/1 Running 0 33s 172.17.36.4 192.168.80.11 <none>
//在任意 node 节点上使用 curl 查看头部信息
curl -I http://172.17.36.4
HTTP/1.1 200 OK
Server: nginx/1.14.2
......
---------- 部署 harbor 创建私有项目 ----------
//在 Docker harbor 节点(192.168.10.23)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version
//上传 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目录中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin/
//部署 Harbor 服务
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.10.23
cd /usr/local/harbor/
./install.sh
//在 Harbor 中创建一个新项目
(1)浏览器访问:http://192.168.10.23 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
(3)填写项目名称为“kgc-project”,点击“确定”按钮,创建新项目
//在每个 node 节点配置连接私有仓库(注意每行后面的逗号要添加)
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"insecure-registries":["192.168.10.23"]
}
EOF
systemctl daemon-reload
systemctl restart docker
//在每个 node 节点登录 harbor 私有仓库
docker login -u admin -p harbor12345 http://192.168.10.23
//在一个 node 节点下载 Tomcat 镜像进行推送
docker pull tomcat:8.0.52
docker images
docker tag tomcat:8.0.52 192.168.10.23/kgc-project/tomcat:v1
docker images
docker push 192.168.10.23/kgc-project/tomcat:v1
//查看登陆凭据
cat /root/.docker/config.json | base64 -w 0 #base64 -w 0:进行 base64 加密并禁止自动换行
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=
//创建 harbor 登录凭据资源清单,用于 K8S 访问 Harbor 私服拉取镜像所需要的密钥权限凭证 secret 资源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: harbor-pull-secret
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0= #复制粘贴上述查看的登陆凭据
type: kubernetes.io/dockerconfigjson
//创建 secret 资源
kubectl create -f harbor-pull-secret.yaml
//查看 secret 资源
kubectl get secret
//创建资源从 harbor 中下载镜像
cd /opt/demo
vim tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-tomcat
spec:
replicas: 2
selector:
matchLabels:
app: my-tomcat
template:
metadata:
labels:
app: my-tomcat
spec:
imagePullSecrets: #添加 K8S 访问 Harbor 私服拉取镜像所需要的 secret 资源选项
- name: harbor-pull-secret #指定 secret 资源名称
ntainers:
- name: my-tomcat
image: 192.168.10.23/kgc-project/tomcat:v1 #指定 harbor 中的镜像名
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-tomcat
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 31111
selector:
app: my-tomcat
//删除之前在 node 节点下载的 Tomcat 镜像
docker rmi tomcat:8.0.52
docker rmi 192.168.10.23/kgc-project/tomcat:v1
docker images
//创建资源
kubectl create -f tomcat-deployment.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-tomcat-d55b94fd-29qk2 1/1 Running 0
my-tomcat-d55b94fd-9j42r 1/1 Running 0
//查看 Pod 的描述信息,可以发现镜像时从 harbor 下载的
kubectl describe pod my-tomcat-d55b94fd-29qk2
//刷新 harbor 页面,可以看到镜像的下载次数增加了