实验要求:
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 并使用 dig 或 nslookup(需先安装):
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。