提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

环境准备
VM Ware 16.2.4 CentOS 7
下载链接: 通过网盘分享的文件:icecream-ebook-reader-pro.exe等4个文件 链接: https://pan.baidu.com/s/1szqZW-h00dATNQ1GKoXhow 提取码: miao
安装指南:https://blog.csdn.net/m0_66490812/article/details/137812550?
提示:以下是本篇文章正文内容,下面案例可供参考

一、虚拟机配置

虚拟机使用NET网络转换初始时是没有IP的
在终端中输入:

ifconfig

查看网卡的名称,一般都是ens开头:

[root@k-master1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:71ff:febc:dd7e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:71:bc:dd:7e  txqueuelen 0  (Ethernet)
        RX packets 12685  bytes 268450228 (256.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11538  bytes 43388952 (41.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.119.135  netmask 255.255.255.0  broadcast 192.168.119.255
        inet6 fe80::534c:75df:83db:8fe3  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:fd:83:89  txqueuelen 1000  (Ethernet)
        RX packets 412804  bytes 49912910 (47.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 736779  bytes 1141787837 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

进入网卡配置的目录里面 :

cd /etc/sysconfig/network-scripts/

vim编辑刚刚查看的网卡名称:

vim ifcfg-ens33

onboot属性修改为yes

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3430f760-91ca-45f5-8b2a-b4f56d386b8c
DEVICE=ens33
ONBOOT=yes

重启网络服务,需要等一下,两种重启方式(选择其中一个就好)

service network restart
systemctl restart network

完成了网络配置的初始化,接下来在VMware中拍摄快照
在这里插入图片描述
然后关闭这台虚拟机,右键点击管理,选择克隆
在这里插入图片描述
然后克隆出两个一样的虚拟机,名字分别命名为:K-Master、K-Node1、K-Node2

Master节点配置建议为2核4G,Node节点建议配置为1核2G

这样我们的虚拟机就配置好了

二、安装步骤

先用config确认好自己三台虚拟机的IP
e.g. 192.168.119.135(master)
192.168.119.136
192.168.119.137
对三个操作系统进行初始化操作

#关闭防火墙
systemctl stop fierwalld #临时关闭
systemctl disable fierwalld #永久关闭
#关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#关闭swap分区
swapoff -a #临时
sed -ri 's/.swap./#&/' /etc/fstab #永久

根据规划设置主机名

hostnamectl set-hostname k8s-master

节点执行

hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

在master添加hosts 只在master中执行

cat >> /etc/hosts << EOF
192.168.119.135 k8s-master
192.168.119.136 k8s-node1
192.168.119.137 k8s-node2
EOF

将桥接的 IPv4 流量传递到 iptables 的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效

时间同步

yum install ntpdate -y
ntpdate time.windows.com

替换阿里云YUM源

rm -rf /etc/yum.repos.d/*
curl https://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/CentOS-Base.repo

安装docker
在所有节点上安装并启动Docker。

#下载阿里云Yum软件源文件:
curl -o /etc/yum.repos.d/docker-ce.repo   https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装指定版本Docker:
yum install -y docker-ce
#配置镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://docker.ketches.cn","https://docker.1ms.run","https://hub1.nat.tf"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#启动并设置开机启动:
systemctl start docker && systemctl enable docker

从Kubernetes 1.24开始,使用Docker作为容器运行时,需要安装cri-dockerd。
CRI-Dockerd Release
找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:

rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm

安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:

vi /usr/lib/systemd/system/cri-docker.service
…
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
…
#启动并设置开机启动:
systemctl start cri-docker && systemctl enable cri-docker

安装kubeadm和kubelet
在所有节点上安装kubeadm、kubectl和kubelet组件。

#这些软件包未包含在系统默认软件源中,需要额外配置Yum软件源,例如配置阿里云的软件源:
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/repodata/repomd.xml.key
EOF
#安装指定版本kubeadm、kubectl和kubelet:
yum install -y kubeadm kubectl kubelet
#设置开机启动:
systemctl enable kubelet

部署Master节点
在Master节点执行以下命令初始化Kubernetes管理节点:

kubeadm init \
  --apiserver-advertise-address=192.168.119.135 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.28.2 \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all

初始化成功:

kubeadm join 192.168.119.135:6443 --token lu2d05.fp2vfdxre0cjwoeh \
--discovery-token-ca-cert-hash sha256:03237a5eda7decbe8b08014fa375175145eeed44aee4c0eaff39bb9f54ae1f37\
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all

根据上述提示,执行以下命令开始使用集群:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

部署Node节点
在两台工作节点执行上述返回的“kubeadm init”命令,并添加“–cri-socket”参数,以将这些工作节点加入到集群中:

kubeadm join 192.168.119.135:6443 --token lu2d05.fp2vfdxre0cjwoeh \
--discovery-token-ca-cert-hash sha256:03237a5eda7decbe8b08014fa375175145eeed44aee4c0eaff39bb9f54ae1f37\
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all

可以在
Master节点执行“kubectl get nodes”命令查看节点,结果如下:

[root@localhost ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k-master1 NotReady control-plane 10m v1.28.2
k-node1 NotReady 22s v1.28.2
k-node2 NotReady 13s v1.28.2

在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。
Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等
这里选择Flannel作为网络插件
直接远程下载并安装

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
#会出现以下提示:
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

此时再次执行kubectl get nodes

[root@localhost ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k-master1 Ready control-plane 15m v1.28.2
k-node1 Ready 4m59s v1.28.2
k-node2 Ready 4m50s v1.28.2

这样,就初始化成功了!

三、部署Dashboard

直接下载yaml文件部署

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
#输出以下内容:
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

查看运行状态:

[root@localhost ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5657497c4c-njxgl 1/1 Running 0 45s
kubernetes-dashboard-78f87ddfc-b466s 1/1 Running 0 45s

创建管理员服务账号

kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard

绑定集群管理员角色

kubectl create clusterrolebinding dashboard-admin-binding \
  --clusterrole=cluster-admin \
  --serviceaccount=kubernetes-dashboard:dashboard-admin

获取访问令牌(Token)

kubectl create token dashboard-admin -n kubernetes-dashboard
[root@localhost ~]# kubectl create token dashboard-admin -n kubernetes-dashboard
eyJhbGciOiJSUzI1NiIsImtpZCI6IjRwb1VZR1ctd2RGcktYYWlzSldMNDVZdWw0Um95RWNNcnpKTjgxSnlyWGMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzU4MDcyNzE5LCJpYXQiOjE3NTgwNjkxMTksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkYXNoYm9hcmQtYWRtaW4iLCJ1aWQiOiI4ZDRjMmFiZS0zYTVkLTQ3YzAtOTg0Yi00M2YxODk3YmVkYTEifX0sIm5iZiI6MTc1ODA2OTExOSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.t7kBuZePIiqWY0lBnZMgCEsJ3nVwHDxhOMn8Xm-jDf4gAbCKJXbb1lBhweKVPsxGPWbVM079MY-S9v6NoYTYIii939xv9-2iLjCvQAHbQy2ubbTzpw6bkCBsOf3uu-16C9JUKXf_YJsCSm7foSUpv_VVsukZA04-SYkyyGR_1zS0a-s1TESPwSS7O97zmHu_1XCYefl_IaATxB7Tjv1ui5o1QYK0L5brrE3hR1R5PJ3yp_Tg-0elckhFX7ErFexnZQsFfUzlBoAJ0M80I4zvG10o0-uYmVFD0pUCYUzYrhKKC6D0yifyi01oEcwGqEtWL3lOUyH9CVLGnsZnM6JMeg

访问 Dashboard
方法 1:使用 kubectl 端口转发(推荐)

kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443

然后在本地浏览器访问:https://localhost:8443
方法 2:通过 NodePort 访问(适用于远程访问)
如果需要从外部访问,可以修改 Service 类型为 NodePort:

kubectl patch service kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
# 查看分配的端口
kubectl get service kubernetes-dashboard -n kubernetes-dashboard

然后通过https://<节点IP>:访问。

登录 Dashboard
在登录页面选择 “Token” 选项,粘贴之前获取的令牌,点击 “登录” 即可进入 Dashboard 界面。

Dashboard 提供了直观的 Web 界面,可以查看集群状态、部署应用、管理资源等操作。

如果遇到访问问题,可以检查网络策略和防火墙设置,确保访问端口(如 8443)已开放。

四、部署简单测试应用WordPress

前提条件
已运行的 Kubernetes 集群(控制平面和节点正常工作)
kubectl命令行工具已配置并能连接集群
集群已安装网络插件(如 Flannel、Calico 等)

1:创建持久化存储(PVC)

WordPress 和数据库需要持久化存储来保存数据(文章、配置、数据库文件等),避免 Pod 重启后数据丢失。
创建wm-pvc.yaml文件

# WordPress数据存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
spec:
  accessModes:
    - ReadWriteOnce  # 单节点读写
  resources:
    requests:
      storage: 10Gi  # 申请10GB存储空间
---
# MySQL数据库存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi  # 数据库5GB存储空间

PVC 需要绑定PV或配置自动创建 PV 的 StorageClass。
手动创建一个 PV 并与 PVC 绑定:
创建 wm-pv.yaml 文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: wordpress-manual-pv  # 用于WordPress的PV
spec:
  capacity:
    storage: 10Gi  # 容量需 >= PVC请求的10Gi
  accessModes:
    - ReadWriteOnce  # 访问模式需与PVC一致
  hostPath:
    path: /data/wordpress-pv  # 节点上的实际存储路径(需提前创建)
    type: DirectoryOrCreate  # 若路径不存在则自动创建
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-manual-pv  # 用于MySQL的PV
spec:
  capacity:
    storage: 5Gi  # 容量需 >= PVC请求的5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/mysql-pv
    type: DirectoryOrCreate

应用PV配置并创建PVC

kubectl apply -f wm-pv.yaml
kubectl apply -f wm-pvc.yaml
#查看PVC状态
kubectl get pvc
[root@localhost ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound mysql-manual-pv 5Gi RWO 36s
wordpress-pvc Bound wordpress-manual-pv 10Gi RWO 36s

2:部署 MySQL 数据库(WordPress 依赖)

WordPress 需要数据库存储内容,这里使用 MySQL 作为数据库。
创建mysql-deployment.yaml文件(包含数据库部署、服务和密码管理)

# 存储数据库密码(避免明文)
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secrets
type: Opaque
data:
  # 密码需用base64编码(生成方式:echo -n "你的密码" | base64)
  root-password: cm9vdHBhc3N3b3Jk  # 示例:rootpassword
  wp-password: d29yZHByZXNzMTIz   # 示例:wordpress123
---
# MySQL部署
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0  # 官方MySQL镜像
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: root-password
        - name: MYSQL_DATABASE
          value: wordpress  # 预先创建WordPress数据库
        - name: MYSQL_USER
          value: wpuser     # WordPress专用数据库用户
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: wp-password
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql  # 挂载存储卷
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-pvc  # 关联步骤1创建的PVC
---
# MySQL服务(集群内访问)
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
  clusterIP: None  # 无头服务,通过服务名访问

应用配置:

kubectl apply -f mysql-deployment.yaml
#检查 MySQL 部署状态(确保 Pod 为Running)
kubectl get pods -l app=mysql

3:部署 WordPress 应用

创建wordpress-deployment.yaml文件,配置 WordPress 部署和服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1  # 可根据需求调整副本数
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:latest  # 官方WordPress镜像(内置PHP和Apache)
        ports:
        - containerPort: 80  # 暴露80端口(Apache)
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql-service  # 连接步骤2的MySQL服务
        - name: WORDPRESS_DB_USER
          value: wpuser        # 对应MySQL的用户
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: wp-password  # 从Secret读取密码
        - name: WORDPRESS_DB_NAME
          value: wordpress     # 对应MySQL的数据库名
        volumeMounts:
        - name: wordpress-data
          mountPath: /var/www/html  # 挂载存储卷(保存WordPress数据)
      volumes:
      - name: wordpress-data
        persistentVolumeClaim:
          claimName: wordpress-pvc  # 关联步骤1创建的PVC
---
# WordPress服务(外部访问)
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  selector:
    app: wordpress
  ports:
  - port: 80
    targetPort: 80
  type: NodePort  # 暴露到节点端口(适合测试)
  # 生产环境建议用LoadBalancer或Ingress

应用配置:

kubectl apply -f wordpress-deployment.yaml
#检查 WordPress 部署状态:
kubectl get pods -l app=wordpress

4:访问 WordPress

查看 WordPress 服务的节点端口(NodePort):

kubectl get svc wordpress-service
[root@localhost ~]# kubectl get pods -l app=wordpress
NAME READY STATUS RESTARTS AGE
wordpress-5556b5cd67-57z2w 1/1 Running 0 72s

通过节点 IP 和端口访问:
在浏览器中输入 http://<集群节点IP>:(例如 http://192.168.56.10:31234)。
首次访问将进入 WordPress 安装界面,设置管理员账号和网站信息即可。


总结

一步步部署自己的Kubernetes集群,并且部署了两个简单的Web应用。
缺少错误处理,将会在下一篇内容详细讲解。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐