一.资源清单
资源清单组成
apiVersion:v1 #对应不同的k8s版本中的api;
kind:Pod #资源的名称(service、ConfigMap、hpa.....)
metadata: #声明资源的元数据信息(资源的名称)
spec: #使用者期望的运行状态;
--- 代表同一个yaml文件中,多个资源
资源示例
编写资源清单
[root@master pod]# cat 01-pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: m-nginx
spec:
containers:
- name: c-nginx
image: nginx:1.20.1-alpine
创建资源
可以使用create或者apply这两种方式创建
kubectl apply -f 资源清单
kubectl create -f 资源清单
[root@master pod]# kubectl apply -f 01-pod-nginx.yaml
create与apply的区别:
create创建的资源属于固定的资源,后期若想修改只能先delete删除资源,再create创建资源
apply是一种实时更新的创建资源的方式,后期修改完配置文件后,再apply即可。这里若是apply未生效,需要先delete删除资源,再apply -f创建资源
查看资源
[root@master pod]# kubectl get pods -o wide
这里若发现状态不是running,describe查看pod的详细信息
模拟报错使用describe
故意写错镜像的标签,模拟创建pod的ststus不是running的错误
[root@master pod]# cat 01-pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: m-nginx
labels:
wangshuyuan: wsy
wsy: wangshuyuan
spec:
restartPolicy: Always
containers:
- name: c-nginx
image: nginxL:1.20.1-alpine
imagePullPolicy: IfNotPresent
创建资源
[root@master pod]# kubectl apply -f 01-pod-nginx.yaml
pod/m-nginx created
查看pod,发现pod的ststus不是running
[root@master pod]# kubectl get pods -o wide
查看创建pod的详情,在events下有具体的报错信息:
[root@master pod]# kubectl describe pod m-nginx
根据错误提示修改资源清单即可
排查问题步骤
1.发现错误报错
kubectl get 资源类型 资源名 # 发现不是running;
2.查看资源的详细信息
kubectl describe 资源类型 资源名
3.找到问题所在Events字段下的创建过程信息
4.根据问题所在的原因,解决问题
--------------------------------------------------------------------
若describe资源没有发现任何问题,或者其他位置原因,可以先检查集群的节点状态
[root@master pod]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 8d v1.23.17
worker1 Ready <none> 8d v1.23.17
worker2 Ready <none> 8d v1.23.17
二 .pod
pod概述
pod是kubernets中最小的管理管理单位;pod就是一组容器,一个pod中可以有1个或者多个容器;其他资源都是为pod资源提供服务的
pod持久化
1.emptyDir(不推荐使用)
emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被删除
官方解释:
对于定义了 emptyDir 卷的 Pod,在 Pod 被指派到某节点时此卷会被创建。 就像其名称所表示的那样,emptyDir 卷最初是空的。尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。
emptyDir 的一些用途:
缓存空间,例如基于磁盘的归并排序。
为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
emptyDir存储卷的特点:
容器挂掉,数据不会丢失
pod挂掉,数据丢失
1.编写pod资源清单
[root@master demo]# cat 01-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
spec:
containers:
- name: c-demo
image: nginx:1.20.1-alpine
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 01-nginx.yaml
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo 1/1 Running 0 15s 10.100.2.30 worker2 <none> <none>
3.pod中nginx写入静态文件模拟访问
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd /usr/share/nginx/html
/usr/share/nginx/html # echo demo > index.html
/usr/share/nginx/html # exit
[root@master demo]# curl 10.100.2.30
demo
4.模拟容器挂掉
容器挂掉重新加载就没了
通过查看pod详情找到pod挂载的节点(NODE),在对应的节点上删除容器
[root@worker2 ~]# docker ps |grep "c-demo"
a4adf2bdad09 7f18bdc92ca5 "/docker-entrypoint.…" 5 minutes ago Up 5 minutes k8s_c-demo_nginx-demo_default_94b28a9e-cbec-4be3-a00d-da00baeee4cc_0
[root@worker2 ~]# docker rm -f a4adf2bdad09
a4adf2bdad09
5.再次模拟访问
[root@master demo]# curl 10.100.2.30
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
6.重新编辑pod清单挂载存储卷(emptyDir)
[root@master demo]# cat 01-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
spec:
#声明存储卷
volumes:
- name: demo-dir
#声明存储卷类型-emptyDir
emptyDir: {}
containers:
- name: c-demo
image: nginx:1.20.1-alpine
#容器挂载存储卷
volumeMounts:
#挂载存储卷的名称
- name: demo-dir
# 指定挂载的目录
mountPath: /usr/share/nginx/html/
7.创建并查看pod
[root@master demo]# kubectl apply -f 01-nginx.yaml
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo 1/1 Running 0 93s 10.100.2.31 worker2 <none> <none>
8.进入容器挂载目录下写一个静态文件
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd usr/share/nginx/html/
/usr/share/nginx/html # echo demoetest > index.html
/usr/share/nginx/html # exit
9.模拟容器挂掉
[root@worker2 ~]# docker ps |grep "c-demo"
8f90c58f0914 7f18bdc92ca5 "/docker-entrypoint.…" About a minute ago Up About a minute k8s_c-demo_nginx-demo_default_80e6bc07-eb59-4acf-a06c-d60b2b8c2d20_0
[root@worker2 ~]# docker rm -f 8f90c58f0914
8f90c58f0914
10.待容器自动拉起后,再次模拟访问
[root@master demo]# curl 10.100.2.31
demoetest
发现数据未丢失,说明存储卷挂在成功,实现了pod内容器的持久化
---当删除pod后数据还存在吗?
不存在,上面emptyDir的概述说了,pod挂掉,数据也会丢失
hostPath
hostpath存储卷:将物理机节点的目录挂载到pod中,pod意外宕机,或者被误删时,数据不会丢失,可以实现同一个pod中不同容器之间数据共享,同一个人worker节点不同pod之间数据共享;不同worker节点的pod无法共享数据
1.编写pod资源清单,挂载hostpath存储卷
[root@master demo]# cat 02-pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo01
spec:
#指定pod创建在哪个worker节点中
nodeName: worker1
volumes:
- name: hp-01
#声明存储卷类型是hostPath;物理机节点目录挂载
hostPath:
#指定hostPath的路径(物理机挂载路径)
path: /data/pod-volumes
containers:
- name: demo-v1
image: nginx:1.20.1-alpine
volumeMounts:
- name: hp-01
mountPath: /usr/share/nginx/html/
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo01 1/1 Running 0 80s 10.100.1.22 worker1 <none> <none>
3.worker1节点创建挂载目录并写入静态文件
[root@worker1 data]# mkdir -p /data/pod-volumes
[root@worker1 data]# echo demotest > /data/pod-volumes/index.html
4.模拟访问
[root@master demo]# curl 10.100.1.22
demotest
5.模拟删除pod后看数据是否会丢失
[root@master demo]# kubectl delete pods demo01
pod "demo01" deleted
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo01 1/1 Running 0 14s 10.100.1.23 worker1 <none> <none>
[root@master demo]# curl 10.100.1.23
demotest
持久化成功
NFS存储卷
1.所有节点先安装nfs,存储节点配置nfs
yum -y install nfs-utils
2.存储节点创建共享目录
mkdir -p /k8s/data/
3.编辑NFS配置文件
#1.修改配置文件
[root@harbor ~]# cat /etc/exports
/k8s/data *(rw,no_root_squash)
#2.启动并开机自启
[root@harbor ~]# systemctl enable --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
#3.查看nfs共享目录是否存在
[root@harbor ~]# exportfs
/k8s/data <world>
4.存储节点创建要挂载的nfs目录
mkdir /k8s/data/nginx
5.编辑pod资源清单,挂载nfs
[root@master demo]# cat 03-pod-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-nfs
spec:
volumes:
- name: nfs-data
#指定存储卷的类型是nfs
nfs:
#指定nfs在哪个节点
server: harbor
#指定nfs挂在路径
path: /k8s/data/nginx
containers:
- name: demo-v2
image: nginx:1.20.1-alpine
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html
6.创建并查看pod资源
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-nfs 1/1 Running 0 75s 10.100.2.32 worker2 <none> <none>
7.模拟访问
[root@master demo]# curl 10.100.2.32
demotest
8.删除pod重新创建看数据是否会丢失
[root@master demo]# kubectl delete pods demo-nfs
pod "demo-nfs" deleted
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-nfs 1/1 Running 0 4s 10.100.1.24 worker1 <none> <none>
9.再次模拟访问
[root@master demo]# curl 10.100.1.24
demotest
10.创建两个pod,都挂载相同nfs存储卷
[root@master demo]# cat 04-pod-nfs2.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-nfs02
spec:
nodeName: worker1
volumes:
- name: nfs-data
#指定存储卷的类型是nfs
nfs:
#指定nfs在哪个节点
server: harbor
#指定nfs挂在路径
path: /k8s/data/nginx
containers:
- name: demo-v3
image: nginx:1.20.1-alpine
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html
---
apiVersion: v1
kind: Pod
metadata:
name: demo-nfs03
spec:
nodeName: worker2
volumes:
- name: nfs-data
#指定存储卷的类型是nfs
nfs:
#指定nfs在哪个节点
server: harbor
#指定nfs挂在路径
path: /k8s/data/nginx
containers:
- name: demo-v3
image: nginx:1.20.1-alpine
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html
创建查看资源并模拟访问验证结果是否相同
[root@master demo]# kubectl apply -f 04-pod-nfs2.yaml
pod/demo-nfs02 created
pod/demo-nfs03 created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-nfs02 1/1 Running 0 15s 10.100.1.25 worker1 <none> <none>
demo-nfs03 1/1 Running 0 15s 10.100.2.33 worker2 <none> <none>
[root@master demo]# curl 10.100.1.25
demotest
[root@master demo]# curl 10.100.2.33
demotest
nfs存储卷挂载验证成功
pod网络暴露
1.hostNetwork使用宿主机网络
·编辑pod资源清单
[root@master demo]# cat 05-pod-nw.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-nw
spec:
#声明使用宿主机的网络
hostNetwork: true
containers:
- name: demov5
image: nginx:1.20.1-alpine
·创建并查看pod资源,查看IP是否是宿主机IP
[root@master demo]# kubectl apply -f 05-pod-nw.yaml
pod/demo-nw created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-nw 1/1 Running 0 12s 10.0.0.233 worker2 <none> <none>
·浏览器测试访问
2.宿主机端口映射
·编辑pod资源清单
[root@master demo]# cat 06-pod-port.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-port
spec:
containers:
- name: demo00
image: nginx:1.20.1-alpine
#声明容器与宿主机端口映射;
ports:
- name: demo-port
#容器端口
containerPort: 80
#宿主机端口
hostPort: 99
#指定访问协议(默认是TCP协议,可以不写)
protocol: TCP
·创建并查看pod
[root@master demo]# kubectl apply -f 06-pod-port.yaml
pod/demo-port created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-nw 1/1 Running 0 9m8s 10.0.0.233 worker2 <none> <none>
demo-port 1/1 Running 0 12s 10.100.1.26 worker1 <none> <none>
·浏览器测试访问
测试访问宿主机的99端口,看是否能够访问到pod的80端口
pod中容器的环境变量env
我们通过pod资源清单的编写,可以为容器中声明env环境变量
1.编辑pod资源清单
[root@master demo]# cat 07-pod-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-env
spec:
containers:
- name: demo009
image: nginx:1.20.1-alpine
#声明环境变量
env:
#name就是key
- name: demoenv
#value就是value值
value: demoaa
- name: k8s
value: 1.23.7
2.创建并查看pod
[root@master demo]# kubectl apply -f 07-pod-env.yaml
pod/demo-env created
[root@master demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-env 1/1 Running 0 11s 10.100.1.27 worker1 <none> <none>
3.进入到pod容器中,验证变量是否传递成功
[root@master demo]# kubectl exec demo-env -it -- sh
env环境变量传递成功