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

相关推荐
木雷坞2 小时前
Physical AI 数据工厂怎么落地?先把 CUDA、K8s、Quay 镜像拉取稳定下来
人工智能·容器·kubernetes
剩下了什么3 小时前
docker-compose up -d --build 和 docker-compose up -d 和 docker-compose build 区别
docker·容器·eureka
两点王爷4 小时前
使用命令行备份/还原docker运行的数据库 (MySQL、PostgreSQL)
mysql·docker·容器
张青贤4 小时前
Docker Remote 未授权访问漏洞修复方法
运维·docker·容器
TE-茶叶蛋4 小时前
微服务下 DTO 设计核心原则
微服务·云原生·架构
小夏子_riotous4 小时前
Docker学习路径——10、Docker Compose 一站式编排:从入门到生产级部署
linux·运维·服务器·docker·容器·centos·云计算
smallcelebration5 小时前
132 docker入门学习
学习·docker·容器
A-刘晨阳5 小时前
K8s 之 Ingress 及 Ingress Controller
云原生·容器·kubernetes·负载均衡·ingress
hiwb5 小时前
Docker 安装 MySQL,DBeaver 连接 MySQL
mysql·docker·容器