k8s:实现一个pod两个容器

时间:2024-06-07 19:31:19

# 制作两个容器的镜像

通过以下Dockerfile创建一个镜像

cd /chz/install/docker
vim Dockerfile
<<<< 内容如下:
FROM centos

RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
RUN sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
RUN yum install -y epel-release
RUN yum install -y net-tools telnet wget vim nginx

RUN echo "alias ll='ls -al'" >> /etc/profile

RUN mkdir -p /install/java
RUN cd /install/java && wget https://download.java.net/java/GA/jdk22.0.1/c7ec1332f7bb44aeba2eb341ae18aca4/8/GPL/openjdk-22.0.1_linux-x64_bin.tar.gz
RUN cd /install/java && tar zxvf openjdk-22.0.1_linux-x64_bin.tar.gz
RUN echo 'export JAVA_HOME=/install/java/jdk-22.0.1' >> /etc/profile
RUN echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile

ENTRYPOINT ["nginx", "-g", "daemon off;"]
>>>>

创建镜像,注意这个镜像的【nginx】端口默认是【80】

docker build -t my-centos-nginx-80 .

上传镜像

docker tag my-centos-nginx-80 192.168.44.228:5000/my-centos-nginx-80
docker push 192.168.44.228:5000/my-centos-nginx-80

下面制作一个【nginx】端口为【8080】的镜像
先通过【192.168.44.228:5000/my-centos-nginx-80】镜像启动一个容器

docker run -p80:80 --rm --name=my-centos-nginx-80 192.168.44.228:5000/my-centos-nginx-80

注意上面的【–rm】参数很重要,没有这个参数可能会影响到后面pod的创建
连接上这个容器

docker exec -it my-centos-nginx-80 bash

修改容器里面的nginx的配置文件,将默认修改为【8080】

vim /etc/nginx/nginx.conf
<<<< 修改以下两行,将端口从【80】修改为【8080】
listen       8080 default_server;
listen       [::]:8080 default_server;
>>>>

不要关闭【80】端口的那个【docker run】进程,新开一个窗口,执行以下命令将该容器提交成一个新的镜像:

docker commit my-centos-nginx-80 my-centos-nginx-8080

上传镜像

docker tag my-centos-nginx-8080 192.168.44.228:5000/my-centos-nginx-8080
docker push 192.168.44.228:5000/my-centos-nginx-8080

# 部署k8s的deployment

生成deployment的yaml文件

cd /chz/install/k8s/oneDeployTwoPod
vim deploy.yaml
<<<< 内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-centos-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-centos
  template:
    metadata:
      labels:
        app: my-centos
    spec:
      containers:
      - name: my-centos-nginx-80
        image: 192.168.44.228:5000/my-centos-nginx-80        # 80端口的镜像
        ports:
        - containerPort: 80
          hostPort: 80
        volumeMounts:
        - name: my-centos-logs 
          mountPath: /chz_logs
      - name: my-centos-nginx-8080
        image: 192.168.44.228:5000/my-centos-nginx-8080      # 8080端口的镜像
        ports:
        - containerPort: 8080
          hostPort: 8080
        volumeMounts:
        - name: my-centos-logs 
          mountPath: /chz_logs
      volumes:
      - name: my-centos-logs
        emptyDir: {}
>>>>

部署deployment

kubectl apply -f deploy.yaml

查看这个pod的容器是否正常
执行【kubectl get pod】
在这里插入图片描述

执行【docker ps | grep -i my-centos-nginx】
在这里插入图片描述

有点奇怪,镜像显示都是【192.168.44.228:5000/my-centos-nginx-8080】,但后面的测试会显示两个容器是正常的,先不管它。

# 测试这两个容器

连接【my-centos-nginx-80】

docker exec -it cb398b2f85cf bash

执行

netstat -lnp

在这里插入图片描述

可以看到【8080】那个进程也在这里。可以用【curl http://localhost:80】和【curl http://localhost:8080】去测试他们,可以发现同一个pod下的多个容器网络是相通的。
进入目录【/】创建一个文件【80.log】

cd /
echo 1 >> 80.log

在这里插入图片描述

进入目录【/chz_logs】创建一个文件【80.log】

cd /chz_logs
echo 1 >> 80.log

在这里插入图片描述

下面进入【my-centos-nginx-8080】看能不能看到这两个文件:

cd /
ls -al

在这里插入图片描述

在【/】目录下没有【my-centos-nginx-80】容器里面创建的【/80.log】文件

cd /chz_logs
ls -al

在这里插入图片描述

在【/chz_logs】目录下可以看到【my-centos-nginx-80】容器里面创建的【/chz_logs/80.log】文件。
这是因为【/】目录是两个容器各自内部的目录,而【/chz_logs】目录两个容器都是通过【my-centos-logs】volume mount过来的(注意看yaml文件)

# 总结

当一个pod里面创建多个容器里面,多个容器的网络是相通的,但是存储是各自独立的。
但是通过将多个容器mount到同一个volume的方式可以让多个容器访问到同一个物理目录的文件。
我们可以利用这一点,让一个pod里面其中一个容器是主任务容器,产生日志文件到mount的目录里面。另一个容器是一个filebeat容器扫描主任务容器产生日志文件的目录(mount同一个volume),这样就可以采集pod里面的日志到elk里面了。