前言:
本文章是从虚拟机无minikube环境开始搭建,如果已有minikube环境或者只是搭建过程中遇到问题可自行跳过前面内容,找到所需章节内容
目的:
使用Kubernetes搭建WordPress网站,并使用 Dashboard 管理 Kubernetes
基本思想:
-
将MariaDB和WordPress两个应用封装成Pod,运行所需环境也写成ConfigMap,统一用“声明式”来管理
-
在Kubernetes集群内部维护一个自己的专用网络,要让这个网络与外界隔离,要使用特殊的“端口转发”方式来传递数据
-
还需要在集群之外反向代理这个地址,这样才能实现内外沟通,但对比Docker的直接端口映射,略显麻烦
基本步骤:
实验前的准备:
1. 检查当前虚拟机版本号:
QG12315@Qing:~$ cat /etc/os-release
QG12315@Qing:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="``https://help.ubuntu.com/``"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/
PRIVACY_POLICY_URL="``https://www.ubuntu.com/legal/terms-and-policies/privacy-policy``"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
显然,实验当前使用的虚拟机:Ubuntu 24.04.2
2. 当前虚拟机处于安装了Docker,但并未部署minikube和Kubernetes
QG12315@Qing:~$ docker --version
Docker version 26.1.3, build 26.1.3-0ubuntu1~24.04.1
QG12315@Qing:~$ minikube --version
Command 'minikube' not found, did you mean:
command 'minitube' from deb minitube (3.9.3-2)
Try: sudo apt install <deb name>
虚拟机环境为当时我做实验,用Docker搭建WordPress网站
3. 准备工作开始
3.1 查看文件daemon.json文件
添加加速器,防止在pull镜像时出错
{
"registry-mirrors": [
"https://docker.888666222.xyz",
"https://docker.1panel.live",
"https://xdcm2qvr.mirror.aliyuncs.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn"
],
"dns": ["8.8.8.8", "114.114.114.114"],
"dns-opts": ["use-vc"],
"ipv6": false
}
重启配置文件生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
3.2 搭建Kubernetes环境
3.2.1 下载minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube /usr/local/bin/
3.2.2 下载成功,验证是否安装成功
minikube version
3.2.3 安装Kubectl
minikube Kubectl
3.2.4 验证minikube环境
启动命令:
minikube start --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.28' --kubernetes-version=v1.23.3
简化启动:
为了防止以后启动都不必输入上述一连串命令,只要输入minikube start即可,因此修改本地启动配置文件
使用vim 找到配置文件所在位置修改 ~/.minikube/config/config.json
修改内容
{
"image-mirror-country": "cn",
"image-repository": "``registry.cn-hangzhou.aliyuncs.com/google_containers``",
"base-image": "``registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.28``",
"kubernetes-version": "v1.23.3"
}
验证内容是否正确: minikube config view
如果输出:
则是修改成功
验证是否安装成功:
查看状态:
minikube status
minikube node list
查看kubectl版本:minikube kubectl -- version
3.2.5 简化输入(可选)
使每次使用kubectl,不用使用minikube的前缀
设置kubectl 别名
#临时版:
alias kubectl="minikube kubectl --"
#永久版:
echo 'alias kubectl="minikube kubectl --"' >> ~/.bashrc
source ~/.bashrc
开启kubectl自动补全:
查询bash-completion是否安装:type _init_completion
有:_init_completion is a function
无:bash: type: _init_completion: not found
(没有则下载)安装bash-completion:sudo apt-get install bash-completion
添加脚本到配置文件中:
echo 'source <(minikube kubectl -- completion bash)' >> ~/.bashrc
配置文件生效:source ~/.bashrc
3.2.6 检查当前minikube内部是否同步了daemon.json加速文件
#进入minikube的docker中:minikube ssh
查看配置文件是否正确:cat /etc/docker/daemon.json
修改配置文件内容:sudo vim /etc/docker/daemon.json(内容是上文中配置的加速器内容)
重启配置文件生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
测试:docker pull
拉取一个远程镜像看看配置的加速器或者国内镜像是否正确
实验开始:
1. 第一步:编排MariaDB对象
准备好maria-pod.yaml文件
#使用ConfigMap定义一个maria-cm对象
apiVersion: v1
kind: ConfigMap
metadata:
name: maria-cm
data:
DATABASE: 'db'
USER: 'wp'
PASSWORD: '123'
ROOT_PASSWORD: '123'
---
#定义Pod对象,配置信息注入Pod,让MariaDB运行时,读取这些信息
apiVersion: v1
kind: Pod
metadata:
name: maria-pod
labels:
app: wordpress
role: database
spec:
containers:
- image: mariadb:10
name: maria
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
envFrom:
- prefix: 'MARIADB_'
configMapRef:
name: maria-cm
实行部署:kubectl apply -y maria-pod.yaml
查看当前状态并获取IP地址:
kubectl get pod -o wide
记住这个172.17.0.3,需要填在wp-pod.yaml对应位置
2. 第二步:编排WordPress对象
准备好wp-pod.yaml文件
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-cm
data:
HOST: '172.17.0.2' #上面`maria-pod.yaml`生成的IP填入
USER: 'wp'
PASSWORD: '123'
NAME: 'db'
---
apiVersion: v1
kind: Pod
metadata:
name: wp-pod
labels:
app: wordpress
role: website
spec:
containers:
- image: wordpress:5
name: wp-pod
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
envFrom:
- prefix: 'WORDPRESS_DB_'
configMapRef:
name: wp-cm
实行部署:kubectl apply -y wp-pod.yaml
查看当前状态并获取IP地址:kubectl get pod -o wide
3. 第三步:WordPress对象 Pod映射端口号,让它在集群外可见
把本地8080映射到WordPress Podd的80:kubectl port-forward wp-pod 8080:80 &
4. 第四步:创建反向代理Nginx,让网站对外提供服务
创建Nginx代理文件:
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}
启动dockernginx容器代理进行反向代理:
docker run -d --rm \
--net=host \
-v /tmp/proxy.conf:/etc/nginx/conf.d/default.conf \
nginx:alpine
5. 查看登录情况:
输入虚拟机远程登录IP地址
查看日志:kubectl logs
6. 使用 Dashboard 管理 Kubernetes
查看插件列表:minikube addons list
启用dashboard插件:minikube addons enable dashboard
访问Dashboard:
自动:minikube dashboard
手动:minikube service kubernetes-dashboard --url -n kubernetes-dashboard
可能出错点:
1. docker pull不上镜像;
-
配置加速文件
-
pull国内镜像
一定要重启,加速文件才能生效
2. 使用minikube官网命令下载
- 官网的下载命令下载不下来
官方:curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
使用我给出的国内镜像即可
3. 启动minikube失败
例如:minikube start --kubernetes-version=v1.23.3,命令没问题,有问题的是自己的网络,建议使用国内镜像,使用我给出的阿里云镜像即可
4. kubecrl创建不了Pod
解决方法
-
检查minikube docker内部的daemon.json文件,如果没同步,手动配置一下文件内容即可
-
Pod拉取镜像可能慢,可以直接在minikube docker内部docker pulll出YMAL文件内所需的镜像
镜像文件大 用YAML文件创建可能速度过慢
- 本地docker有YAML文件中提及的镜像:
如果本地有mariadb:10/wordpress:5,但是就是拉取不上,也可以试试把本地的镜像打包,下面是具体步骤
docker save mariadb:10 > mariadb_10.tar
docekr save wordpress:5 > wordpress_5.tar
minikube image load mariadb_10.tar
kubectl delete pod maria-pod#如果部署了,删除即可
vim maria-pod.yaml改成imagePullPolicy: Never
kubectl apply -f maria-pod.yaml 重新应用
5. Nginx配置文件/反向代理问题:
docker run -d --rm \
--net=host \
-v /tmp/proxy.conf:/etc/nginx/conf.d/default.conf \
nginx:alpine
在-v pwd/proxy.conf上改到自己代理文件名字和地址
配置127.0.0.1有问题可换: http://host.docker.internal:8080
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://host.docker.internal:8080;
}
}
挂载命令也可换:
docker run -d --rm -p 80:80 -v `tmp`/proxy.conf:/etc/nginx/conf.d/default.conf nginx:alpine