5 理解k8s中的pod
1 熟悉pod的配置字段一个完整的Pod的资源清单肯定是很多的,但是我显然是记不住的,那么编写yaml文件的时候如果忘记了怎么办呢?使用如下命令:kubectl explain pod这样就能看到FIELDS里面所有可以编写的字段了,如果又不知道metadata里面的字段不清楚,那么继续使用这种格式去追踪即可:kubectl explain pod.metadata2 熟悉pod的配置1、先创建一
1 熟悉pod的配置字段
一个完整的Pod的资源清单肯定是很多的,但是我显然是记不住的,那么编写yaml文件的时候如果忘记了怎么办呢?使用如下命令:
kubectl explain pod
这样就能看到FIELDS里面所有可以编写的字段了,如果又不知道metadata里面的字段不清楚,那么继续使用这种格式去追踪即可:
kubectl explain pod.metadata
2 熟悉pod的配置
1、先创建一个pod-base.yaml文件,内容如下所示:
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
- name: busybox
image: busybox:1.30
将这个pod运行起来
查看这个pod的实际情况:
kubectl get pod pod-base -n test
然而并没有启动起来:
提示我:Container image “busybox:1.30” already present on machine
我记得好像是因为busybox这个容器,如果没有加上command具体执行的命令的话,就会自动退出的。所以这里暂时不管吧。
再写一个pod,用于验证镜像拉取
apiVersion: v1
kind: Pod
metadata:
name: pod-imagepullpolicy
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
imagePullPolicy: Never
- name: busybox
image: busybox:1.30
我这里设置的策略是Nerver,策略的三种含义:
创建完成
使用如下命令查看一下这个pod详情
kubectl describe pod pod-imagepullpolicy -n test
这里还给这个pod挂载了一个serviceaccount,具体后面再看
2、解决busybox为什么启动不来的问题
原因:busybox并不是一个程序,而是类似于一个工具类的集合,启动后会自动关闭,如果要让busybox一直运行,那么需要用到command配置:
apiVersion: v1
kind: Pod
metadata:
name: pod-command
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","touch /tmp/hello.txt; while true; do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]
这个pod里面的busybox容器启动后,会创建/tmp/hello.txt文件,然后不断每隔3秒钟往里面打印日期。
启动看一下:
此时发现已经运行起来了。那么就进入这个pod里的busybox容器看一下吧,命令时
kubectl exec -it pod-command -n test -c busybox /bin/sh
这个命令相当重要,因为一个pod里面是可能有多个容器的,所以需要进入指定的一个容器。此时你可以看下/tmp/hello.txt文件中的内容:
4、环境变量
创建一个如下的Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-env
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","touch /tmp/hello.txt; while true; do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"]
env:
- name: "username"
value: "admin"
- name: "password"
value: "123456"
从yaml文件可以看到,我定义了两个环境变量,分别是username和password,那么先将pod运行起来。
同样进入到这个pod里面的busybox容器里面去看看
kubectl exec -it pod-env -n test -c busybox /bin/sh
然后执行如下命令,输出username和password
echo $username
echo $password
从这里大概可以知道了,env是为了给指定容器配置环境变量的。这样容器启动以后,就可以通过环境变量的方式来获取到对应的值了。这种方式就像docker启动容器的时候的-e参数。
5、端口设置
想想设置端口的作用,先看看上面启动的这个pod的情况:
kubectl describe pod pod-env -n test
从这里可以知道,这个容器启动的commint id是edae12e7ee97be3b6c039893cc94deabd9a8869f96a288ab3396b2b08db63662
那么既然现在k8s用的是docker,那么我应该可以在某个节点上找到这个容器才对。通过docker ps -a 的方式去找找:
果然是能找到这个容器的,但是也没有显示这个容器的虚拟ip和端口呀。该如何确认呢?
难道没有分配端口,意味着这个容器是无法对外提供服务的?
写一个 暴露了端口的pod来试试
apiVersion: v1
kind: Pod
metadata:
name: pod-ports
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 81
protocol: TCP
我这里创建了一个名为pod-ports的pod,里面的容器只有一个nginx,然后我特意将端口设置为了81而不是80
创建好这个pod
此时查看当前的这个Pod的详细信息:
kubectl describe pod pod-ports -n test
此时pod的ip地址是100.97.125.12,然后nginx容器对外暴露的端口是81,访问100.97.125.12:81来试试,我的想法是这个应该是不通的,因为nginx容器启动,内部默认端口应该是80,而你现在对外暴露的端口又是81,所以其实访问不到这个nginx才对,访问试试:
果然, 将这个修改为80端口,然后重新试试:
那么现在访问试试:
curl 100.97.125.13:80
确实看到了nginx,那么说明此时是Ok的
那么回过头去看看刚才的问题,如果这个容器的端口设置为80,表示的是将容器里面的80端口对外暴露,那么应该意味着这个nginx容器里面已经启动了一个nginx服务,且占用了80端口,所以来验证一下:
找到之前创建的这个pod
显然这个Pod在编写的时候,是没有配置对应的端口的,先查看一下详细信息:
确认完毕,此时pod的VIP是100.97.125.11,不是说Pod里面的网络是共享的吗?那岂不是我直接访问100.97.125.11就可以访问到nginx了?试试
curl 100.97.125.11
果然如此:
进入到这个nginx容器里面看看
kubectl exec -it pod-env -n test -c nginx /bin/sh
为了能使用curl,所以执行如下命令
apt update
apt install curl
安装完成后,执行一下命令
curl 127.0.0.1
果然,容器里面是启动了80端的nginx服务的
6、资源配额
编写一个为Pod设置资源配额的yaml文件,内容如下所示:
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: test
labels:
user: heima
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
resources:
limits:
cpu: "2"
memory: "10Gi"
requests:
cpu: "1"
memory: "10Mi"
运行这个pod
查看服务是启动成功了的,那么如果我现在想申请100G内存呢?显然我的服务器是不足的,所以删掉这个pod,修改为100G,然后重新启动看看效果:
提示内存不足!
更多推荐
所有评论(0)