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,然后重新启动看看效果:
在这里插入图片描述
提示内存不足!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐