k8s-pod资源对象实验

实验要求:

1、基于alpine制作nginx、mysql、dns、redis镜像

2、通过k8s实现以上中间件的单pod部署

3、最后测试对应pod的可行性

实验环境:

192.168.110.128(master)

192.168.110.129(node1)

192.168.110.130(node2)

一、基于Alpine制作镜像(master执行)

①制作 Nginx 镜像

Dockerfile (nginx-alpine/Dockerfile)

复制代码
 FROM alpine:3.19
 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
     apk add --no-cache nginx && \
     mkdir -p /run/nginx /usr/share/nginx/html && \
     echo "<h1>Nginx on K8s</h1>" > /usr/share/nginx/html/index.html
 EXPOSE 80
 CMD ["nginx", "-g", "daemon off;"]

构建命令

复制代码
 docker build -t my-nginx:alpine ./nginx-alpine

②制作 MySQL 镜像

Dockerfile (mysql-alpine/Dockerfile)

复制代码
 FROM alpine:3.19
 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
     apk add --no-cache mariadb mariadb-client && \
     mariadb-install-db --user=mysql --datadir=/var/lib/mysql && \
     mkdir -p /run/mariadb /run/mysqld && \
     chown -R mysql:mysql /var/lib/mysql /run/mariadb /run/mysqld
 EXPOSE 3306
 CMD ["mariadbd", "--user=mysql"]

构建命令

复制代码
docker build -t my-mysql:alpine ./mysql-alpine

③制作 DNS 镜像

Dockerfile (dns-alpine/Dockerfile)

复制代码
FROM alpine:3.19
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
     apk add --no-cache dnsmasq
EXPOSE 53 53/udp
CMD ["dnsmasq", "-k", "--no-daemon"]

构建命令

复制代码
docker build -t my-dns:alpine ./dns-alpine

④制作 Redis 镜像

Dockerfile (redis-alpine/Dockerfile)

复制代码
 FROM alpine:3.19
 RUN apk add --no-cache redis
 EXPOSE 6379
 CMD ["redis-server", "--protected-mode", "no"]

构建命令

复制代码
docker build -t my-redis:alpine ./redis-alpine

二、将master主机上创建的镜像通过scp传输到node1和node2上

①将镜像打包成一个 tar 文件

将镜像打包成一个 tar 文件
复制代码
 
复制代码
docker save my-nginx:alpine my-mysql:alpine my-dns:alpine my-redis:alpine -o all-images.tar

②将 tar 文件传输到 node1 和 node2

复制代码
 scp all-images.tar root@192.168.110.129:/root/
 scp all-images.tar root@192.168.110.130:/root/

③在node1和node2上分别执行此命令

复制代码
 docker load -i /root/all-images.tar

④验证导入是否成功

在 node1/node2 上执行:

复制代码
 docker images | grep my-

应该能看到与 master 完全相同的镜像名称和标签。

三、K8s 单 Pod 部署(在 master 节点执行)

1. Nginx Pod

nginx-pod.yaml

复制代码
 apiVersion: v1
 kind: Pod
 metadata:
   name: nginx-pod
   labels:
     app: nginx
 spec:
   containers:
   - name: nginx
     image: my-nginx:alpine
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 80

部署:

复制代码
kubectl apply -f nginx-pod.yaml

2. MySQL Pod

mysql-pod.yaml

复制代码
 apiVersion: v1
 kind: Pod
 metadata:
   name: mysql-pod
   labels:
     app: mysql
 spec:
   containers:
   - name: mysql
     image: my-mysql:alpine
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 3306
     env:
     - name: MYSQL_ROOT_PASSWORD
       value: "123456"   # 实际应使用 Secret

部署:

复制代码
kubectl apply -f mysql-pod.yaml

3. DNS Pod

dns-pod.yaml

复制代码
apiVersion: v1
 kind: Pod
 metadata:
   name: dns-pod
   labels:
     app: dns
 spec:
   containers:
   - name: dns
     image: my-dns:alpine
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 53
       protocol: UDP
     - containerPort: 53
       protocol: TCP

部署:

复制代码
 kubectl apply -f dns-pod.yaml

4. Redis Pod

redis-pod.yaml

复制代码
apiVersion: v1
 kind: Pod
 metadata:
   name: redis-pod
   labels:
     app: redis
 spec:
   containers:
   - name: redis
     image: my-redis:alpine
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 6379

部署:

复制代码
kubectl apply -f redis-pod.yaml

四、测试 Pod 可行性(在 master 节点执行)

1. 检查所有 Pod 状态

复制代码
 
复制代码
kubectl get pods -o wide

确保所有 Pod 均为 Running 状态。

2. 测试 Nginx

复制代码
 # 使用端口转发临时暴露到 master 节点 
 kubectl port-forward pod/nginx-pod 8080:80 & 
 curl http://localhost:8080

预期返回 Nginx 欢迎页或默认页面。

3. 测试 MySQL

复制代码
kubectl exec -it mysql-pod -- mysql -u root -p123456 -e "SHOW DATABASES;"

预期显示 information_schema, mysql, performance_schema 等。

4. 测试 DNS

进入 DNS Pod 并使用 dignslookup(需先安装):

复制代码
 kubectl exec -it dns-pod -- sh
 # 在容器内
 apk add bind-tools   # 临时安装 dig
 dig @localhost www.baidu.com

或从集群内另一个临时 Pod 解析:

复制代码
 kubectl run test --rm -it --image=alpine:3.19 -- sh
 # 在 test pod 内
 apk add bind-tools
 dig @dns-pod.default.svc.cluster.local google.com

若能正常解析,则 DNS 服务正常。

5. 测试 Redis
复制代码
 kubectl exec -it redis-pod -- redis-cli SET foo bar
 kubectl exec -it redis-pod -- redis-cli GET foo

预期返回 bar

相关推荐
潘正翔19 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
阿里云云原生1 天前
从 ReAct 到 Harness:AgentScope 2.0 如何用“工程化”定义分布式智能体开发范式?
云原生·agent
刘马想放假1 天前
Docker 从入门到进阶:一篇写给工程师的系统化实战指南
运维·docker·容器
zjun30211 天前
如何搭建TRAE IDE 连接到容器开发环境
docker·容器·ascend·trae
寒冰碧海1 天前
大模型部署从0到1(一):通用环境全流程准备|NVIDIA驱动+Docker+NVIDIA Container Toolkit
运维·docker·容器
hj2862511 天前
K8S 核心组件与资源概念 + 带注释命令 + 实操案例版笔记
笔记·容器·kubernetes
nece0011 天前
Kubernetes v1.36.0 + Ubuntu24.04 + containerd 2.x WordPress 完整部署文档
云原生·容器·kubernetes
江畔柳前堤1 天前
Go13-企业级项目实战
开发语言·人工智能·后端·云原生·golang
你想考研啊1 天前
七、Docker 容器 + Docker Compose单机部署理发店系统
docker·容器·composer